我们知道Redis是基于内存来存储数据的,这也是它之所以查询速度这么快的原因之一。但是在数据量较大的场景下如果一直网缓存中存数据那么就会报OOM异常,因此我们就需要使用下面八种缓存淘汰策略对缓存进行删除处理。
1、noeviction:返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。
2、allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
3、volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存 放。
4、allkeys-random: 回收随机的键使得新添加的数据有空间存放。
5、volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
6、volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间 存放。
7、allkeys-lfu:对所有key使用LFU算法进行删除
8、volatile-lfu:对所有设置了过期时间的key使用LFU算法进行删除

本文主要针对LRU算法展开论述
一、什么是LRU算法

就是一种缓存淘汰策略。
计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?
LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。
通俗点讲就删除缓存时优先删除最久未被操作的数据,增删改查都属于操作的范畴。

二、LRU 算法描述
LRU 算法实际上是让你设计数据结构:首先要接收一个 capacity 参数作为缓存的最大容量,然后实现两个 API,一个是 put(key, val) 方法存入键值对,另一个是 get(key) 方法获取 key 对应的 val,如果 key 不存在则返回 -1。

三、LRU 算法设计
分析上面的操作过程,要让 put 和 get 方法的时间复杂度为 O(1),我们可以总结出 cache 这个数据结构必要的条件:查找快,插入快,删除快,有顺序之分。
因为显然 cache 必须有顺序之分,以区分最近使用的和久未使用的数据;而且我们要在 cache 中查找键是否已存在;如果容量满了要删除最后一个数据;每次访问还要把数据插入到队头。
那么,什么数据结构同时符合上述条件呢?哈希表查找快,但是数据无固定顺序;链表有顺序之分,插入删除快,但是查找慢。所以结合一下,形成一种新的数据结构:哈希链表。

四、代码实现
很多编程语言都有内置的哈希链表或者类似 LRU 功能的库函数,但是为了帮大家理解算法的细节,我们用 Java 自己造轮子实现一遍 LRU 算法。

class LRUCache {Map<Integer,Node> map;Node head;Node tail;int capacity;public LRUCache(int capacity) {this.map=new HashMap<>(capacity);this.capacity=capacity;this.head=new Node(0,0);this.tail=new Node(0,0);this.head.next=tail;this.tail.pre=head;}public int get(int key) {if(!map.containsKey(key)){return -1;}Node node=map.get(key);move2first(node);return node.val;}public void put(int key, int value) {if(map.containsKey(key)){Node node=map.get(key);node.val=value;map.put(key,node);move2first(node);return;}if(map.size()==capacity){Node last=this.tail.pre;map.remove(last.key);removeNode(last);}Node node=new Node(key,value);add2first(node);map.put(key,node);}public void removeNode(Node node){//删除节点node.pre.next=node.next;node.next.pre=node.pre;node.next=null;node.pre=null;}public void add2first(Node node){//添加节点Node curr=this.head.next;this.head.next=node;node.next=curr;node.pre=this.head;curr.pre=node;}public void move2first(Node node){//移动节点node.pre.next=node.next;node.next.pre=node.pre;add2first(node);}//定义链表class Node{Node pre;//上一个节点Node next;//下一个节点int key;int val;public Node(int key,int val){this.key=key;this.val=val;}}
}

Redis缓存淘汰之LRU相关推荐

  1. Redis缓存淘汰策略

    文章目录 noeviction allkeys-lru allkeys-lfu volatile-lru volatile-lfu allkeys-random volatile-random vol ...

  2. Redis缓存淘汰机制

    Redis缓存淘汰机制  当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换,这样会使得redis的性能急剧下降. 在生产环境中,是不允许redis出现交换行为的,为了限制最大使 ...

  3. mysql缓存淘汰机制_聊聊缓存淘汰算法-LRU 实现原理

    前言 我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来.缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据.常用淘 ...

  4. 缓存淘汰算法--LRU算法

    缓存淘汰算法--LRU算法 参考: https://www.cnblogs.com/dailidong/p/7571178.html https://blog.csdn.net/wangxilong1 ...

  5. 源码角度详解Redis缓存淘汰机制(Eviction)

    本文从源码层面分析了 redis 的缓存淘汰机制,并在文章末尾描述使用 Java 实现的思路,以供参考. 相关配置 为了适配用作缓存的场景,redis 支持缓存淘汰(eviction)并提供相应的了配 ...

  6. Redis内存淘汰策略LRU、LFU详解

    Redis内存淘汰原因 Redis是一种内存数据库,redis的容量往往有限,无法存放所有的数据.当内存满了的时候,并且这个时候还需要往Redis中放入新的数据,就需要将Redis中的一部分数据淘汰了 ...

  7. 缓存淘汰算法——LRU算法详细总结及代码实现

    什么是LRU算法? LRU是一种缓存淘汰策略,对于我们的计算机来说,缓存容量是有限的,那么当缓存满了要怎么办?这时就要用到LRU,对于很久没有用过的数据,我们可以将其判定为无用的数据,当新资源进入缓存 ...

  8. redis 缓存 淘汰

    1.LRU LRU(Least recently used,最近最少使用) 其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". 基本思路 新数据插入到列表头部: 每 ...

  9. 缓存淘汰策略—LRU算法(java代码实现)

    LRU 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高" ...

最新文章

  1. 样式文件修改后不起作用_Word样式,这个功能好用到让你忘不了!
  2. html viewer.app,HTML Viewer studio classroom
  3. 苹果今年秋季或发布史上最多新品
  4. [转载] ml-8-1-聚类( ( Clustering) )
  5. Atitit 上传进度的实现与原理 目录 1.1. 前端 1 1.2. 读取进度 1 1.3. 后端 定时注入进度 1 1.1.前端                         wind
  6. python的objectproperty,python – ObjectProperty类的用法
  7. 基于Python实现的DHT嗅探器
  8. 104规约使用总结(一)——格式介绍
  9. python爬虫requests设置代理ip_Python 爬虫的代理 IP 设置方法汇总
  10. 为RK3399,树莓派等开发板安装安卓、Linux等系统
  11. 自动化工具之UIAutomator
  12. 推荐书籍:软件定义网络 SDN与OpenFlow解析
  13. 第二章补充____微分中值定理及导数应用
  14. python美元汇率兑换程序代码_如何实现python汇率转换代码
  15. 自媒体赚钱系列连载03:音乐人有收益自媒体平台大全
  16. 心电信号调理电路设计
  17. 笔记:光场相机能否用于SLAM?
  18. 复分析理论---如何形象理解平均值公式和最大模原理
  19. 了解arguments
  20. 【Android Gradle 插件】DexOptions 配置 ② ( additionalParameters 属性配置 | dx 工具 | dx 附加参数 )

热门文章

  1. python opencv图像拼接
  2. openpyxl详细教程
  3. Druid 介绍及配置(转载)
  4. 减肥瘦身误区盘点,这3种“黄色水果”,反而让您更长肉!
  5. 四、分享优秀的书籍地址
  6. 《逃离100层》攻略13、19关
  7. Grafana InfluxDB 简单脚本
  8. Excel应该这么玩——7、我是预言家:绘制趋势图
  9. 从choice金融终端自动更新特定自选股的每日公司公告并生成特定模板的文本段落
  10. 【分享】PowerPoint如何设置保护和加密?