背景:代码本地调试通过,能够连接到开发服务器的redis,存储键值在过期的时候推送,但是在预生产服务器就无法进行推送。
经过调试发现可以将值存储进redis,但是在手动设置过期的时候,程序无法收到推送通知。
排错过程:
1.预生产服务仿照生产服务使用了两天服务器,开发环境只用到了一台,所以初步认为可能是推送通知无法从主服务器发送到次服务器[掉线通知的程序在次服务器,redis安装在主服务器],向技术支持询问以及技术架构说明原因后,说不是这个原因导致[这里不是特别明确,一开始我以为推送是通过某个连接发送到服务端,但是听技术架构描述好像不是这样,以后调研清楚]。
2.技术架构给出了第二种排错方式,链接到预生产服务器的reids 然后订阅频道,看事件过期能否收到推送。
流程如下:
1.开启两个远程连接 同时连接上redis redis-cli
2.查看是否开启了掉线推送 get notify-keyspace-events
如果是这样表示redis没有开启这个配置,需要手动开启。
set notify-keyspace-events Kx [此配置根据自己的需求来。官方文档:https://redis.io/topics/notifications
K Keyspace events, published with __keyspace@<db>__ prefix.
E Keyevent events, published with __keyevent@<db>__ prefix.
g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$ String commands
l List commands
s Set commands
h Hash commands
z Sorted set commands
x Expired events (events generated every time a key expires)
e Evicted events (events generated when a key is evicted for maxmemory)
A Alias for g$lshzxe, so that the "AKE" string means all the events.
上图为官方文档的介绍。
然后某一个连接进行订阅操作:
PSUBSCRIBE __keyspace@*__:lost:* [keyspace@* 这里的* 表示所有。lost:* 表示监听所有lost: 开头的键的掉线推送 ]
连接成功如上图所示。
另外一个连接设置键值以及过期时间 setex lost:test 5 10 [5为5秒后过期,10为值]
查看键过期时间 ttl lost:test [ttl 键的名称]
然后查看另外一个链接是否收到。
当时预生产环境确实无法收到,过期推送。研究了一下发现,通过 redis-server & 的方式启动以后,手动开启过期事件推送无法收到推送。但是当指定redis.conf的配置再手动开启推送就可以了[在配置文件中指定不生效。。。]