Redis淘汰删除策略

6种淘汰Key策略

Redis中通过maxmemory参数来设定内存的使用上限,当Redis使用内存达到设定的最大值的时候,会根据配置文件中的策略选取要删除的key来删除,从而给新的键值留出空间;

目前Redis提供了6种的淘汰策略(默认的是noeviction):

  • volatile-lru,在设置了过期时间的键空间中,移除最近最少使用的key;

  • allkeys-lru,移除最近最少使用的key;

  • volatile-random,在设置了过期时间的键空间中,随机移除一个key;

  • allkeys-random,随机移除一个key;

  • volatile-ttl,在设置了过期时间的键空间中,移除将要过期的key;

  • noeviction,当内存使用达到阀值的时候,所有引起申请内存的命令会报错;

3种删除过期键策略

前面我们知道需要淘汰掉哪些过期Key,但是我们应该怎么去淘汰这些过期key呢?有3种删除的操作策略:

定时删除

在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作;

定时删除操作对于内存来说是友好的,内存不需要操作,而是通过使用定时器,可以保证尽快的将过期键删除,但是对于CPU来说不是友好的,如果过期键比较多的话,起的定时器也会比较多,删除的这个操作会占用到CPU的资源;

惰性删除

放任键过期不管,但是每次从键空间中获取键是,都检查取得的键的过期时间,如果过期的话,删除即可;

惰性操作对于CPU来说是友好的,过期键只有在程序读取时判断是否过期才删除掉,而且也只会删除这一个过期键,但是对于内存来说是不友好的,如果多个键都已经过期了,而这些键又恰好没有被访问,那么这部分的内存就都不会被释放出来;

定期删除

每隔一段时间,程序就对数据库进行一次检查,删除掉过期键;

定期删除是上面两种方案的折中方案,每隔一段时间来删除过期键,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响,除此之外,还有效的减少内存的浪费;但是该策略的难点在于间隔时长,这个需要根据自身业务情况来进行设置;

目前,Redis采用的是惰性删除+定期删除的方案;

其他模块的淘汰处理

目前Redis提供了两种持久化方式,分别是RDB和AOF;

RDB 快照持久化

创建

RDB是通过创建快照获取内存中的数据在某一个时间点上的数据的副本;有两个命令可以创建RDB文件,分别是SAVEBGSAVE,两者的区别在于是否阻塞进程去创建RDB文件,这两个命令都不会将数据空间中的过期键给保存到RDB文件中

载入

在启动Redis服务器时,如果服务器开启了RDB文件,那么服务器就会对RDB文件进行载入,需要注意⚠️的是:

  • 如果当前服务器是Master,那么过期键将会被忽略,不会载入到主服务器中;

  • 如果当前服务器是Slave,文件中所有键,不过是否过期都会被载入到从服务器中;

AOF 只追加持久化

写入

数据库中的过期键没有被删除时,其不会对AOF文件有任何的影响;当过期键被删除以后,程序会向AOF文件追加一条DEL命令,显示记录该键已经被删除;

重写

AOF是将执行的写命令添加到AOF文件的末尾来记录数据的变化;为了避免文件被添加得越来越大,甚至有可能用完硬盘的所有空间,因此Redis提供了Rewrite的优化策略,分别是REWRITEAOFBGREWRITEAOF,两个命令的区别也是在于是否阻塞主进程,这两个命令都不会将数据空间中的过期键给保存到AOF文件中

主从复模式下对过期键的处理

通常在主从模式下,主服务器来读取写命令,从服务器用来读取读命令,分担主服务器的压力(与那种持久化模式无关),需要注意⚠️的是:

  • 如果当前服务器是Slave的话,如果有命令读取当前过期键的话,不会惰性删除,因为这会影响读取的性能,因此不会删除,并且返回过期键对应的值;除非是Master服务器同步告知Slave服务器需要删除过期键才会删除;

  • 如果当前服务器是Master的话,当服务器通过策略得知某个键过期,则将该过期键给删除,并且同步给其他从服务器让它们删除掉该键;

Redis淘汰删除策略的更多相关文章

  1. 面试官:Redis 过期删除策略和内存淘汰策略有什么区别?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. Redis 的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都 ...

  2. redis 数据删除策略和逐出算法

    数据存储和有效期 在 redis 工作流程中,过期的数据并不需要马上就要执行删除操作.因为这些删不删除只是一种状态表示,可以异步的去处理,在不忙的时候去把这些不紧急的删除操作做了,从而保证 redis ...

  3. Redis详解(十一)------ 过期删除策略和内存淘汰策略

    在介绍这篇文章之前,我们先来看如下几个问题: ①.如何设置Redis键的过期时间? ②.设置完一个键的过期时间后,到了这个时间,这个键还能获取到么?假如获取不到那这个键还占据着内存吗? ③.如何设置R ...

  4. 【Redis】过期键删除策略和内存淘汰策略

    Redis 过期键策略和内存淘汰策略 目录 Redis 过期键策略和内存淘汰策略 设置Redis键过期时间 Redis过期时间的判定 过期键删除策略 定时删除 惰性删除 定期删除 Redis过期删除策 ...

  5. Redis 键的过期删除策略及缓存淘汰策略

    前言 Redis缓存淘汰策略与Redis键的过期删除策略并不完全相同,前者是在Redis内存使用超过一定值的时候(一般这个值可以配置)使用的淘汰策略:而后者是通过定期删除+惰性删除两者结合的方式进行内 ...

  6. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

  7. Redis 中的过期删除策略和内存淘汰机制

    Redis 中 key 的过期删除策略 前言 Redis 中 key 的过期删除策略 1.定时删除 2.惰性删除 3.定期删除 Redis 中过期删除策略 从库是否会脏读主库创建的过期键 内存淘汰机制 ...

  8. redis 的过期策略都有哪些?内存淘汰机制都有哪些?

    面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...

  9. redis中key的过期键删除策略

    Redis过期键删除策略 Redis key过期的方式有三种: 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删 ...

随机推荐

  1. Python select IO多路复用

    一.select介绍 Python的select()函数是底层操作系统实现的直接接口.它监视套接字,打开文件和管道(任何带有返回有效文件描述符的fileno()方法),直到它们变得可读或可写,或者发生 ...

  2. 使用光盘搭建本地yum源

    刚装好的系统,想安装一些常用软件和一些包组的时候,就可以使用安装光盘搭建本地yum 第一步:挂载安装光盘 mount /dev/cdrom /mnt 第二步:编辑repo yum源文件 [root@l ...

  3. (常用)re模块

    re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...

  4. zabbix监控短信息接口是否正常

    1.创建Web scenarios 2.创建zabbix触发器name:short_message send status is not 100 Expression:{u04zbx01.yaya.c ...

  5. nginx报错:403 Forbidden 并且访问首页index.php是下载文件的状态

    nginx报错:403 Forbidden 并且访问首页index.php是下载文件的状态,不能正常解析php 系统有其他两个站访问是正常的 看日志没有看到明显的错误 搜索了下: 答案如下: php的 ...

  6. cacti系列(一)之cacti的安装及配置监控mysql服务

    简介 Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构 ...

  7. 配置spring所需要的jar包

    spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...

  8. lr

    Action(){ //获取响应结果 web_reg_save_param("system_code", "LB=system_code\":\"&q ...

  9. ubuntu 窗口操作快捷键

    alt + space 打开窗口菜单SUPER + A: 搜索或浏览程序 SUPER/alt + tab: 切换窗口 SUPER + L: 进入睡眠状态 SUPER + M:查看日历

  10. PHP实现获取文件后缀名的几种常用方法

    方法1: function get_file_type($filename){ $type = substr($filename, strrpos($filename, ".")+ ...