Redis内存管理中的LRU算法
在讨论Redis内存管理中的LRU算法之前,先简单说一下LRU算法:
LRU算法:即Least Recently Used,表示最近最少使用页面置换算法。是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰,类似于末尾淘汰制。
比如:
如输入以下序列时:4,7,0,7,1,0,1,2,1,2,6
可以用一个特殊的栈来保存当前正在使用的各个页面的页面号。当一个新的进程访问某页面时,便将该页面号压入栈顶,其他的页面号往栈底移,如果内存不够,则将栈底的页面号移除。这样,栈顶始终是最新被访问的页面的编号,而栈底则是最近最久未访问的页面的页面号。
用java代码实现LRU算法如下:
1 import java.util.ArrayList;
2 import java.util.List;
3
4
5 public class LRU {
6 /**
7 * 内存块的个数
8 */
9 public static final int N = 5;
10 /**
11 * 内存块数组
12 */
13 Object[] array = new Object[N];
14 private int size;
15
16 public LRU() {
17 }
18 /**
19 * 判断内存区是否为空
20 * @return
21 */
22 public boolean isEmpty() {
23 if(size == 0) {
24 return true;
25 } else {
26 return false;
27 }
28 }
29 /**
30 * 判断内存区是否达到最大值
31 * @return
32 */
33 public boolean isOutOfBoundary() {
34 if(size >=N) {
35 return true;
36 } else {
37 return false;
38 }
39 }
40 /**
41 * 查找元素o在数组中的位置
42 * @param o
43 * @return
44 */
45 public int indexOfElement(Object o) {
46 for(int i=0; i<N; i++) {
47 if(o == array[i]) {
48 return i;
49 }
50 }
51 return -1;
52 }
53 /**
54 * 有新的数据o需要申请内存
55 * @param o
56 * @return 移出内存区的数据
57 */
58 public Object push(Object o) {
59 int t = -1;
60 if(!isOutOfBoundary() && indexOfElement(o) == -1){
61 array[size] = o;
62 size ++;
63 } else if(isOutOfBoundary() && indexOfElement(o) == -1){
64 for(int i=0; i<size-1; i++) {
65 array[i] = array[i+1];
66 }
67 array[size-1] = o;
68 } else {
69 t = indexOfElement(o);
70 for(int i=t; i<size-1; i++) {
71 array[i] = array[i+1];
72 }
73 array[size-1] = o;
74 }
75 if( -1 == t) {
76 return null;
77 } else {
78 return array[t];
79 }
80 }
81 /**
82 * 输出内存区中的各数据
83 */
84 public void showMemoryBlock() {
85 for(int i=0; i<size; i++) {
86 System.out.print(array[i] + "\t");
87 }
88 }
89
90 /**
91 * @param args
92 */
93 public static void main(String[] args) {
94 Integer iter[] = {4,7,0,7,1,0,1,2,1,2,6};
95 LRU lru = new LRU();
96 for(int i=0; i<iter.length; i++) {
97 lru.push(iter[i]);
98 lru.showMemoryBlock();
99 System.out.println();
100 }
101 }
102
103 }
LRU算法也可以用于一些实际的应用中,如你要做一个浏览器,或类似于淘宝客户端的应用的就要用到这个原理。大家都知道浏览器在浏览网页的时候会把下载的图片临时保存在本机的一个文件夹里,下次再访问时就会,直接从本机临时文件夹里读取。但保存图片的临时文件夹是有一定容量限制的,如果你浏览的网页太多,就会一些你最不常使用的图像删除掉,只保留最近最久使用的一些图片。这时就可以用到LRU算法 了,这时上面算法里的这个特殊的栈就不是保存页面的序号了,而是每个图片的序号或大小;所以上面这个栈的元素都用Object类来表示,这样的话这个栈就可以保存的对象了。
Redis的数据淘汰机制
Redis提供了5种数据淘汰策略:
- volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
- allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
- volatile-random:随机淘汰数据,只淘汰设定了有效期的key
- allkeys-random:随机淘汰数据,所有的key都可以被淘汰
- volatile-ttl:淘汰剩余有效期最短的key
一般来说,推荐使用的策略是volatile-lru,并辨识Redis中保存的数据的重要性。
配置方法: maxmemory-policy volatile-lru #默认是noeviction,即不进行数据淘汰
Redis内存管理中的LRU算法的更多相关文章
- Redis 笔记整理:回收策略与 LRU 算法
Redis的回收策略 noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外) allkeys-lru: 尝试回收最少使用的键(L ...
- 动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略
我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题, ...
- Redis 内存满了怎么办……
我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 通过在Redis安装目录 ...
- Redis 内存满了怎么办? Redis的内存淘汰策略
https://juejin.im/post/5d674ac2e51d4557ca7fdd70 Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限, ...
- Redis内存回收:LRU算法
Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...
- redis的LRU算法(一)
最近加班比较累,完全不想写作了.. 刚看到一篇有趣的文章,是redis的作者antirez对redis的LRU算法的回顾.LRU算法是Least Recently Used的意思,将最近最少使用的资源 ...
- Redis的LRU算法
Redis的LRU算法 LRU算法背后的的思想在计算机科学中无处不在,它与程序的"局部性原理"很相似.在生产环境中,虽然有Redis内存使用告警,但是了解一下Redis的缓存使用策 ...
- 【Redis 设置Redis使用LRU算法】
转自:http://ifeve.com/redis-lru/ 本文将介绍Redis在生产环境中使用的Redis的LRU策略,以及自己动手实现的LRU算法(php) 1.设置Redis使用LRU算法 L ...
- LRU工程实现源码(一):Redis 内存淘汰策略
目录 内存淘汰是什么?什么时候内存淘汰 内存淘汰策略 Redis中的LRU淘汰算法 源码剖析 第一步:什么时候开始淘汰key 配置读取 检查时机 getMaxmemoryState 第二步:淘汰哪些k ...
随机推荐
- 好你个C语言,原来还有这么多副面孔!
C语言可以这样比喻,是一门非常强大的内功心法,学会它可以做到一法通万法.这也是它至今不衰的原因.说了这么多C语言的优点,现在来说说它的缺点.C语言最大的优点也是它最大的缺点,拥有强大的力量时应时刻保持 ...
- unity3D进阶
前言 在之前的例子中,我们都没有用到unity的精髓,例如地形系统.物理系统.粒子系统等,本文记录unity3D的进阶简单应用 前期准备 https://unity.cn/releases/full/ ...
- 1、进程管理常用命令和进程ID
常用命令 1. ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器. 详细介绍参照:https://www.runoob.com/linu ...
- 京东零售mockRpc实践
https://mp.weixin.qq.com/s/A0T6ySub0DfQiXJAbWm2Qg jsf协议是基于tcp的而且对数据进行了序列化.加密等操作,直接截获的方式很难实现.最后决定注入自己 ...
- Go GC: Latency Problem Solved
https://talks.golang.org/2015/go-gc.pdf https://www.oschina.net/translate/go-gc-solving-the-latency- ...
- Page (computer memory) Memory segmentation Page table 虚拟地址到物理地址的转换
A page, memory page, or virtual page is a fixed-length contiguous block of virtual memory, described ...
- 本地MarkDown优雅发表
本地MarkDown优雅发表 前言 身为一名程序员,记录笔记.发表博客首选便是MarkDown,现在网上有好多发表博客的地方:CSDN.博客园.简书,甚至一些大佬都有自己专属博客,但自己最喜欢的还是博 ...
- HBase二级索引、读写流程
HBase二级索引.读写流程 一.HBse二级索引方案 1.1 基于Coprocessor方案 1.2 Phoenix二级索引特点 1.3 Phoenix 二级索引方案 二.HBase读写流程 2.1 ...
- Docker监控平台prometheus和grafana,监控redis,mysql,docker,服务器信息
Docker监控平台prometheus和grafana,监控redis,mysql,docker,服务器信息 一.通过redis_exporter监控redis 1.1 下载镜像 1.2 运行服务 ...
- linux系统命令(调试命令)(nmtui,ip a、ss、ps、uptime、top、lsof、grep,iotop、iftop)
本章命令 0 1 2 3 4 5 6 7 8 9 10 nmtui ip a ss ps uptime top lsof grep iotop iftop tsar nmtui 图形化管理网卡命令 依 ...