Java-LoadingCache的罪 本章主要是分析Guava包的LoadingCache的问题先来一段使用代码看看大家的是不是这么用的//15秒自动刷新 LoadingCacheString, MapLong, RoomVO roomCache CacheBuilder.newBuilder().refreshAfterWrite(15, TimeUnit.SECONDS) .build(new CacheLoaderString, MapLong, RoomVO() { Override public MapLong, RoomVO load(String key) throws Exception { if (key.equals(room_pool)) { //刷新逻辑方法 return refreshRoolPool(); } return Collections.emptyMap(); } }); //我自己的场景下的使用方式 public MapLong, RoomVO getAllRoomMap() { return roomCache.get(room_pool); }当初为什么选择用它呢那是因为它的优点数据在内存就是为了快。。。。此处省略10W字但是今天抛开优点只想说说它的不足尤其是在多线程环境下的问题缓存刷新时机1、调用方法获取缓存值时如果缓存中不存在对应的键值对或者缓存中的值已经过期那么会触发刷新操作。此时Guava会调用其中的方法来获取新值并将其存储在缓存中。原罪2、调用方法手动刷新缓存时可以通过调用接口中的方法手动触发缓存的刷新。这会导致Guava调用中的方法来获取新值并将其存储在缓存中。多线程问题1、并发性能问题如果多个线程同时调用getAllRoomMap()方法可能会导致对缓存的重复加载和刷新操作从而增加了不必要的性能开销。特别是在缓存加载和刷新的过程中可能会对数据更新逻辑中的网络资源如数据库或远程服务这一点在其他RPC服务和数据库的查询上得到了验证造成额外的压力导致性能下降。即使是ConcurrentHashMap来存储最终数据也是无用的。补充下场景是用它来存储当前正在开播中的房间信息因为它的机制恰好在他缓存失效了哎好死不死的正好有个大kol开播了流量一下子疯狂一把这机器的CPU裱起来呦JVM使用率飚起来呦数据库飚请求起来呦...2、数据一致性问题在缓存数据加载和刷新的过程中可能会出现不一致的情况。例如在一个线程正在刷新缓存的同时另一个线程可能会获取到旧的缓存数据导致数据不一致的问题。规范使用1、ToC的场景并发高的场景就换别的方式吧这玩意不合适2、非要用的话那就 设定一个比设置的缓存时间更短的任务来手动刷新完事了点完赞离开吧少年