关于juejin.cn/post/736132… (基于Redission高级应用5-RLocalCachedMapt原理及实战应用) 中提到RLocalCachedMapt的使用,有老铁提出该map里面的每个key都开一个定时任务监听,map的key变多会导致内存溢出,由此想着如何优化上篇文章内容:RLocalCachedMapRLocalCachedMap
是 Redisson 提供的一个本地缓存客户端,它在本地存储了远程 Redis 中的数据副本,以减少网络开销和提高性能。然而,如果不正确使用,它可能会导致资源消耗问题,如您提到的,如果键值对非常多,每个键都设置了过期监听器,就可能导致大量的定时任务占用内存,最终导致OOM(内存溢出)。
为了避免RLocalCachedMap
的这个缺点,可以采取以下策略:
- 限制本地缓存大小:通过配置
localCacheSize
参数限制本地缓存的大小,以避免过多的键值对被缓存到本地。 - 合理设置过期时间:如果所有键都设置了过期时间,可以考虑增加过期时间或者不为每个键设置监听器,而是使用定时任务批量清理过期键。
- 使用弱引用:配置
RLocalCachedMap
使用弱引用存储键值对,这样一旦内存不足,这部分内存可以被垃圾收集器回收。 - 监听器优化:如果需要监听过期事件,可以考虑使用单个监听器来处理多个键的事件,而不是为每个键单独设置监听器。
- 按需使用:只对热点数据使用本地缓存,不是所有数据都需要本地缓存。
- 缓存清理策略:定期清理不常用或低优先级的缓存数据,可以手动或使用定时任务。
- 内存监控:实施内存使用监控,当达到一定阈值时触发报警或自动清理策略。
- 备选方案:如果
RLocalCachedMap
的缺点难以克服,可以考虑使用其他缓存策略,如只使用Redis缓存,或者采用其他本地缓存库(如Caffeine)与Redis缓存组合使用。
请参考:juejin.cn/post/736125…
这是一个配置RLocalCachedMap
的例子,它使用了一些上述策略:
基于Redission高级应用5-RLocalCachedMapt原理及实战应用
1 | java复制代码Config config = new Config(); |
在这个配置中,我们限制了本地缓存的大小为1000个键值对,设置了默认的存活时间和最大空闲时间,并且启用了弱引用来存储条目。
总之,RLocalCachedMap
可以显著提升性能,但必须谨慎使用并合理配置以避免资源消耗问题。
本文转载自: 掘金