huangz
2012-10-07 14:41:04 +08:00
这类系统可以用 Redis 的 EXPIRE 命令来实现。
EXPIRE 命令的行为是:
1)在 key 没有设置生存时间时,那么设置 key 的生存时间;
2)如果 key 已经设置了生存时间,那么 EXPIRE 就会更新这个 key 的生存时间(注意更新的方式是覆盖而不是延长)。
根据这一特性,可以在写入时设置数据 key 的生存时间,在读取时更新数据 key 的生存时间:这样在给定时间内被频繁访问的数据就可以一直保存下去,而没人访问的数据就会因为过期而被自动删除。
以一个字符串 key 为例子:
def cached_set(key, value)
$redis.set(key, value)
$redis.expire(key, 5 * 60)
end
def cached_get(key)
$redis.get(key)
$redis.expire(key, 5 * 60)
end
以上的代码只会保存 key 数据 5 分钟,如果 5 分钟之内有人访问这个 key ,那么 key 的生存时间就会重新设为 5 分钟,只要一直有人访问,就会一直“续期”下去。
至于没人访问的数据,在 5 分钟到期之后,就会自动被删除了。
这应该就能达到缓存热数据的目的了。
最后,使用这种技术时,要记得在更新数据之后刷新缓存,否则会出现缓存过期的现象。