redis 键空间通知使用
发布于 9 年前 作者 suntopo 6116 次浏览 最后一次编辑是 8 年前 来自 问答

场景: 微信token存到redis里面,快到期时请求并更新,关键是如何触发请求。

原来想通过遍历redis,但是。。。

后来发现redis里面有键空间通知功能,其中有key到期发出通知的功能,所有想利用这个事件来触发更新的请求。

问题: 1)我要subscribe那个频道?__keyevent@0__直接监听数据库?

2)我on到expire时间后,redis返回是什么

刚用redis求指教啊

正在做实验,稍后上结果

有个地方被markdow转译了上图 Screenshot from 2016-01-07 17:26:18.png

启动客户端

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 区别

8 回复

关注中,这个东西好···

重点是我不会这么做,让用户触发多好,不然浪费性能 自豪地采用 CNodeJS ionic

这个场景不应该用 expired 事件来实现。因为 expired 不是在键的 ttl 到 0 时才触发,当数据库中键越多时延迟越久(运气不好的话几个小时都有可能)。原理和 Redis 淘汰键的机制有关。

为何不直接 GET 存 token 那个键(设置一个 ttl),如果过期了再重新取就好了。更简单的设置个 setTimeout,每隔一段时间取一次就行了。

@luinlee 但是这样会遍历所有的东西,赶脚浪费性能,实际上哪种好,我也不晓的。 我是这样做的,同一个数据做了两份,一个用来触发更新另一个,用来触发的那个TTL设置的时间比另一个短

@captainblue2013 用户触发的一个不好的地方就是要等

@suntopo 用户又不会一直用这个服务

@captainblue2013 说的老有道理了,又有问题了https://cnodejs.org/topic/568f5e42c301558265041dd0

回到顶部