1. 程式人生 > >秒殺---使用樂觀鎖實現或cache實現

秒殺---使用樂觀鎖實現或cache實現

概念

秒殺系統的特點

  • 新品上市 價格低廉
  • 市場造勢 大幅推廣
  • 指定時間開售
  • 瞬時售空
  • 讀多寫少

秒殺系統難點

  • 高併發、負載壓力大
  • 競爭資源是有限的
  • 對其他業務的影響
  • 提防“黃牛黨”

秒殺系統應用場景

  • 商品搶購
  • 群紅包
  • 優惠卷領取
  • 搶火車票
  • 線上預約

技術維度對秒殺系統的分析 —— 架構原則

這裡寫圖片描述

技術維度對秒殺系統的分析 —— 優化技術

這裡寫圖片描述

業務維度對秒殺系統的分析

這裡寫圖片描述
修改庫存放在訂單支付的前面位置 體現了企業的良心
秒殺沒搶到的話 訂單30分鐘未支付會取消訂單 釋放庫存 可以撿漏

核心業務基於DB的實現

場景描述
業務描述:有50臺蘋果7手機,模擬200個使用者同時請求購買,每個人都購買N臺手機
實現原理:基於資料庫的樂觀鎖

表t_goods_info
update t_goods_info set amout = amout - #{buys} where code = #{code} and amout - #{buys} >=0

優點:實現簡單, 最可靠
缺點: 併發量小 300 or 700

核心業務基於cache的實現(memcache)

場景描述
業務描述:有50臺蘋果7手機,模擬200個使用者同時請求購買,每個人都購買N臺手機
實現原理:基於快取的樂觀鎖 。基於memcache的decr,decr是原子的。

decr是有毒的
Decr的返回值有隻有三種情況,
“>0”“=0”(減數大於被減數) “=-1”(鍵值不存在)
10 – 100 =0(這裡有毒)
Memcached是不支援事務的
操作序列不是原子性的

解決
輕量級的鎖機制CAS機制
解釋:Check and set ,即儲存之前進行版本檢查,memcache 1.2.4新增的特性。

  • gets: 獲取item,並獲取版本號
  • cas:更新item,並上傳獲取item時的版本號,版本號與伺服器一致才能更新成功

演算法如下:
這裡寫圖片描述

核心程式碼:

@Override
public Boolean updateGoodsAmount(String code, int buys) {
    MemcachedItem item = client.gets(code);
    if(Integer.valueOf(item.getValue().
toString().trim()) < buys ){ return false; }else{ if(client.cas(code, String.valueOf(Integer.valueOf(item.getValue().toString().trim())-buys), item.casUnique)){ return true; }else{ return updateGoodsAmount(code,buys); } } }

Redis 與 memcached 的秒殺之爭

這裡寫圖片描述

相關推薦

---使用樂觀實現cache實現

概念 秒殺系統的特點 新品上市 價格低廉 市場造勢 大幅推廣 指定時間開售 瞬時售空 讀多寫少 秒殺系統難點 高併發、負載壓力大 競爭資源是有限的 對其他業務的影響 提防“黃牛黨”

樂觀的一種實現方式——CAS

www. 提升 中一 num 對象 用戶 ace 另一個 nbsp 原文出處: hollischuang (@Hollis_Chuang) 在深入理解樂觀鎖與悲觀鎖一文中我們介紹過鎖。本文在這篇文章的基礎上,深入分析一下樂觀鎖的實現機制,介紹什麽是CAS、CAS的應用以及C

Java並發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

RF -- 指針 locking water 更多 錯誤 創建 判斷 首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關系型數據庫裏邊就用到了很多這

系統的架構設計及實現

秒殺場景在電商平臺是十分常見的,這種營銷活動往往具有時間短,併發量大的特點。 關於資料庫效能 TPS:資料庫每秒執行的事務數。 QPS:資料庫每秒執行的SQL數。 對於msql資料庫,8核CPU16G記憶體通常TPS:1000 QPS:20000 系統邏輯梳理 使用者介面點選

電商 系統 設計思路和實現方法

1 秒殺業務分析 正常電子商務流程 (1)查詢商品;(2)建立訂單;(3)扣減庫存;(4)更新訂單;(5)付款;(6)賣家發貨 秒殺業務的特性 (1)低廉價格;(2)大幅推廣;(3)瞬時售空;(4)一般是定時上架;(5)時間短、瞬時併發量高; 2

【轉】Java併發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上

Java併發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

首先介紹一些樂觀鎖與悲觀鎖:   悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

二、高併發API之Dao層設計實現

一、Idea建立maven 1、File——-》new———》project 2、選擇maven 點選next! 3、輸出專案名,包(表示web專案,以後可以spingMVC連起來用) 點選next! 4、如下圖 maven倉庫可以選擇

三、高併發API之Service層設計實現

Dao層設計與實現———-》介面設計和sql編寫 實現程式碼和SQL的分離,方便Review,dao層也叫做資料訪問層,是對遠端儲存系統執行操作的過程,這些操作統一存放在Dao層。 而通過Dao層組成的邏輯則是由Service來完成。 一、秒殺Serv

樂觀的兩種實現方式

什麼場景下需要使用鎖? 在多節點部署或者多執行緒執行時,同一個時間可能有多個執行緒更新相同資料,產生衝突,這就是併發問題。這樣的情況下會出現以下問題: 更新丟失:一個事務更新資料後,被另一個更新資料的事務覆蓋。 髒讀:一個事務讀取另一個事物為提交的資料,即為髒讀。 其次還有

ASP.Net Core2.1 專案一步一步實現CI/CD系列一

前言:有一段時間沒寫部落格了,那是因為博主菜,需要學習和準備,這不帶來了本系列的文章。在這裡我把學習的心得分享出來,有些點理解的也不是太到位,希望大佬們能多多給點建議和指導。下半年就把這個系列的文章寫完,使用的技術暫時先不說,保持神祕感。哈哈哈   一、專案介紹 該專案整體上使用的是ASP.N

樂觀與悲觀

在資料庫的改查操作當中,多使用者的併發操作極有可能產生衝突。產生衝突的結果大概有兩種:更新覆蓋[0]和髒讀[1]。 應對方法便是對併發操作的控制。 最常用的策略是加鎖,鎖有兩種,一種叫悲觀鎖,另一種叫樂觀鎖。 悲觀鎖: 顧名思義,就是從悲觀的角度去

Redis分散式----樂觀實現,以系統為例

     摘要:本文使用redis來實現樂觀鎖,並以秒殺系統為例項來講解整個過程。 樂觀鎖       大多數是基於資料版本(version)的記錄機制實現的。即為資料增加一個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加一個”version”欄位來

Redis 分散式樂觀實現,以系統為例

樂觀鎖大多數是基於資料版本(version)的記錄機制實現的。即為資料增加一個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加一個”version”欄位來實現讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加1。此時,將提交資料的版本號與資料庫表對應

基於redis分布式實現

購物車 串行 and 本質 希望 ide stack 失敗 業務場景 最近在項目中遇到了類似“秒殺”的業務場景,在本篇博客中,我將用一個非常簡單的demo,闡述實現所謂“秒殺”的基本思路。 業務場景 所謂秒殺,從業務角度看,是短時間內多個用戶“爭搶”資源,這裏的資源在大部分

微信小程序----團購的批量倒計時實現

建立 int box height 操作 思路 ret 效果 .get 效果圖 實現思路微信小程序實現倒計時,可以將倒計時的時間進行每一秒的計算和渲染! JS模擬商品列表數據 goodsList;在 onLoad 周期函數中對活動結束時間進行提取;建立時間格式化函數 tim

Redis分散式 實現系統 SET命令實現

基於Redis命令:SET key valueNX EX max-lock-time   可適用於redis單機和redis叢集模式 1.SET命令是原子性操作,NX指令保證只要當key不存在時才會設定value 2.設定的value要有唯一性,來確保鎖不會被誤刪(

Redis分散式實現簡單功能

這版秒殺只是解決瞬間訪問過高伺服器壓力過大,請求速度變慢,大大消耗伺服器效能的問題。 主要就是在高併發秒殺的場景下,很多人訪問時並沒有拿到鎖,所以直接跳過了。這樣就處理了多執行緒併發問題的同時也保證了伺服器的效能的穩定。 接下來我們使用redis的分散式鎖來進行枷鎖處理: 我們可以在進入下單的方法後將核

基於redis叢集實現的分散式,可用於商品的庫存數量管理,有測試程式碼(何志雄)

轉載請標明出處。 在分散式系統中,經常會出現需要競爭同一資源的情況,本程式碼基於redis3.0.1+jedis2.7.1實現了分散式鎖。 可用於例如秒殺系統中的商品庫存的管理。付完整程式碼及測試用例。 package com.gaojiasoft.gaojiaRe

nodejs之簡單的系統實現(mysql、redis、kafka、zookeeper、postmandocker)

nodejs之簡單的秒殺系統實現(mysql、redis、kafka、zookeeper或docker) 一:環境 二:工具說明 三:程式碼實現 四:啟動專案 五:測試 一:環境 1.一臺阿里雲