分散式鎖 redis實現分散式鎖,分散式id生成方案,秒殺設計方案
阿新 • • 發佈:2020-12-10
分散式鎖
作用:不同系統上的不同程序,去搶一把鎖,誰搶到了,誰才能改資料
要求:高可用性,可衝入性(拿到鎖的節點掛了,得有超時過期機制)
實現方式:
基於資料庫實現分散式鎖;
基於快取(Redis等)實現分散式鎖;
基於Zookeeper實現分散式鎖;
# 1 分散式鎖: 鎖住不同機器上的不同程序 # 2 redis實現:官方提供了 https://github.com/SPSCommerce/redlock-py #Redlock pip install redlock-py 安裝,此為官方提供版 from redlock import Redlock dlm= Redlock([{"host": "localhost", "port": 6379, "db": 0}, ]) # 建立鎖管理器 # dlm = Redlock([{"host":"localhost",'port':6379,'db':0,'password':"admin123"},]) # 獲取鎖,my_resource_name是鎖的唯一識別符號。1000代表1000毫秒數,超過這個時間,鎖自動釋放(防機器宕機) my_lock = dlm.lock("my_resource_name",1000) # 自己的邏輯---》悲觀鎖---你的程式碼 print("xxx") #你寫的業務# 自己的邏輯---》悲觀鎖---你的程式碼 dlm.unlock(my_lock) # 把鎖釋放了 原理:https://www.cnblogs.com/liuqingzheng/p/11080501.html # 在4、分散式鎖的簡單實現程式碼中 # 也可以參考第三方庫 https://github.com/glasslion/redlock
# 分散式id:為了保證全域性唯一 -分表,預設自增--》兩個庫上--》可能id號重複 uuid:有沒有重複(資料量極大的情況下可能會重複,概率較低) # 設計思路: low版本的出來: -一個庫 1,3,5,7,9 -另一個庫2,4,6,8,10 分散式id生成方案-UUID:不是趨勢自增,效能挺高(5臺機器生成,一般不會重複) -mysql生成:效能低 機器都去mysql中要id -redis生成:很快,自增 ,必須還得有臺redis伺服器 incrby 16位: '當前時間戳+自增' -雪花演算法:python版雪花演算法 # 雪花演算法是64位二進位制數,第1位不用;41位是時間戳,可用69年;10位代表機器id(程序號),最大1024;12位表示4096個數字。雪花演算法同一毫秒內最多產生4096個id # python實現雪花演算法程式碼參考:https://www.cnblogs.com/oklizz/p/11865750.html
# 思路一: # 該方案適用於客戶提前充好錢了,不適合連支付寶支付方案 -某個時間段---》賣商品---》別賣超了---》mysql悲觀鎖實現---》缺陷,效能低 -100商品---》預熱---》100這個數,放到redis中----》incrby--》[來一個秒殺請求-1,在redis集合中把使用者id放進去](加鎖,使用分散式鎖或者使用pipline做),最後100這個數變成了0,---》起個非同步任務---》消費集合中的id,生成訂單,扣減庫存,扣減賬戶餘額,提前充錢了 -使用者真去看訂單的時候---》非同步任務完成了 # 思路二: -使用者發了秒殺請求---》前端看到--》您正在排隊 -請求來了---》放到佇列裡---》(djnago中介軟體:請求放到佇列中,直接返回,告訴使用者,您正在排隊)
## 有些公司潛規則,秒殺超了無所謂,優惠券而已