一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度python
二.python 链接 redis 哨兵集群redis
1. 安装redis包数据库
pip install redis
2.实现链接逻辑socket
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: 使用管道尝试修改商品库存spa
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()