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

redis 怎样读回已过期的数据?

  •  
  •   ptrees · 110 天前 · 1786 次点击
    这是一个创建于 110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在做一个需求,某个数据量比较大而且存在频繁读写,所以我想放到 redis 里面,但这样又怕太占内存,所以我想过期时间设定 2 小时,要用的时候再读回来. 现在的问题是这个"读回来"怎么实现,要么是 redis 本身就有相应的机制,要么在数据将要过期时写入数据库,但目前搜索了半天都没看到有相关的用法,是不是我这种用法本身不对呢?有没有更好的解决办法?

    sadfQED2
        1
    sadfQED2  
       110 天前 via Android
    你这个用法本来就不对。

    另外数据量比较大是多大,1T 内存的 redis 存 24 小时够不够。另外,读写频繁是多频繁,nvme 固态的 db,堆机器能不能解决
    wy315700
        2
    wy315700  
       110 天前
    试试看类 redis 的数据库吧 pika tendis 之类
    sutra
        3
    sutra  
       110 天前   ❤️ 1
    这不就是 cache 机制吗?
    yinusxxxx
        4
    yinusxxxx  
       110 天前
    感觉你的描述就很冲突,频繁读写就让他留在内存好了,就算换出了,马上又会被读回来,何必
    mmdsun
        5
    mmdsun  
       110 天前 via Android
    “读回来”???没太懂。

    缓存没命中,就从数据库查询,然后再塞到 Redis 里,Redis 设置 2 小时过期。是这个意思不。如果你是这种参考 Cache Pattern 模式

    或者你说的是 Redis 热冷数据那种?热数据放内存,冷数据存磁盘?? 这种可以看下 Tendis,我记得有这个功能,而且兼容 Redis 协议
    ptrees
        6
    ptrees  
    OP
       110 天前
    @mmdsun 因为这个数据读取写入都比较频繁, 可以理解成 1;1, 如果每次写入都存数据库感觉用缓存意义就不大了,所以打算只写 redis,然后隔一段时间再存数据库,不知道有没有这种
    IanPeverell
        7
    IanPeverell  
       110 天前
    那你可能需要的不是 redis 而是 rocksdb
    pengtdyd
        8
    pengtdyd  
       110 天前
    怎么说呢,不是批评你,用一个技术不要自己想当然的用,多看看官方文档,先弄清楚他是干嘛的,解决了什么问题,然后再用,不要鸡同鸭讲
    lscho
        9
    lscho  
       110 天前   ❤️ 1
    @ptrees 你这种用法会涉及到 redis 的一致性问题,比如你存到了 redis,但是还没进数据库的时候,redis 挂了。这时候你数据库就没有保存最新的数据。

    为了解决这个问题,你要引入 redis 持久化,但是持久化的话,就没必要写入数据库了。
    bringyou
        10
    bringyou  
       110 天前
    先不谈这个方案的设计,redis 本身有个 [keyspace notification]( https://redis.io/topics/notifications)的功能,其中一项就是在键过期时发布通知,不过是 fire and forget 模型
    ptrees
        11
    ptrees  
    OP
       110 天前
    感谢大家的回复,目前看下来感觉直接用 redis 持久化就行.
    这个数据其实是有过期时间的,过期了就不允许写入了,我想这个时候存到 db 里然后把缓存删掉就行了.
    原先可能是想复杂了,编程小白大家轻喷哈
    kingfalse
        12
    kingfalse  
       110 天前 via Android   ❤️ 1
    好家伙,妹子养舔狗都不敢这样
    encro
        13
    encro  
       110 天前
    一般程序实现:

    value = getValue(key)
    if(!value){
    value = ....
    setValue(key,value,expire)
    }
    return value
    arbit
        14
    arbit  
       110 天前
    @kingfalse #12 老哥这比喻太生动了吧😂
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2194 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    ♥ Do have faith in what you're doing.