python 连接 redis 哨兵集群

一.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()

复制代码

 

posted @   小学弟-  阅读(1390)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2018-02-25 Python面向对象之继承
2018-02-25 Python模块介绍
点击右上角即可分享
微信分享提示