python 連線 redis 哨兵叢集
阿新 • • 發佈:2022-02-25
一.redis叢集模式有多種, 哨兵模式只是其中的一種實現方式, 其原理請自行谷歌或者百度
二.python 連線 redis 哨兵叢集
1. 安裝redis包
pip install redis
2.實現連線邏輯
from redis.sentinel import Sentinel
from redis import WatchError
MYSETINEL = None MASTER = None SLAVE = None # 1.redis 哨兵模式叢集最少需要一主三從, 三哨兵 # 2.redis 哨兵叢集所有主從節點都完整的儲存了一份資料 SENTINEADDRESS = [('127.0.0.1', 6390), ('127.0.0.1', 6391), ('127.0.0.1', 6392)] def get_redis_conn(): global MYSETINEL global MASTER global SLAVE
# 如果哨兵連線例項已存在, 不重複連線, 當連線失效時, 重新連線 if not MYSETINEL:# 連線哨兵 MYSETINEL = Sentinel(SENTINEADDRESS, socket_timeout=2000) # 嘗試連線最長時間單位毫秒, 1000毫秒為1秒 # 通過哨兵獲取主資料庫連線例項 引數1: 主資料庫的名字(叢集部署時在配置檔案裡指明)MASTER = MYSETINEL.master_for('seckill', socket_timeout=2000) # 通過哨兵獲取從資料庫連線例項 引數1: 從資料的名字(叢集部署時在配置檔案裡指明) SLAVE = MYSETINEL.slave_for('seckill', socket_timeout=2000)
# 每次都先嚐試生成連線例項 get_redis_conn() # 往 主資料庫 寫入資料 def setcache(key, time, value): global MASTER if MASTER:return MASTER.setex(key, time, value) else: return False # 從 從資料庫 讀取資料 def getcache(key): global SLAVE if SLAVE: return SLAVE.get(key) else: return False
3. 使用示例1: 使用管道嘗試修改商品庫存
from redis import WatchError # 使用事物修改商品庫存 def update_stock(key): global MASTER with MASTER.pipeline() as pipe: i = 0 while i < 10: # 嘗試修改庫存10次 try: # watch庫存鍵, multi後如果該key被其他客戶端改變, 事務操作會丟擲WatchError異常 pipe.watch(key) count = int(pipe.get(key)) # 取庫存 # 可以修改庫存 if count > 0: pipe.set(key, count-1) # 儲存剩餘庫存 # 事務結束, 把命令推送過去 result = pipe.execute() # execute返回命令執行結果列表, return True, result # 庫存不足 else: pipe.unwatch() return False except WatchError as e: print(e) i += 1 continue finally: pipe.reset()