V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tioover
V2EX  ›  Redis

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

  •  
  •   tioover ·
    tioover · 2012-10-05 18:36:09 +08:00 · 16144 次点击
    这是一个创建于 4459 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ORM将某些常用的数据从SQL加载在redis上,然后获取的时候有统一的方式,redis里面有的就用redis里面的,没有的去数据库找。

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

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

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

    4.其实访问不频繁的也需要cache的,不过要是变化不大的 ,cache 超时时间设长点。
    fire5
        3
    fire5  
       2012-10-06 15:05:35 +08:00
    ps 我说的可能只适合网站应用奥。在通俗点 就是 cache命中率的问题。
    YUCOAT
        4
    YUCOAT  
       2012-10-06 17:36:13 +08:00
    楼上的和我用一样的头像
    fire5
        5
    fire5  
       2012-10-07 01:01:53 +08:00
    @YUCOAT 你是左撇子
    huangz
        6
    huangz  
       2012-10-07 14:41:04 +08:00   ❤️ 1
    这类系统可以用 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
        7
    huangz  
       2012-10-07 14:44:18 +08:00   ❤️ 1
    Tips:将 set/get 命令和 expire 命令包裹在一条事务中,效果更佳。嗯。
    yingluck
        8
    yingluck  
       2014-09-22 23:36:56 +08:00
    @huangz set 和 expire 命令可以合并:setex
    huangz
        9
    huangz  
       2014-09-23 07:47:13 +08:00
    @yingluck 是的,感谢补充。
    yinhexi
        10
    yinhexi  
       2016-09-05 20:21:08 +08:00
    我就是觉得麻烦,每次 get 的时候也要设置过期。很麻烦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2064 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:38 · PVG 08:38 · LAX 16:38 · JFK 19:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.