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

2021-08-16 18:28:46 +08:00
 ptrees

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

2811 次点击
所在节点    Redis
14 条回复
sadfQED2
2021-08-16 18:33:17 +08:00
你这个用法本来就不对。

另外数据量比较大是多大,1T 内存的 redis 存 24 小时够不够。另外,读写频繁是多频繁,nvme 固态的 db,堆机器能不能解决
wy315700
2021-08-16 18:35:03 +08:00
试试看类 redis 的数据库吧 pika tendis 之类
sutra
2021-08-16 18:36:53 +08:00
这不就是 cache 机制吗?
yinusxxxx
2021-08-16 18:38:12 +08:00
感觉你的描述就很冲突,频繁读写就让他留在内存好了,就算换出了,马上又会被读回来,何必
mmdsun
2021-08-16 18:44:43 +08:00
“读回来”???没太懂。

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

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

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

value = getValue(key)
if(!value){
value = ....
setValue(key,value,expire)
}
return value
arbit
2021-08-17 17:30:40 +08:00
@kingfalse #12 老哥这比喻太生动了吧😂

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

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

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

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

© 2021 V2EX