直接上**
1public
class
redisshop 89
@autowired
10private
productservice productservice;
11@autowired
12private
stringredistemplate stringredistemplate;
13@autowired
14private
zookeeper zookeeper;
1516
/**17
* 將資料新增至redis快取
18*/
19public
void
init()
2728}29
30public
string soleproduct(long productid)
3738
//優化2:將redis快取中的資料-1,並返回減1後的值
39 long stock = stringredistemplate.opsforvalue().decrement(product_stock_key +productid);
40if (stock < 0)
5556
return "商品已售完";57}
5859
try catch
(exception ex)
7475
//優化4:修改zk的商品售完標記為false
76if (zookeeper.exists(zksoldproductpath, ture) != null
) 79
80return "創單失敗";81}
8283
return "";
8485 }
優化一共分為四個方面:
1.資料庫優化:對庫存的資料庫操作,直接在sql中進行-1,mysql資料庫自帶樂觀鎖。(缺點:併發在500-1000左右,最大併發連線數是16384。)
2.redis快取:將要對資料庫操作的資料放入redis快取中,先判斷快取中資料是否滿足,不行直接return,大大減少了資料庫壓力。(併發數能達到十萬左右,缺點:要考慮redis快取和mysql資料的一致性)
3.concorrecthashmap集合:執行緒同步的集合,庫存不足時向concorrecthashmap集合中新增乙個值,先檢查concorrecthashmap集合是否有值,再檢查stock。(解決了redis和mysql資料的一致性,缺點:jvm級別的執行緒同步,在多集群分布式服務中並不適用)
4.訊息中介軟體或zookeeper:庫存不足時向zookeeper中新增乙個值,客戶端進行監聽資料
秒殺 秒殺系統 優化之路
1 im系統,例如qq或者微博,每個人都讀自己的資料 好友列表 群列表 個人資訊 2 微博系統,每個人讀你關注的人的資料,乙個人讀多個人的資料 3 秒殺系統,庫存只有乙份,所有人會在集中的時間讀和寫這些資料,多個人讀乙個資料。例如 小公尺手機每週二的秒殺,可能手機只有1萬部,但瞬時進入的流量可能是幾...
秒殺系統防止庫存超賣
第一種 通過資料庫樂觀鎖實現 小型電商 update productstocks set realstock realstock where sku and realstock 0 根據受影響的行數判斷是否執行成功 大型網際網路不是這麼玩的 資料庫有瓶頸 第二種 使用redis 分布式鎖實現 var...
秒殺系統優化思路
一 秒殺業務為什麼這麼難做 秒殺系統,庫存只有乙份,所有人會在集中的時間讀和寫這些資料。例如 那我們怎麼優化秒殺業務呢?二 優化方向 以上的兩個場景要優化有兩個方向 三 常見秒殺架構 常見的秒殺架構基本是這樣的 四 各層優化細節 回顧一下我們12306剛出來那年搶票的場景,點選 查詢 按鈕之後,系統...