场景: 微信token存到redis里面,快到期时请求并更新,关键是如何触发请求。
原来想通过遍历redis,但是。。。
后来发现redis里面有键空间通知功能,其中有key到期发出通知的功能,所有想利用这个事件来触发更新的请求。
问题: 1)我要subscribe那个频道?__keyevent@0__直接监听数据库?
2)我on到expire时间后,redis返回是什么
刚用redis求指教啊
正在做实验,稍后上结果
有个地方被markdow转译了上图
启动客户端
1)启动node redis客户端
var redis = require("redis");
var client = redis.createClient({
host: '127.0.0.1',
port: '6379'
});
client.subscribe('__keyevent[@0__](/user/0__):expired');
client.on('message', function(event, data, data1) {
console.log(evnet);
console.log(data);
console.log(data1)
});
2)shell redis客户端
#src/redis-cli
#config set notify-keyspace-events Ex
#psubscribe '__keyevent[@0__](/user/0__):expired'
模拟redis数据变化
在另一个客户端里做操作,主要是expire操作
#src/redis-cli
# set foo bar
#expire foo 1
##两个客户端的输出 node-redis
__keyevent[@0__](/user/0__):expired
foo
undefined
shell客户端
1) "pmessage"
2) "__keyevent[@0__](/user/0__):expired"
3) "__keyevent[@0__](/user/0__):expired"
4) "foo"
结论
返回key的名字
重点
1)config set notify-keyspace-events Ex 配置监听的事件空间,配什么就会发出什么
2)psubscribe ‘__keyevent@0__:expired’
client.subscribe(’__keyevent@0__:expired’);
监听的内容,数据库事件,还能怎么组合我也不知道,刚刚接触
3).on事件 message
pmessage 区别
关注中,这个东西好···
重点是我不会这么做,让用户触发多好,不然浪费性能 自豪地采用 CNodeJS ionic
这个场景不应该用 expired 事件来实现。因为 expired 不是在键的 ttl 到 0 时才触发,当数据库中键越多时延迟越久(运气不好的话几个小时都有可能)。原理和 Redis 淘汰键的机制有关。
为何不直接 GET
存 token 那个键(设置一个 ttl),如果过期了再重新取就好了。更简单的设置个 setTimeout,每隔一段时间取一次就行了。
@luinlee 但是这样会遍历所有的东西,赶脚浪费性能,实际上哪种好,我也不晓的。 我是这样做的,同一个数据做了两份,一个用来触发更新另一个,用来触发的那个TTL设置的时间比另一个短
@captainblue2013 用户触发的一个不好的地方就是要等
@suntopo 用户又不会一直用这个服务
@captainblue2013 说的老有道理了,又有问题了https://cnodejs.org/topic/568f5e42c301558265041dd0
@suntopo 什么鬼?404