1. 程式人生 > 實用技巧 >分散式鎖 redis實現分散式鎖,分散式id生成方案,秒殺設計方案

分散式鎖 redis實現分散式鎖,分散式id生成方案,秒殺設計方案

分散式鎖

作用:不同系統上的不同程序,去搶一把鎖,誰搶到了,誰才能改資料

要求:高可用性,可衝入性(拿到鎖的節點掛了,得有超時過期機制)

實現方式:

基於資料庫實現分散式鎖;

基於快取(Redis等)實現分散式鎖;

基於Zookeeper實現分散式鎖;

redis實現分散式鎖

# 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:為了保證全域性唯一
    -分表,預設自增--》兩個庫上--》可能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中介軟體:請求放到佇列中,直接返回,告訴使用者,您正在排隊)

## 有些公司潛規則,秒殺超了無所謂,優惠券而已