现在做一个需求,某个数据量比较大而且存在频繁读写,所以我想放到 redis 里面,但这样又怕太占内存,所以我想过期时间设定 2 小时,要用的时候再读回来. 现在的问题是这个"读回来"怎么实现,要么是 redis 本身就有相应的机制,要么在数据将要过期时写入数据库,但目前搜索了半天都没看到有相关的用法,是不是我这种用法本身不对呢?有没有更好的解决办法?
1
sadfQED2 2021-08-16 18:33:17 +08:00 via Android
你这个用法本来就不对。
另外数据量比较大是多大,1T 内存的 redis 存 24 小时够不够。另外,读写频繁是多频繁,nvme 固态的 db,堆机器能不能解决 |
2
wy315700 2021-08-16 18:35:03 +08:00
试试看类 redis 的数据库吧 pika tendis 之类
|
3
sutra 2021-08-16 18:36:53 +08:00 1
这不就是 cache 机制吗?
|
4
yinusxxxx 2021-08-16 18:38:12 +08:00
感觉你的描述就很冲突,频繁读写就让他留在内存好了,就算换出了,马上又会被读回来,何必
|
5
mmdsun 2021-08-16 18:44:43 +08:00 via Android
“读回来”???没太懂。
缓存没命中,就从数据库查询,然后再塞到 Redis 里,Redis 设置 2 小时过期。是这个意思不。如果你是这种参考 Cache Pattern 模式 或者你说的是 Redis 热冷数据那种?热数据放内存,冷数据存磁盘?? 这种可以看下 Tendis,我记得有这个功能,而且兼容 Redis 协议 |
6
ptrees OP @mmdsun 因为这个数据读取写入都比较频繁, 可以理解成 1;1, 如果每次写入都存数据库感觉用缓存意义就不大了,所以打算只写 redis,然后隔一段时间再存数据库,不知道有没有这种
|
7
IanPeverell 2021-08-16 18:53:18 +08:00
那你可能需要的不是 redis 而是 rocksdb
|
8
pengtdyd 2021-08-16 19:18:57 +08:00
怎么说呢,不是批评你,用一个技术不要自己想当然的用,多看看官方文档,先弄清楚他是干嘛的,解决了什么问题,然后再用,不要鸡同鸭讲
|
9
lscho 2021-08-16 19:28:40 +08:00 1
@ptrees 你这种用法会涉及到 redis 的一致性问题,比如你存到了 redis,但是还没进数据库的时候,redis 挂了。这时候你数据库就没有保存最新的数据。
为了解决这个问题,你要引入 redis 持久化,但是持久化的话,就没必要写入数据库了。 |
10
bringyou 2021-08-16 19:42:40 +08:00
先不谈这个方案的设计,redis 本身有个 [keyspace notification]( https://redis.io/topics/notifications)的功能,其中一项就是在键过期时发布通知,不过是 fire and forget 模型
|
11
ptrees OP 感谢大家的回复,目前看下来感觉直接用 redis 持久化就行.
这个数据其实是有过期时间的,过期了就不允许写入了,我想这个时候存到 db 里然后把缓存删掉就行了. 原先可能是想复杂了,编程小白大家轻喷哈 |
12
kingfalse 2021-08-17 08:12:50 +08:00 via Android 1
好家伙,妹子养舔狗都不敢这样
|
13
encro 2021-08-17 09:50:44 +08:00
一般程序实现:
value = getValue(key) if(!value){ value = .... setValue(key,value,expire) } return value |