You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:22:52