配置为
<cache name="authorizationCache"
maxEntriesLocalHeap="5000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="180"
overflowToDisk="false"
diskPersistent="false"
/>
设置过期时间为 2 分钟,最大存活时间为 3 分钟,我等 10 分钟后 caches.size()
查询结果 > 0
这个时候如果用 foreach
遍历打印出 key
和 value
会看到 key
存在 但是 value
为 null
遍历之后 再次输出 caches.size()
结果才是 0
这就是我奇怪的 ehcache
的 key
为何一直存在...
即使这个时候 value
已经为 null
了, 但只有当我遍历 value 的时候,才会把这些 key 删除
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 的内存会越来越高。 |
2
sakudie OP @chenqimiao 上面的结果和惰性删除有点类似,但是奇怪的是 能够输出 key 的值,value 却为 null,我不清楚 ehcache 是不是在缓存过期的时候会一直保留记录的所有的 key 值。而且 ehcache 也没有找到个 validation interval 来配置它的主动定时删除。
|
3
wxm 2018-09-13 10:52:11 +08:00
兄得 这个问题有解决吗 遇到了同样的问题 怀疑是 model 没有序列化
|