• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sakudie
V2EX  ›  程序员

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

  •  
  •   sakudie · May 31, 2018 · 3824 views
    This topic created in 2929 days ago, the information mentioned may be changed or developed.

    配置为

    <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 replies    2018-09-13 15:47:49 +08:00
    chenqimiao
        1
    chenqimiao  
       May 31, 2018
    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
       May 31, 2018
    @chenqimiao 上面的结果和惰性删除有点类似,但是奇怪的是 能够输出 key 的值,value 却为 null,我不清楚 ehcache 是不是在缓存过期的时候会一直保留记录的所有的 key 值。而且 ehcache 也没有找到个 validation interval 来配置它的主动定时删除。
    wxm
        3
    wxm  
       Sep 13, 2018
    兄得 这个问题有解决吗 遇到了同样的问题 怀疑是 model 没有序列化
    sakudie
        4
    sakudie  
    OP
       Sep 13, 2018
    @wxm 没有解决。很久以前的代码了,现在都没用过它了。
    好像是用户退出的时候,我手动执行了一下清除 ehcache 的缓存。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2882 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 05:07 · PVG 13:07 · LAX 22:07 · JFK 01:07
    ♥ Do have faith in what you're doing.