1、最近最少使用算法LRU (Least recently used,最近最少使用)

【实现】:最常见的是使用一个链表保存缓存数据

1、新数据插入到链表头部;

2、每当缓存命中(即缓存数据被访问),将数据移动到链表头部;

3、当链表满的时候将链表尾部的数据丢弃;

【代价】

命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部。

【改变】

基于以上代价,我们将维护的链表改为一个双向链表(即每个节点都有个prev和next),另外需要再多维护一个map,将缓存对象的引用放入map中;

1、新数据插入链表头部,并且放入map中

2、每当需要使用缓存时,首先通过key到map中查找,命中缓存后将数据移动到链表头部(这个移动就非常好移动了,只需要把该节点的prev节点的next属性赋值为该节点的next节点,同时把该节点的next节点的prev属性赋值为该节点的prev节点,并且将该节点放入链表头部就可以了)。

3、当链表满的时候将链表尾部的数据丢弃,并且删除map中对应的数据。

【结果】

基于以上改变的LRU算法,完全去除了命中缓存需要遍历链表这个缺点,性能得到了大的提升。

2、使用redis缓存数据,保证热点数据的缓存用法与原理

说一点:只要限制了redis占用的内存,redis会根据自身数据淘汰策略,加载热数据到内存。

【实现】:

通过redis本身的设置过期时间来实现缓存热点数据

1、缓存每命中一次,就重新给该数据设置过期时间

2、那么经常命中的缓存始终不会过期,不会被删除,而非热点数据过期时间一到那么就会被删除掉,保证了redis中始终存在的是热点数据。

【原理】

1、原理其实就是Java中延时阻塞队列DelayQueue的原理

2、当对redis中缓存数据设置过期时间,相当于将缓存数据放入redis中维护的延时阻塞队列DelayQueue。

3、DelayQueue会对放入的缓存数据根据过期时间进行排序,时间短的在前面,时间长的在队列后面。

4、会使用一个或者多个线程循环查询DelayQueue,一旦能从DelayQueue获取元素了就说明该缓存数据到期了,就可以取出来并且删除掉了。

5、当有多个线程都同时查询DelayQueue的时候,只有一个线程能够争取到头元素,其它线程将被阻塞。当头元素被取走以后,会唤醒所有阻塞线程,线程竞争头元素,竞争到头元素的线程会查询头元素的剩余delay时间,并且标记头元素已经被该线程占有,再根据delay时间wait自己,最后获取头元素后唤醒其它阻塞线程。

转载于:https://www.cnblogs.com/eoss/p/6202185.html

Java--缓存热点数据,最近最少使用算法相关推荐

  1. 设计一个缓存策略,动态缓存热点数据

    写在前面,因为我们最近的大作业项目需要用到热点排行这个功能,因为我们是要使用Elasticsearch来存储数据,然后最初设想是在ES中实现这个热点排行的功能,但是经过仔细思考,在我们这个项目中使用E ...

  2. redis 热点数据 缓存

    Redis 是什么 Redis 的五种基本类型 STRING LIST SET HASH ZSET 键的过期时间 发布与订阅 事务 持久化 快照持久化 AOF 持久化 复制 从服务器连接主服务器的过程 ...

  3. 热点数据的发现、处理、更新

    热点数据发现 1.发现静态热点数据:静态热点数据的发现相对简单些,是可以提前预估预测的数据.比如:秒杀活动商品.降价促销商品.节假日的火车票机票.热门电影门票.明星发布新专辑,以及大数据分析流行趋势预 ...

  4. 2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制

    摘要: Tair是阿里巴巴集团自研的弹性缓存/存储平台,在内部有着大量的部署和使用.Tair的核心组件是一个高性能.可扩展.高可靠的NoSQL存储系统.目前支持MDB.LDB.RDB等存储引擎.本文基 ...

  5. 阿里一面 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案

    作者:乔二爷,来自:乔二爷(ID:hellozhouq) 1 前言 昨天晚上接到阿里的电面电话,过程中就问到了关于缓存相关的问题.虽然以前接触过,多多少少了解了一些.但是之前自己并没有好好记录这些内容 ...

  6. java之ibatis数据缓存

    使用IBatis作数据缓存 1.SqlMapConfig.xml中 <settings cacheModelsEnabled="true" //设置为true enhance ...

  7. 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案(转)

    1.我们使用缓存时的业务流程大概为: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回.这种情况下就可能出现下面的一些现象. 2.缓存穿透 2.1什么是缓存穿 ...

  8. 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案

    关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案 参考文章: (1)关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案 (2)https://www.cnblogs.com/To ...

  9. java map 缓存数据_java使用hashMap缓存保存数据的方法

    本文实例讲述了java使用hashMap缓存保存数据的方法.分享给大家供大家参考,具体如下: private static final HashMap sCache = new HashMap(); ...

最新文章

  1. 单个Transformer完成信息检索,谷歌用可微搜索索引打败双编码器模型
  2. 密码学===公钥和私钥解释
  3. Bruce Eckel教你如何爬出 Gradle 的“坑”?
  4. hadoop3节点hdfs ha,yarn ha配置
  5. jquery中获取下拉框的文本值
  6. 九州云腾双因素认证系统_阿里云全资收购九州云腾,加速构建云上零信任体系...
  7. 基于注意力机制的知识图谱关系预测 ACL 2019
  8. 宇视录像机支持手机APP(EZView/智U)免账号添加操作步骤
  9. Linux软件安装方法之rpm包安装
  10. 全民一起VBA提高篇 专题1 第二回 变体终非万全策,数字要分长短型
  11. 关闭WPS广告弹窗骚扰(Kingsoft Office 推荐)
  12. 茎叶图、箱图是什么,如何用SPSS实现?(图文)
  13. 微纳自组装技术——纳米孔道阵列辅助自组装技术简述
  14. 路由器就能赚钱? 揭秘京东云无线宝背后的黑科技
  15. 戏精,程序员的桌面画风竟然是酱紫的!
  16. mc java送win10_微软针对Windows 10的免费Minecraft赠品在Java播放器的午夜结束
  17. stm32F4安装包MDK5
  18. 最全C++知识点--重载运算与类型转换
  19. 从文件获取文件内容并提取promise对象的result结果
  20. 盘符被修改为*的恢复方法

热门文章

  1. python数据处理实例-入门Python数据分析最好的实战项目(一)
  2. python界面图片-python图形用户界面(六):可视化给图片添加上文字
  3. python爬虫教程pdf-《Python爬虫开发与项目实战》pdf完整版
  4. python编写一个软件-软件代做:利用Python编写一个行业专用的小计算器
  5. python软件怎么用-如何使用Python编写一个桌面软件系统?步骤有哪些
  6. 用python画猫咪怎么画-使用Python的turtle画小猫咪
  7. python 3.5-python3.5
  8. python的优点和缺点-python的优点和缺点是什么?
  9. 用python画皮卡丘画法-python turtle绘图库绘制【皮卡丘】源码
  10. c+和python的区别-python和c先学哪个