有没有方法让redis 自动做热数据缓存?

2012-10-05 18:36:09 +08:00
 tioover
ORM将某些常用的数据从SQL加载在redis上,然后获取的时候有统一的方式,redis里面有的就用redis里面的,没有的去数据库找。

再比如说弄个计数器,发现一个时间段对某个数据访问比较频繁就自动放到redis里面,之后冷了以后就删掉。
15916 次点击
所在节点    Redis
10 条回复
zhangxiao
2012-10-05 18:42:42 +08:00
redis貌似可以设置expiration的吧,存的时候设置个过期时间就好了
fire5
2012-10-06 15:04:00 +08:00
个人想法,仅供参考啊
1.规划缓存。 就是那些东西需要放在缓存中。这个在开发初期 其实你应该就需要想明白,用计数器的方式也是一种方式。 如果(频繁访问) db要是能抗住,那么其实cache 紧紧是为了提升性能。

2.数据监控分析那些请求比较频繁,着重优化。

3.缓存预热功能。在高并发访问时候,加入1万请求,同时压到db可能崩溃,那么在应用启动前对 缓存预加载内容也是一种措施。

4.其实访问不频繁的也需要cache的,不过要是变化不大的 ,cache 超时时间设长点。
fire5
2012-10-06 15:05:35 +08:00
ps 我说的可能只适合网站应用奥。在通俗点 就是 cache命中率的问题。
YUCOAT
2012-10-06 17:36:13 +08:00
楼上的和我用一样的头像
fire5
2012-10-07 01:01:53 +08:00
@YUCOAT 你是左撇子
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 分钟到期之后,就会自动被删除了。

这应该就能达到缓存热数据的目的了。

最后,使用这种技术时,要记得在更新数据之后刷新缓存,否则会出现缓存过期的现象。
huangz
2012-10-07 14:44:18 +08:00
Tips:将 set/get 命令和 expire 命令包裹在一条事务中,效果更佳。嗯。
yingluck
2014-09-22 23:36:56 +08:00
@huangz set 和 expire 命令可以合并:setex
huangz
2014-09-23 07:47:13 +08:00
@yingluck 是的,感谢补充。
yinhexi
2016-09-05 20:21:08 +08:00
我就是觉得麻烦,每次 get 的时候也要设置过期。很麻烦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/49284

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX