redis 如何设置部分数据永不丢弃?

2015-04-20 23:23:57 +08:00
 baskice
当前使用redis做缓存,但是内存满了之后 lru 模式下就会丢掉旧数据,有时候会直接丢掉session导致所有人无法登陆无法操作,只能看。

有无可能设置部分数据绝不丢弃呢?
5683 次点击
所在节点    Redis
15 条回复
fuxkcsdn
2015-04-20 23:30:42 +08:00
不丢弃的部分数据设置一个无关紧要的字段,定期更新此字段,猜测的没实际操作过
ryd994
2015-04-21 00:02:07 +08:00
那就上持久化啊
baskice
2015-04-21 02:17:52 +08:00
@ryd994 持久化开了内存上限一到一样会扔掉啊
baskice
2015-04-21 03:06:20 +08:00
找到一个临时解决办法,给session不设置过期时间,然后redis设置成

volatile-lru: evict keys trying to remove the less recently used (LRU) keys first, but only among keys that have an expire set, in order to make space for the new data added.

给所有其他数据都设置过期时间。不过测试发现这个模式下死掉的内存会快速增加,以我们这边生产环境看大概2天能耗光8G内存。目前不清楚死掉的空间是为什么。。。。。
lincanbin
2015-04-21 07:47:37 +08:00
开个表存着,每次用之前判断该在不在,不在就去读表在写入缓存。
我自己都是这样做的,毕竟缓存属于不可靠储存,要持久化肯定要靠硬盘
maddemon
2015-04-21 08:10:29 +08:00
session专门用一个redis进程
no13bus
2015-04-21 08:51:26 +08:00
@baskice 是持久化本地硬盘吧。影响内存吗?
axb
2015-04-21 08:58:12 +08:00
开两个redis,一个做缓存,一个做存储
stiekel
2015-04-21 09:32:40 +08:00
对于不能丢的数据,比如像你的会话,不能单纯依靠redis的,建议策略如下:
1、生成会话时,存redis的同时,也存到存储中,比如MongoDB
2、当在redis找不到会话时,去MongoDB查询,如果查到了,回写到redis

当然,具体策略还可以更优,比如设置一个存放会话id列表的地方(可以是缓存中),先在缓存中查会话,没有则到会话id列表中查,如果查到了则去存储,没有查到则直接证明会话不存在。
fly2never
2015-04-21 09:58:16 +08:00
redis其实不适合做session管理
xiaoheshang
2015-04-21 10:47:46 +08:00
可以用memcache做session管理
duzhe0
2015-04-21 12:44:32 +08:00
开两个redis实例。
hydrazt
2015-04-21 18:14:31 +08:00
顶 两个实例
baskice
2015-04-21 22:27:05 +08:00
@fly2never 有更好的方案吗?
solaro
2015-05-08 22:05:53 +08:00
做持久化。持久化俗名就是把原本放在缓存里的数据全部写到硬盘里。重启之后数据还可以再读回缓存。
有两种,一种叫aof,一种叫rdb。。

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

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

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

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

© 2021 V2EX