今天有人问了我一个问题:redis 的 key 过期是怎么实现的。我用redis做了几个功能,竟然没有思考这个问题,该死。作为一个敏而好学的好童鞋,立马google和查文档。
redis key 的过期机制
翻了下文档:
Redis keys are expired in two ways: a passive way, and an active way.
redis keys 过期有两种方式: passive 和 active.
active
active, 主动的方式:
当某个客户端尝试访问这个key时, 若这个key被发现timeout了, 那么就删除, 否则正常访问.
这篇博文 摘出了源码, 如下:
int expireIfNeeded(redisDb *db, robj *key) { |
passive
passive, 被动的方式:
redis 每秒会执行10次以下操作 (相关源码在server.c
的databasesCron()
中) :
- 测试20个随机keys.
- 删除找到的过期keys.
- 如果清除的keys超过25%, 那么认为当前数据库的过期keys是比较多的, 会继续抽样清除操作, 从第一步来过.
passive 和 active 方式是同时工作.
最后
虽然没看文档的这部分, 但其实一开始我直觉是: 莫非设置了定时器 ? 但想想也不合适,这样消耗太大了。出于性能的考虑,隐然觉得redis应该会有定时清理的功能,而且联想到之前的做的一个支付订单的功能和这个机制有点类似:首先有一个定时扫描来禁用过期的支付订单,当想继续支付前(使用该支付订单),需要检查这个支付订单有没有过期,没有过期才让继续支付。
这个问题,我竟懵逼了。如果问题换成让我设计这个机制, 或许能回答出来。 %>_<%
参考
EXPIRE – Redis
源码
How does redis expire keys? - Stack Overflow
http://blog.dolphin-game.com/post/65.html