news 2026/4/3 6:12:21

Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南

Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南

面向生产环境的 Redis Python 工程化示例,涵盖:

  • 哨兵模式 & 集群模式自动切换
  • 常用数据结构(String / Hash / List / Set / ZSet)
  • 分布式锁(可重入 / 自动续期 / Lua)
  • 发布订阅(Pub/Sub)
  • 原子计数 / 限流 / 缓存模式
  • 健康检查、连接池、异常处理、最佳实践

一、技术选型说明

1. Python Redis 客户端

redis-py >= 5.x
  • 官方维护
  • 原生支持Sentinel
  • 原生支持Redis Cluster
  • 支持 pipeline / lua / pubsub

安装:

pipinstallredis>=5.0.0

二、项目结构(推荐生产级)

redis_client/ ├── __init__.py ├── config/ │ ├── __init__.py │ └── settings.py # Redis 配置(哨兵 / 集群) │ ├── core/ │ ├── __init__.py │ ├── client.py # Redis 客户端工厂(核心) │ ├── connection.py # 连接池管理 │ └── exceptions.py # 自定义异常 │ ├── features/ │ ├── __init__.py │ ├── cache.py # 通用缓存封装 │ ├── lock.py # 分布式锁 │ ├── counter.py # 计数器 / 限流 │ ├── pubsub.py # 发布订阅 │ └── structures.py # Redis 各数据结构封装 │ ├── utils/ │ ├── __init__.py │ ├── serializer.py # JSON / MsgPack │ └── time.py │ └── examples/ ├── sentinel_demo.py ├── cluster_demo.py └── pubsub_demo.py

三、Redis 配置(settings.py)

# redis_client/config/settings.pyREDIS_MODE="sentinel"# sentinel | cluster | standalone# Sentinel 配置REDIS_SENTINEL={"sentinels":[("10.0.0.1",26379),("10.0.0.2",26379),],"service_name":"mymaster","db":0,"password":None,"socket_timeout":3,}# Cluster 配置REDIS_CLUSTER={"startup_nodes":[{"host":"10.0.0.10","port":6379},{"host":"10.0.0.11","port":6379},],"password":None,"socket_timeout":3,}

四、Redis 客户端工厂(核心)

# redis_client/core/client.pyfromredisimportRedisfromredis.sentinelimportSentinelfromredis.clusterimportRedisClusterfromredis_client.config.settingsimport(REDIS_MODE,REDIS_SENTINEL,REDIS_CLUSTER,)classRedisClientFactory:_client=None@classmethoddefget_client(cls):ifcls._client:returncls._clientifREDIS_MODE=="sentinel":sentinel=Sentinel(REDIS_SENTINEL["sentinels"],socket_timeout=REDIS_SENTINEL["socket_timeout"],password=REDIS_SENTINEL["password"],)cls._client=sentinel.master_for(service_name=REDIS_SENTINEL["service_name"],db=REDIS_SENTINEL["db"],decode_responses=True,)elifREDIS_MODE=="cluster":cls._client=RedisCluster(startup_nodes=REDIS_CLUSTER["startup_nodes"],password=REDIS_CLUSTER["password"],decode_responses=True,)else:cls._client=Redis(host="localhost",port=6379)returncls._client

优点

  • 调用方无感知哨兵 / 集群
  • 自动主从切换
  • 单例连接池

五、通用缓存封装(cache.py)

# redis_client/features/cache.pyimportjsonfromredis_client.core.clientimportRedisClientFactoryclassCache:def__init__(self):self.redis=RedisClientFactory.get_client()defset(self,key,value,ttl=None):val=json.dumps(value)self.redis.set(key,val,ex=ttl)defget(self,key,default=None):val=self.redis.get(key)returnjson.loads(val)ifvalelsedefaultdefdelete(self,key):self.redis.delete(key)defexists(self,key)->bool:returnself.redis.exists(key)==1

缓存模式建议

场景建议
热点数据TTL + 随机抖动
空值缓存 NULL(短 TTL)
高并发逻辑过期 + 异步重建

六、Redis 数据结构封装(structures.py)

# redis_client/features/structures.pyfromredis_client.core.clientimportRedisClientFactoryclassRedisStructures:def__init__(self):self.redis=RedisClientFactory.get_client()# Stringdefincr(self,key,amount=1):returnself.redis.incr(key,amount)# Hashdefhset(self,name,key,value):self.redis.hset(name,key,value)defhget(self,name,key):returnself.redis.hget(name,key)# Listdeflpush(self,key,value):self.redis.lpush(key,value)defrpop(self,key):returnself.redis.rpop(key)# Setdefsadd(self,key,value):self.redis.sadd(key,value)# ZSetdefzadd(self,key,mapping:dict):self.redis.zadd(key,mapping)

七、分布式锁(lock.py)

1. Lua 保证原子性

# redis_client/features/lock.pyimportuuidimporttimefromredis_client.core.clientimportRedisClientFactory UNLOCK_SCRIPT=""" if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end """classRedisLock:def__init__(self,key,ttl=10):self.redis=RedisClientFactory.get_client()self.key=f"lock:{key}"self.ttl=ttl self.value=str(uuid.uuid4())defacquire(self,retry=3):for_inrange(retry):ifself.redis.set(self.key,self.value,nx=True,ex=self.ttl):returnTruetime.sleep(0.1)returnFalsedefrelease(self):self.redis.eval(UNLOCK_SCRIPT,1,self.key,self.value)

特点:

  • 防误删
  • 支持哨兵 / 集群
  • Lua 原子性

八、发布订阅(pubsub.py)

# redis_client/features/pubsub.pyimportthreadingfromredis_client.core.clientimportRedisClientFactoryclassRedisPubSub:def__init__(self):self.redis=RedisClientFactory.get_client()defpublish(self,channel,message):self.redis.publish(channel,message)defsubscribe(self,channel,handler):pubsub=self.redis.pubsub()pubsub.subscribe(channel)deflisten():formsginpubsub.listen():ifmsg['type']=='message':handler(msg['data'])threading.Thread(target=listen,daemon=True).start()

⚠️ 注意:

  • Pub/Sub不可靠(断线即丢)
  • 生产消息推荐Redis Stream / MQ

九、计数器 & 限流(counter.py)

# redis_client/features/counter.pyimporttimefromredis_client.core.clientimportRedisClientFactoryclassRateLimiter:def__init__(self,key,limit,window):self.redis=RedisClientFactory.get_client()self.key=key self.limit=limit self.window=windowdefallow(self):now=int(time.time())pipe=self.redis.pipeline()pipe.incr(self.key)pipe.expire(self.key,self.window)count,_=pipe.execute()returncount<=self.limit

十、生产级最佳实践总结

Redis 哨兵

  • 客户端必须通过 Sentinel 发现主节点
  • 禁止直连 master IP

Redis Cluster

  • Key 必须使用hash tag保证多 key 原子:
user:{123}:name user:{123}:age

通用建议

建议
连接池单例
大 key严禁
热 key本地缓存 + Redis
Lua控制复杂度
序列化JSON / MsgPack

十一、可以进一步扩展的功能

  • Redis Stream 消费组
  • RedLock 多实例锁(跨机房)
  • Cache Aside / Write Through
  • 二级缓存(Local + Redis)
  • 监控(slowlog / latency)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 1:45:22

LobeChat活跃度分析看板生成

LobeChat 活跃度分析看板构建实践 在 AI 聊天应用快速普及的今天&#xff0c;一个看似简单的对话框背后&#xff0c;往往隐藏着复杂的工程决策。用户是否愿意持续使用&#xff1f;哪些功能真正被激活&#xff1f;响应延迟是否影响体验&#xff1f;这些问题的答案&#xff0c;不…

作者头像 李华
网站建设 2026/3/30 18:19:22

大模型推理基石:如何用 C++ 封装 CUDA API?(含源码与原理解析)

在大模型时代&#xff0c;算法与系统的边界日益模糊。想要复现 DeepMind 或 OpenAI 的工作&#xff0c;光会设计 Loss Function 已经不够了&#xff0c;必须深入理解底层的算力调度。本文开始从零手写 CUDA Runtime API 的过程。要求在不依赖高级框架的前提下&#xff0c;直接通…

作者头像 李华
网站建设 2026/3/31 18:20:02

Web自动化测试之数据驱动实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快在Web自动化测试中&#xff0c;我们需要把测试使用到的数据分离到文件中&#xff0c;如果单纯的写在我们的测试模块里面&#xff0c;不是一个好的设计&#xff0c;所…

作者头像 李华
网站建设 2026/3/29 3:33:11

LobeChat客户成功案例撰写

LobeChat&#xff1a;如何用一个开源项目重塑AI对话体验 在大模型能力日益普及的今天&#xff0c;我们早已不再惊叹于“AI能写文章”或“会编程”这类基础能力。真正的问题变成了&#xff1a;如何让这些强大的模型真正服务于人&#xff1f; 答案或许不在模型本身&#xff0c;而…

作者头像 李华
网站建设 2026/3/31 5:47:44

LobeChat定时任务触发器设计模式探讨

LobeChat定时任务触发器设计模式探讨 在现代 AI 聊天应用的开发中&#xff0c;自动化能力正逐渐成为衡量系统成熟度的重要指标。以 LobeChat 为例&#xff0c;这款基于 Next.js 的开源对话平台虽然在前端交互和模型集成上表现出色&#xff0c;但其无状态、服务端不可控的架构特…

作者头像 李华
网站建设 2026/4/2 1:51:03

基于单片机的紫外线强度测试电路设计

基于单片机的紫外线强度测试电路设计 第一章 绪论 紫外线&#xff08;UV&#xff09;强度监测在日常生活、农业生产、工业防护等领域具有重要意义&#xff1a;过度暴露于紫外线&#xff08;尤其是UV-B波段&#xff09;会导致皮肤晒伤、老化&#xff0c;甚至诱发皮肤癌&#xff…

作者头像 李华