zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    如何使用Flannel搭建跨主机互联的容器网络
    移动端——touch事件
    Javascript 模块化指北
    vue重构--H5--canvas实现粒子时钟
    redux-saga框架使用详解及Demo教程
    前端代码编写规范
    探秘JS的异步单线程
    POJ 3714 Raid 近期对点题解
    EditText把回车键变成搜索
    Swift语言概览
  • 原文地址:https://www.cnblogs.com/lowmanisbusy/p/10991007.html
Copyright © 2011-2022 走看看