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

ehcache 缓存过期后 为何 key 一直存在

  •  
  •   sakudie · 2018-05-31 10:13:21 +08:00 · 3434 次点击
    这是一个创建于 2369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    配置为

    <cache name="authorizationCache"
        maxEntriesLocalHeap="5000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="180"
        overflowToDisk="false"
        diskPersistent="false"
    />
    

    设置过期时间为 2 分钟,最大存活时间为 3 分钟,我等 10 分钟后 caches.size() 查询结果 > 0

    这个时候如果用 foreach 遍历打印出 keyvalue 会看到 key 存在 但是 valuenull

    遍历之后 再次输出 caches.size() 结果才是 0

    这就是我奇怪的 ehcachekey 为何一直存在...

    即使这个时候 value 已经为 null 了, 但只有当我遍历 value 的时候,才会把这些 key 删除

    4 条回复    2018-09-13 15:47:49 +08:00
    chenqimiao
        1
    chenqimiao  
       2018-05-31 10:43:19 +08:00
    ehcache 我并不是很了解,但是我可以给楼主提供一个 redis 过期缓存的处理思路,我想可能跟 ehcache 是相似的。
    redis 采用的是定期删除+惰性删除策略。
    为什么不用定时删除策略?
    定时删除,用一个定时器来负责监视 key,过期则自动删除。虽然内存及时释放,但是十分消耗 CPU 资源。在大并发请求下,CPU 要将时间应用在处理请求,而不是删除 key,因此没有采用这一策略.
    定期删除+惰性删除是如何工作的呢?
    定期删除,redis 默认每个 100ms 检查,是否有过期的 key,有过期 key 则删除。需要说明的是,redis 不是每个 100ms 将所有的 key 检查一次,而是随机抽取进行检查(如果每隔 100ms,全部 key 进行检查,redis 岂不是卡死)。因此,如果只采用定期删除策略,会导致很多 key 到时间没有删除。
    于是,惰性删除派上用场。也就是说在你获取某个 key 的时候,redis 会检查一下,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除。
    采用定期删除+惰性删除就没其他问题了么?
    不是的,如果定期删除没删除 key。然后你也没即时去请求 key,也就是说惰性删除也没生效。这样,redis 的内存会越来越高。
    sakudie
        2
    sakudie  
    OP
       2018-05-31 11:01:13 +08:00
    @chenqimiao 上面的结果和惰性删除有点类似,但是奇怪的是 能够输出 key 的值,value 却为 null,我不清楚 ehcache 是不是在缓存过期的时候会一直保留记录的所有的 key 值。而且 ehcache 也没有找到个 validation interval 来配置它的主动定时删除。
    wxm
        3
    wxm  
       2018-09-13 10:52:11 +08:00
    兄得 这个问题有解决吗 遇到了同样的问题 怀疑是 model 没有序列化
    sakudie
        4
    sakudie  
    OP
       2018-09-13 15:47:49 +08:00
    @wxm 没有解决。很久以前的代码了,现在都没用过它了。
    好像是用户退出的时候,我手动执行了一下清除 ehcache 的缓存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2741 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:29 · PVG 19:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.