2019独角兽企业重金招聘Python工程师标准>>>

首先说明几点内容,以便更容易理解。

1:设置  expireAfterAccess(long, TimeUnit) 缓存元素在指定的时间没有被读取访问失效,或 设置 expireAfterWrite(long, TimeUnit) 缓存元素在指定的时间没有被写入访问失效,如果设置 removalListener(removalListener) 移除监听器,则失效元素在被移除时触发移除监听器。注意 设置元素的定时无操作失效后,元素并不会在时间到达后就主动失效触动移除监听器。而是在后续的访问或写入时,捎带着把先前放入的元素过期后进行驱逐。仔细想想这么做确实很巧妙。不用需要一个固定线程扫描缓存中的过期元素以免与用户的操作产生锁竞争。但是想让缓存中元素过期后就马上触发移除操作处理的就无能为力了。试想下,如果一个缓存设置元素5分钟无写入访问失效,那么5分钟之前写入缓存一个元素M,在接下来的5分钟之后如果没有对缓存的操作,那么这个元素就一直停留在缓存中,也不会触发移除监听,直到下次操作缓存时。

想要让缓存元素过期后就马上驱逐的,或过期后就触发移除监听器的,可以创建一个自己的维护线程,以固定的时间间隔调用 Cache.cleanUp(),现在问题来了,我以固定时间 间隔调用Cache.cleanUp() 触发了移除监听事件(说明移除了元素),但是在我后续的写入缓存操作时,又触发了次同一个元素的移除监听事件。知道原因的期待你的回答。

语言表述能力比较差,直接上代码

/*失效元素从缓存清除,监听事件 (同步通知)*/static RemovalListener<String, OrderInfo> removalListener = new RemovalListener<String, OrderInfo>() {public void onRemoval(RemovalNotification<String, OrderInfo> notification) {OrderInfo orderInfo = notification.getValue();logger.info("remove cause " + notification.getCause() + " " + orderInfo.toString());}};
/*订单缓存*/public static Cache<String, OrderInfo> cache = CacheBuilder.newBuilder()/*并发操作线程  默认4*/.concurrencyLevel(2)/*15秒无写入过期*/.expireAfterWrite(15, TimeUnit.SECONDS)/*最大元素个数1000, 元素个数接近临界点时,将按照LRU策略进行驱逐*/.maximumSize(1000)/*同步通知监听*/.removalListener(removalListener)/*异步通知监听*/
//          .removalListener(removalListenerBuild()).build();
/*周期性线程池*/private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);protected void executeCleanCache() {/*参数说明* 执行的线程任务* 初始化延迟1分则后执行* 每隔1分钟执行一次清除,本次执行结束后延迟1分钟开始下次执行* 时间单位(分钟)* */executorService.scheduleWithFixedDelay(new ClearUpExpired(), 1L, 1L, TimeUnit.MINUTES);}/*** @Description: TODO 任务执行完毕之后,关闭调度线程池* @author LWB* create on 2014年12月22日  上午9:50:50* @Title: shutdown void*/protected void shutdown() {executorService.shutdown();}/*** @Description: TODO 立即关闭所有正在执行的线程* @author LWB* create on 2014年12月22日  上午9:53:16* @Title: shutdownNow void*/protected void shutdownNow() {executorService.shutdownNow();}/*** 清除过期的缓存元素* @author  LWB* @version 1.0* Create on  2014年12月21日  下午10:01:18 * 网络配货服务技术有限公司  Copyright©2014*/private class ClearUpExpired implements Runnable {@Overridepublic void run() {cache.cleanUp();}}

日志为证

转载于:https://my.oschina.net/linwenbin/blog/359133

Google Guava Cache 移除监听器相关推荐

  1. (翻译)Google Guava Cache

    翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...

  2. mysql caching_Spring Caching抽象和Google Guava Cache

    mysql caching Spring为缓存昂贵的方法调用提供了强大的现成支持. 这里详细介绍了缓存抽象. 我的目标是使用Spring Guava Cache涵盖Spring现在提供的4.0+版本的 ...

  3. 正则表达式 guava_带有正则表达式模式的Google Guava Cache

    正则表达式 guava 最近我看到了一个关于Google Guava的不错的介绍 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣. 让我们看一下regexp Pattern类及其编译功能 . ...

  4. Spring Caching抽象和Google Guava Cache

    Spring为缓存昂贵的方法调用提供了强大的开箱即用支持. 这里详细介绍了缓存抽象. 我的目的是要介绍Spring现在为框架的4.0+版本提供的较新的缓存实现之一-使用Google Guava Cac ...

  5. 带有正则表达式模式的Google Guava Cache

    最近我看到了一个关于Google Guava的精彩演讲 ,我们在我们的项目中得出结论,使用它的缓存功能真的很有趣. 让我们看一下regexp Pattern类及其编译功能 . 在代码中经常可以看到,每 ...

  6. Google Guava Cache高效本地缓存

    目录 Guava Cache使用需求和场景 需求 场景 缓存设置 缓存的并发级别 缓存的初始容量设置 设置最大存储 缓存清除策略 基于存活时间的清除策略 基于容量的清除策略 基于权重的清除 策略 显式 ...

  7. guava_使用Google Guava Cache进行本地缓存

    guava 很多时候,我们将不得不从数据库或另一个Web服务获取数据或从文件系统加载数据. 在涉及网络呼叫的情况下,将存在固有的网络延迟,网络带宽限制. 解决此问题的方法之一是在应用程序本地拥有一个缓 ...

  8. 使用Google Guava Cache进行本地缓存

    很多时候,我们将不得不从数据库或另一个Web服务获取数据或从文件系统加载数据. 在涉及网络呼叫的情况下,将存在固有的网络等待时间,网络带宽限制. 解决此问题的方法之一是在应用程序本地拥有一个缓存. 如 ...

  9. Google guava cache源码解析1--构建缓存器(3)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 下面介绍在LocalCache(CacheBuilder, CacheLoader)中调用的一些方法: Ca ...

最新文章

  1. Oracle的参数文件pfile和spfile
  2. 语音怎么进入滤波器matlab,基于Matlab的语音信号滤波器的设计与实现
  3. 前端学习(2828):数组和对象循环
  4. 高效实用Kafka-入门介绍
  5. 怎么把matlab仿真数据压缩,JPEG图像压缩编码及其MATLAB仿真实现(1)
  6. 关于制作ppt的讲解
  7. android 科技感动画,PPT最炫动画,3分钟学会超有科技感的扫描动画,轰动全场!...
  8. mysql怎么实现表的复制粘贴_如何对MySQL数据表进行复制、表结构复制
  9. (C语言)2048游戏实现
  10. NUVOTON-MS51FB9AE规格书方案
  11. ubuntu企业微信解决无法查看、发送图片
  12. 百度mip推送工具_链接提交主动推送(实时)、熊掌号天级/周级提交、MIP提交
  13. verilog增量式编码器
  14. Apache服务器配置参数的全面说明(所有参数)
  15. 内网虚拟机静态IP设置VMWare内网通外网不通把某一网段白名单虚拟机ping不通主机虚拟机桥接改成非192.168网段服务器与电脑直连共享wifi
  16. 通过java解析域名获得IP地址
  17. iOS学习笔记12—听筒和扬声器的转换
  18. 行游在欧洲--意图带您领略不同的西…
  19. 使用ASP和ASP.NET来创建文件夹和文件。
  20. 安装试用国产系统 ——中标麒麟V7.0

热门文章

  1. 数据结构1_java---单链表的操作,约瑟夫问题
  2. Apache Ant运行时Unable to locate tools.jar解决方法
  3. Linux shell脚本基础学习详细介绍(完整版)一
  4. Silverlight Curve Animation / 曲线动画
  5. python实现手机通讯录_python+uiautomator2实现需求:从通讯录添加手机号码作为SOS紧急号码...
  6. 由神经网络的迭代次数计算输出值并评价网络性能
  7. 机器学习中的评价指标--1[F,P,R]
  8. 以下属于单例模式的优点的是_三、单例模式详解
  9. qgraphicsitem 复制副本_如何在pyqt5中复制粘贴Qgraphicsitem?
  10. 第4章-无人车UGV模型分析