一文读懂Redis内存淘汰策略(redis的内存淘汰策略)
mhr18 2024-10-24 11:13 30 浏览 0 评论
Redis内存淘汰的必要性
我们都知道redis的性能很高,最主要的原因之一就是redis的数据都在内存中放着,我们在从redis中获取数据或者更新redis中的数据时,都是操作的内存中的数据。而当内存被占满了之后怎么办呢?这时就有必要将一些数据清理掉,以便新的数据能够放到redis中。而清理掉哪些数据?保留哪些数据?什么时候清理?如何配置这些策略?这些就是接下来要研究的内容。
Redis的key过期策略
Redis中可以为key设置过期时间,当到达过期时间后,就需要将这个key删除掉。Redis中提供了两种过期删除策略:惰性删除和定期删除。
- 定期删除
Redis会将每个设置了过期时间的key放入到一个独立的字典中,以后会定期遍历这个字典来删除到期的key。Redis默认每秒进行10次过期扫描(100ms一次,可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数),但这个扫描并不会扫描过期字典中所有的key,而是通过一种贪心策略来随机筛选删除key,步骤如下:
- 从过期字典中随机选出20个key;
- 删除这20个key中已经过期的key;
- 如果过期的key的比例超过了1/4,那就重复从步骤1开始执行。
之所以采用这种扫描策略,还是为了性能考虑。假如过期字典中有数百万个key,每隔100ms就扫描一次这数百万个key,会给CPU造成很大的负荷,所以,就选择了这种随机筛选部分key,然后按照过期比例来判断是否需要重复执行筛选过期的动作。
正是由于使用了这种扫描策略,定期删除可能会造成很多已经过期的key无法及时删除,所以就有了接下来的惰性删除策略。
- 惰性删除
所谓惰性删除就是在客户端访问这个key的时候,Redis对key的过期时间进行检查,如果过期了就立即删除,然后返回null。
不管是定期删除还是惰性删除,都是一种不完全精确的删除策略,始终还是会存在已经过期的key无法被删除的场景。而且这两种过期策略都是只针对设置了过期时间的key,不适用于没有设置过期时间的key的淘汰,所以,Redis还提供了内存淘汰策略,用来筛选淘汰指定的key。
Redis内存淘汰策略
我们在之前的文章中学习过两种内存淘汰算法:LRU算法详解和LFU算法详解,redis提供的内存淘汰策略中就有一部分是基于这两种算法实现的,如果对这两种算法不太熟悉,可以先学习下这两篇文章的内容。Redis目前共提供了8种内存淘汰策略,其中有两种基于LFU算法的策略是Redis4.0版本之后增加的。接下来让我们一起了解下这8种淘汰策略:
- noeviction:只返回错误,不会删除任何key。该策略是Redis的默认淘汰策略,一般不会选用。
- volatile-ttl:将设置了过期时间的key中即将过期(剩余存活时间最短)的key删除掉。
- volatile-random:在设置了过期时间的key中,随机删除某个key。
- allkeys-random:从所有key中随机删除某个key。
- volatile-lru:基于LRU算法,从设置了过期时间的key中,删除掉最近最少使用的key。
- allkeys-lru:基于LRU算法,从所有key中,删除掉最近最少使用的key。该策略是最常使用的策略。
- volatile-lfu:基于LFU算法,从设置了过期时间的key中,删除掉最不经常使用(使用次数最少)的key。
- allkeys-lfu:基于LFU算法,从所有key中,删除掉最不经常使用(使用次数最少)的key。
需要注意的是,Redis中的LRU算法并没有严格按照常规的LRU算法的方式实现,而是基于LRU算法的思想做了自己的优化。在之前文章LRU算法详解中我们知道,实现LRU算法时,需要将所有的数据按照访问时间距离当前时间的长短排序放到一个双向链表中,基于这个链表实现数据的淘汰。但Redis中存储的数据量是非常庞大的,如果要基于常规的LRU算法,就需要把所有的key全部放到这个双向链表中,这样就会导致这个链表非常非常大,不止需要提供更多的内存来存放这个链表结构,而且操作这么庞大的链表的性能也是比较差的。
所以,Redis中的LRU算法是这样实现的:首先定义一个淘汰池,这个淘汰池是一个数组(大小为16),然后触发淘汰时会根据配置的淘汰策略,先从符合条件的key中随机采样选出5(可在配置文件中配置)个key,然后将这5个key按照空闲时间排序后放到淘汰池中,每次采样之后更新这个淘汰池,让这个淘汰池里保留的总是那些随机采样出的key中空闲时间最长的那部分key。需要删除key时,只需将淘汰池中空闲时间最长的key删掉即可。
为了方便理解它的思想,我画了一个图:
Redis内存淘汰策略的配置
学习了这8种内存淘汰策略之后,Redis要什么时候会触发执行这些淘汰策略呢?又要怎么指定使用哪一种淘汰策略呢?这就要去Redis的配置文件中进行配置了
- 配置redis最大内存
在配置文件redis.conf 中,可以通过参数 maxmemory <bytes> 来设定最大内存:
当数据内存达到 maxmemory 时,便会触发redis的内存淘汰策略。该参数通常设定为其物理内存的四分之三。
- 配置redis淘汰策略
在配置文件redis.conf 中,通过设置 maxmemory-policy 来指定使用哪种内存淘汰策略:
- 配置最大采样数量
上文在讲Redis的LRU算法的时候,提到了Redis每次会随机选择5个key放入淘汰池中,这个5的数量就是在redis.conf配置文件中通过 maxmemory-samples 选项配置的:
到这里相信我们已经熟练掌握了Redis的内存淘汰策略以及如何配置使用Redis的内存淘汰策略,后续文章会继续针对Redis这一中间件的知识做一系列的学习。如果想要了解更多Redis的知识,可以查看我的历史文章。
点关注不迷路,跟我一起学技术!
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)