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

2018-05-31 10:13:21 +08:00
 sakudie

配置为

<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 删除

3446 次点击
所在节点    程序员
4 条回复
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
2018-05-31 11:01:13 +08:00
@chenqimiao 上面的结果和惰性删除有点类似,但是奇怪的是 能够输出 key 的值,value 却为 null,我不清楚 ehcache 是不是在缓存过期的时候会一直保留记录的所有的 key 值。而且 ehcache 也没有找到个 validation interval 来配置它的主动定时删除。
wxm
2018-09-13 10:52:11 +08:00
兄得 这个问题有解决吗 遇到了同样的问题 怀疑是 model 没有序列化
sakudie
2018-09-13 15:47:49 +08:00
@wxm 没有解决。很久以前的代码了,现在都没用过它了。
好像是用户退出的时候,我手动执行了一下清除 ehcache 的缓存。

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

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

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

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

© 2021 V2EX