news 2026/6/25 17:05:42

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/6/24 17:16:54

模型推理加速技术全景解析:从基础优化到前沿创新

在2024-2025年间&#xff0c;大模型推理加速技术取得了显著突破&#xff0c;从传统的模型压缩到前沿的分页内存管理&#xff0c;再到革命性的投机解码&#xff0c;这些技术共同推动了大模型推理速度的质的飞跃。本报告将深入浅出地解析这些主流加速手段&#xff0c;结合一年内发…

作者头像 李华
网站建设 2026/6/25 6:50:43

LobeChat公益活动策划方案生成

LobeChat 公益应用技术实践&#xff1a;让AI真正服务于人 在偏远山区的乡村小学里&#xff0c;一个孩子低声说&#xff1a;“我不想上学了。” 没有老师在场&#xff0c;也没有心理咨询师能立刻赶到——但屏幕另一端的AI助手听到了这句话。它没有机械地回答“为什么呢&#xf…

作者头像 李华
网站建设 2026/6/21 21:04:04

LobeChat智能排班建议生成算法初探

LobeChat智能排班建议生成算法初探 在人力资源管理日益智能化的今天&#xff0c;一个看似简单却极其耗时的任务——排班&#xff0c;正成为企业效率提升的关键瓶颈。尤其在医疗、零售、客服中心等需要轮班作业的行业中&#xff0c;管理者常常面临这样的困境&#xff1a;既要满足…

作者头像 李华
网站建设 2026/6/25 2:40:22

10.3 当前挑战:标准化、模型保密性、系统规划

10.3 当前挑战:标准化、模型保密性、系统规划 构网型变流器的技术验证与初步工程应用已证明了其在提升新型电力系统稳定性方面的核心价值。然而,其从“可用”到“可靠、可管、可大规模部署”的广泛普及,仍面临来自技术规范、商业生态和系统设计方法三个维度的深层次挑战。本…

作者头像 李华
网站建设 2026/6/24 21:11:14

互联网大厂Java求职者面试实录:严肃面试官与搞笑谢飞机的三轮问答

互联网大厂Java求职者面试实录&#xff1a;严肃面试官与搞笑谢飞机的三轮问答 本文通过一个互联网大厂Java求职面试的故事场景&#xff0c;展现了面试官与求职者谢飞机之间的精彩问答。面试涉及Java核心知识、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoo…

作者头像 李华
网站建设 2026/6/23 18:34:41

提示词工程完全指南:从零开始掌握大模型交互核心技术

本文详细介绍提示词工程这一优化大模型的核心技术&#xff0c;包括基本概念、构成要素及多种使用示例&#xff08;文本总结、信息提取、逻辑推理等&#xff09;。深入解析零样本提示、少样本提示、链式思考、自我一致性和思维树等进阶调优技巧&#xff0c;并探讨Prompt攻击与防…

作者头像 李华