python连接redis哨兵集群

本文介绍了一种使用Python连接Redis哨兵集群的方法,详细解释了如何通过哨兵获取主从数据库连接实例,并提供了多种数据读写操作的实现,包括哈希操作、管道操作、带过期时间的设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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哨兵集群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值