Redis的过期策略和内存淘汰机制

时间:2021-07-14
本文章向大家介绍Redis的过期策略和内存淘汰机制,主要包括Redis的过期策略和内存淘汰机制使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一.Redis过期策略

1. 设置过期命令

expire设置生存时间
expireat设置过期时间点(时间戳)

2. key的3种过期策略

(1)定时删除:在设置过期时间的同时,设置一个定时器,定时器的执行时间就是过期的时间点。
优点:对内存最友好,过期的键会以最快的被删除,释放内存。
缺点:对CPU时间最不友好,在大量键设置过期时间时,会创建大量的定时器,执行浪费CPU时间。
2)惰性删除:不管键是否过期,只有每次取值的时候,才检查是否过期,过期就删除。 优点:对CPU时间最友好,取值时检查,只对当前键操作,不影响其他。 缺点:对内存不友好,可能会存在大量过期的未被使用的键值没有删除,无用数据占用了大量内存。
3)定期删除:每隔一段时间,程序对数据库进行一次检查,过期的就删除。 优点:前两种方案的折中,通过减少执行频率来减少对CPU时间的影响,通过定期删除减少了对内存的浪费。 缺点:执行频率需要掌握好,不然太频繁则退化成定时删除,太少则退化成惰性删除。

3.Redis默认采用的是惰性删除和定期删除两种策略

定期删除:指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除
惰性删除:在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了,如果过期了此时就会删除,不会给你返回任何东西

4.持久化和主从复制对过期键的处理

(1)RDB持久化
写入rdb文件:程序会对过期键进行检查, 过期键不写入
加载rdb文件:如果以主服务器模式运行,程序会对文件中保存的键进行检查,仅加载未过期的键,而过期键则会忽略;
           如果以从服务器模式运行, 不会检查是否过期,数据都会载入(过期键会通过与主服务器同步而删除)
2)AOF持久化 AOF文件写入时,键已过期但未删除,不影响;键过期已删除,则在AOF文件后追加一条DEL命令。 AOF重写过程中, 程序会对数据库中的键进行检查,过期的键会忽略, 不会被保存到重写后的aof文件中。
3)主从复制 主从模式下,由主服务器进行删除过期键,并显示的向从服务器发送DEL命令; 从服务器自身不具备删除过期键值行为, 它的过期删除动作由主服务器控制 (从服务器只有在接到主服务器发来的del命令后,才会删除过期键)。

二.Redis内存淘汰机制

1. 概念

当Redis的内存使用达到设置的内存上限时就会触发内存淘汰机制(用户存储的一些键被可以被Redis主动地从实例中删除),按照特定的淘汰算法进行数据清理,释放内存

2. 配置方式

我们通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能(maxmemory为0的时候表示我们对Redis的内存使用没有限制)
我们通过配置redis.conf中的maxmemory
-policy来指定淘汰策略(默认是noeviction策略)

3. 8种内存淘汰策略(默认noeviction)

noeviction: 不淘汰,在redis的内存超过限制之后,新的写入会报错, 读操作正常运行
allkeys
-lru:LRU算法,内存不足时,在所有key中淘汰最近最少使用的key allkeys-lfu: 内存不足时,在所有key中淘汰使用频次最少的key allkeys-random:随机,内存不足时,在所有key中随机选择一个key淘汰
volatile-lru:内存不足时,在设置了过期时间的key中,淘汰最近最少使用的key volatile-lfu: 内存不足时,在设置了过期时间的key中,淘汰使用频次最少的key volatile-random:内存不足时,在设置了过期时间的key中,随机选择一个key淘汰 volatile-ttl:内存不足时,在设置了过期时间的key中,选择即将要过期的key淘汰

原文地址:https://www.cnblogs.com/Baker-Street/p/15012067.html