用 hashmap 的缓存管理有什么好的定时清理思路吗?比如进入缓存超过五分钟就丢弃

2018-01-10 09:02:56 +08:00
 admirez
5066 次点击
所在节点    问与答
21 条回复
Boyizmen
2018-01-10 09:10:59 +08:00
java 里有个 WeakHashMap,key 不再被引用就会自动清理
archer2ee
2018-01-10 09:11:59 +08:00
guavaa cache,自带过期失效。
chocotan
2018-01-10 09:16:56 +08:00
MarcoQin
2018-01-10 09:26:17 +08:00
进入缓存带上时间戳,取的时候每次都比较时间戳,若是超过 5 分钟就清楚并重新获取数据进行缓存
qianlv7
2018-01-10 09:45:17 +08:00
LRU
admirez
2018-01-10 10:07:31 +08:00
@MarcoQin 如果只是取的时候比较,那么一直没有被缓存命中的怎么办?
admirez
2018-01-10 10:09:08 +08:00
@Boyizmen key 不再被引用那一秒钟就被释放达不到缓存目的,或者我理解错误?
justfly
2018-01-10 10:30:54 +08:00
如果要求对空间要求比较高,那就定时(比如每秒)在另一个线程扫一遍,可以加一个辅助一个按时间顺序的 List,找到 5min 以外的就可以。

不要求太精确空间控制的话,或者限制单线程场景下,每次写入的时候做一下上面的扫描清除逻辑。

或者再复杂,参考 redis 的过期策略,取样、算比例、清理,可以读下 redis 的过期逻辑。
MarcoQin
2018-01-10 11:03:12 +08:00
@admirez #6 一直没有被命中的情况我猜是请求频率太低导致的?那这样的话是否还需要缓存……

取的时候如果没有命中,那就再重新写入缓存……当然,这种方式适合临时做或少量的缓存。大量应用缓存的话,用定时任务做可能好一些,比如楼上说的那样
Boyizmen
2018-01-10 11:06:40 +08:00
@admirez 应该是,文档我也没细看
xcolder
2018-01-10 11:14:27 +08:00
Guava Cache + 1
rockyou12
2018-01-10 11:16:39 +08:00
lz 要不是有什么特别业务直接用 google guava 里的 cache 就行了,很简单的
yangg
2018-01-10 11:23:26 +08:00
同求 node 或者 js 的
innoink
2018-01-10 11:29:07 +08:00
LRU,双链表
noe132
2018-01-10 12:11:17 +08:00
node 有 lru-cache。可以设置个定时任务清理过期的缓存
bazingaterry
2018-01-10 12:19:51 +08:00
參考一下 Redis 的實現唄
honeycomb
2018-01-10 13:08:46 +08:00
guava cache

eviction 机制比较优雅,而且要使用 weak/soft 引用也没问题,回调 /权重 /load 接口,错误处理 /性能统计,builder 等都预先准备好了。
HaoyangWei
2018-01-10 14:25:41 +08:00
如果说自己造轮子的话,map+双向链表=>LRU map
使用时读取前检查时间,写入前检查时间并最多尝试淘汰 2 个元素
就好啦:)
th00000
2018-01-10 15:13:00 +08:00
可以参考热点缓存机制, 简单来说就是维护一个 1000 长度的队列, 每次用的时候就放到队列头, 每 5 分钟清除队列尾部的 200 条数据, 再从数据库中拿 200 条来补充. 以此来实现
argsno
2018-01-10 15:14:03 +08:00
Redis 在读取数据的时候判断是否过期,以及定期删除过期的键

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

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

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

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

© 2021 V2EX