如何用Python读取Redis中LPUSH到pushName的消息并转发?
解决Redis LPUSH消息无法通过PubSub订阅获取的问题
问题根源
Redis的PubSub订阅机制和List结构的LPUSH操作完全是两套独立逻辑:
- PubSub只接收通过
PUBLISH命令发送到指定频道的消息 LPUSH是往List类型键中添加元素的数据结构操作,不会触发任何PubSub频道的消息推送
所以你用redis-cli monitor能看到LPUSH操作,但PubSub订阅同名频道收不到消息,是正常现象,两者没有关联。
两种可行解决方案
方案1:直接读取List中的消息(无需修改原系统)
既然原系统是用LPUSH往pushName这个List里写消息,直接用Python脚本阻塞读取List元素,处理后转发即可:
import redis # 初始化Redis连接,根据实际配置修改参数 r = redis.Redis(host='localhost', port=6379, password='redis', decode_responses=True) # 持续监听List的新元素(阻塞模式,避免空轮询浪费资源) while True: # BRPOP阻塞等待List有元素,从右侧弹出(若要保留原List数据,可改用BLPOP后再LPUSH回去) _, raw_msg = r.brpop('pushName') # 自定义消息修改逻辑,示例:给消息添加处理标记 processed_msg = f"[{raw_msg}]_processed" # 转发到目标位置:可以是另一个List r.lpush('target_push_list', processed_msg) # 也可以是PubSub频道 r.publish('target_push_channel', processed_msg)
注意事项:
- 用
BRPOP/BLPOP阻塞读取比定时轮询更高效 - 若需要保留原
pushName的消息,不要直接用BRPOP,可以先通过LRANGE读取指定范围的消息,再用LTRIM截断已处理的部分
方案2:修改原系统,同时发送PubSub消息(若有权限改动原系统)
如果能修改原系统的代码,让它在执行LPUSH的同时,额外用PUBLISH把消息发到对应频道,这样就能用PubSub订阅接收:
原系统需要执行的Redis命令改为:
LPUSH pushName "your_message_content" PUBLISH pushName_channel "your_message_content"
对应的Python处理脚本:
import redis r = redis.Redis(host='localhost', port=6379, password='redis', decode_responses=True) pubsub = r.pubsub() # 订阅对应的PubSub频道 pubsub.subscribe('pushName_channel') # 监听频道消息 for msg in pubsub.listen(): # 过滤掉订阅确认消息,只处理实际内容 if msg['type'] == 'message': raw_msg = msg['data'] processed_msg = f"[{raw_msg}]_processed" # 转发到目标List或频道 r.lpush('target_push_list', processed_msg) r.publish('target_push_channel', processed_msg)
内容的提问来源于stack exchange,提问作者chowpay
相关产品推荐
相关产品推荐

