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

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

  •  1
     
  •   baskice · 2015-04-20 23:23:57 +08:00 · 5863 次点击
    这是一个创建于 3533 天前的主题,其中的信息可能已经有所发展或是发生改变。
    当前使用redis做缓存,但是内存满了之后 lru 模式下就会丢掉旧数据,有时候会直接丢掉session导致所有人无法登陆无法操作,只能看。

    有无可能设置部分数据绝不丢弃呢?
    15 条回复    2015-05-08 22:05:53 +08:00
    fuxkcsdn
        1
    fuxkcsdn  
       2015-04-20 23:30:42 +08:00
    不丢弃的部分数据设置一个无关紧要的字段,定期更新此字段,猜测的没实际操作过
    ryd994
        2
    ryd994  
       2015-04-21 00:02:07 +08:00 via Android
    那就上持久化啊
    baskice
        3
    baskice  
    OP
       2015-04-21 02:17:52 +08:00
    @ryd994 持久化开了内存上限一到一样会扔掉啊
    baskice
        4
    baskice  
    OP
       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
        5
    lincanbin  
       2015-04-21 07:47:37 +08:00 via Android
    开个表存着,每次用之前判断该在不在,不在就去读表在写入缓存。
    我自己都是这样做的,毕竟缓存属于不可靠储存,要持久化肯定要靠硬盘
    maddemon
        6
    maddemon  
       2015-04-21 08:10:29 +08:00
    session专门用一个redis进程
    no13bus
        7
    no13bus  
       2015-04-21 08:51:26 +08:00
    @baskice 是持久化本地硬盘吧。影响内存吗?
    axb
        8
    axb  
       2015-04-21 08:58:12 +08:00 via iPhone
    开两个redis,一个做缓存,一个做存储
    stiekel
        9
    stiekel  
       2015-04-21 09:32:40 +08:00
    对于不能丢的数据,比如像你的会话,不能单纯依靠redis的,建议策略如下:
    1、生成会话时,存redis的同时,也存到存储中,比如MongoDB
    2、当在redis找不到会话时,去MongoDB查询,如果查到了,回写到redis

    当然,具体策略还可以更优,比如设置一个存放会话id列表的地方(可以是缓存中),先在缓存中查会话,没有则到会话id列表中查,如果查到了则去存储,没有查到则直接证明会话不存在。
    fly2never
        10
    fly2never  
       2015-04-21 09:58:16 +08:00
    redis其实不适合做session管理
    xiaoheshang
        11
    xiaoheshang  
       2015-04-21 10:47:46 +08:00
    可以用memcache做session管理
    duzhe0
        12
    duzhe0  
       2015-04-21 12:44:32 +08:00
    开两个redis实例。
    hydrazt
        13
    hydrazt  
       2015-04-21 18:14:31 +08:00
    顶 两个实例
    baskice
        14
    baskice  
    OP
       2015-04-21 22:27:05 +08:00
    @fly2never 有更好的方案吗?
    solaro
        15
    solaro  
       2015-05-08 22:05:53 +08:00
    做持久化。持久化俗名就是把原本放在缓存里的数据全部写到硬盘里。重启之后数据还可以再读回缓存。
    有两种,一种叫aof,一种叫rdb。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:46 · PVG 16:46 · LAX 00:46 · JFK 03:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.