python连接redis哨兵集群

SENTINEADDRESS = [(‘ip1’, 26379), (‘ip2’, 26378), (‘ip3’, 26377)]
上面的内容,请根据自己的环境进行修改

import redis
from redis import WatchError
from redis.sentinel import Sentinel
from redis import WatchError

MYSETINEL = None
MASTER = None
SLAVE = None


SENTINEADDRESS = [('ip1', 26379), ('ip2', 26378), ('ip3', 26377)]

# 选择要连接的数据库,默认是连接redis的 1 数据库 
def get_redis_conn(db=1):
    global MYSETINEL
    global MASTER
    global SLAVE
    # 如果哨兵连接实例已存在, 不重复连接, 当连接失效时, 重新连接
    if not MYSETINEL:  # 连接哨兵
        MYSETINEL = Sentinel(SENTINEADDRESS)
        # 通过哨兵获取主数据库连接实例      参数1: 主数据库的名字(集群部署时在配置文件里指明)
        MASTER = MYSETINEL.master_for('mymaster', db=db)
        # 通过哨兵获取从数据库连接实例    参数1: 从数据的名字(集群部署时在配置文件里指明)
        SLAVE = MYSETINEL.slave_for('mymaster', db=db)


# 每次都先尝试生成连接实例
get_redis_conn()


# 使用哈希,往 主数据库 追加写入
def hAppendValue(name, key, value):
    global MASTER
    if MASTER:
        if MASTER.hexists(name, key):
            MASTER.hset(name, key, hGet(name, key) + value)
        else:
            MASTER.hset(name, key, value)
    else:
        return False


# 往 主数据库 追加写入
def appendValue(key, value):
    global MASTER
    if MASTER:
        if MASTER.exists(key):
            MASTER.append(key, value)
        else:
            MASTER.set(key, value)
    else:
        return False


# 往 主数据库 写入带有过期时间的数据
def setWithExpiresTime(key, value, expiresTime):
    global MASTER
    if MASTER:
        return MASTER.setex(key, expiresTime, value)
    else:
        return False


# 往 主数据库 写入的数据
def set(key, value):
    global MASTER
    if MASTER:
        return MASTER.set(key, value)
    else:
        return False


# 使用哈希, 往 主数据库 写入的数据
def hSet(name, key, value):
    global MASTER
    if MASTER:
        return MASTER.hset(name, key, value)
    else:
        return False


# 使用管道,哈希 往 主数据库 写入的数据
def hSetWithPipeLine(name, key, value):
    global MASTER
    if MASTER:
        with MASTER.pipeline() as pipe:
            pipe.hset(name, key, value)
            result = pipe.execute()
            return True, result
    else:
        return False


# 通过 主数据库 删除数据
def delete(key):
    global MASTER
    if MASTER:
        return MASTER.delete(key)
    else:
        return False


# 使用哈希, 通过 主数据库 删除数据
def hDelete(name, key):
    global MASTER
    if MASTER:
        return MASTER.hdel(name, key)
    else:
        return False


# 使用正则表达式,通过 主数据库 批量删除数据
def deleteWithPatten(Patten):
    global MASTER
    if MASTER:
        return MASTER.delete(*MASTER.keys(Patten))
    else:
        return False


# 清空所有数据
def flushDB():
    global MASTER
    if MASTER:
        return MASTER.flushdb()
    else:
        return False


# 通过 从数据库 读取数据
def get(key):
    global MASTER
    global SLAVE
    if SLAVE:
        result = SLAVE.get(key)
        return result.decode('UTF-8') if (str(type(result)) == "<class 'bytes'>" and len(result) > 0) else result
    else:
        if MASTER:
            result = MASTER.get(key)
            return result.decode('UTF-8') if (str(type(result)) == "<class 'bytes'>" and len(result) > 0) else result
        else:
            return False


# 使用哈希, 通过 从数据库 读取数据
def hGet(name, key):
    global MASTER
    global SLAVE
    if SLAVE:
        result = SLAVE.hget(name, key)
        return result.decode('UTF-8') if (str(type(result)) == "<class 'bytes'>" and len(result) > 0) else result
    else:
        if MASTER:
            result = MASTER.hget(name, key)
            return result.decode('UTF-8') if (str(type(result)) == "<class 'bytes'>" and len(result) > 0) else result
        else:
            return False


# 在并发,数据可能冲突的情况下,修改value
def alter(key, value):
    global MASTER
    with MASTER.pipeline() as pipe:
        i = 0
        while i < 10:  # 尝试修改库存10次
            try:
                # watch库存键, multi后如果该key被其他客户端改变, 事务操作会抛出WatchError异常
                pipe.watch(key)
                pipe.set(key, value)  # 保存剩余库存
                # 事务结束, 把命令推送过去
                result = pipe.execute()  # execute返回命令执行结果列表,
                return True, result
            except WatchError as e:
                print(e)
                i += 1
                continue
            finally:
                pipe.reset()

#
# get_redis_conn()
# hSetWithPipeLine("test", "kzx11132", ":sad")
#
# print(hGet("test", "kzx11132"))

参考文章:python连接redis哨兵集群

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python连接Redis集群,可以使用第三方库redis-py-cluster。这个库是专门为了支持Redis集群操作而设计的,并且一直在维护。你可以使用pip进行安装,命令是pip3 install redis-py-cluster。 以下是一个示例代码,展示了如何使用redis-py-cluster连接Redis集群: ``` from rediscluster import StrictRedisCluster # 连接redis集群 class RedisCluster(object): def __init__(self,conn_list): self.conn_list = conn_list def connect(self): try: # 非密码连接redis集群 # redisconn = StrictRedisCluster(startup_nodes=self.conn_list) # 使用密码连接redis集群 redisconn = StrictRedisCluster(startup_nodes=self.conn_list, password='123456') return redisconn except Exception as e: print(e) print("错误,连接redis集群失败") return False # Redis集群连接列表 redis_basis_conn = [{'host': '192.168.10.168', 'port': 7201}, {'host': '192.168.10.169', 'port': 7201}, {'host': '192.168.10.170', 'port': 7201}, {'host': '192.168.10.171', 'port': 7201}, {'host': '192.168.10.142', 'port': 7201}, {'host': '192.168.10.143', 'port': 7201}] # 连接Redis集群 res = RedisCluster(redis_basis_conn).connect() # 检查连接结果 if not res: print("连接Redis集群失败") else: print("连接Redis集群成功") ``` 使用redis-py-cluster库,你可以通过传入连接列表中的所有节点信息来连接Redis集群。在上述示例代码中,我们使用了一个名为RedisCluster的类来进行连接,并在初始化方法中传入了连接列表。然后,在connect方法中,我们尝试连接Redis集群,如果连接成功,返回一个Redis连接对象,否则返回False表示连接失败。最后,我们根据连接的结果输出相应的提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值