淘汰策略
内存配置
redis内存配置参数为 maxmemory=0
redis默认配置使用系统最大内存,不过依照经验来看,最好配置为系统内存的 3/4
淘汰策略的分类
概念说明
lru 全称为 least recently used 最近最少使用
lfu 全程为 least frequency used 最少频率使用
具体分类
- volatile-lru 从设置了过期时间的数据集中找到最近最少使用的进行回收
- volatile-lfu 从设置了过期时间的数据集中找到最少频率使用的进行回收
- volatile-random 从设置了过期时间的数据集中随机进行回收
- volatile-ttl 从设置了过期时间的数据集中挑选将要过期的进行回收
- allkeys-lru 从所有key中找到最近最少使用的进行回收
- allkeys-lfu 从所有key中找到最小频率使用的进行回收
- allkeys-random 从所有key中随机进行回收
- no-evaction 不进行回收,直接抛出异常
使用说明
系统默认使用的是 no-evaction 策略
根据经验或者应用场景,我们一般配置 volatile-lru 策略
在 redis4.0 后新增了 lfu两种内存回收策略
过期删除策略
分类
分类 | 说明 | 优势 | 劣势 |
定时删除 | key值设置过期时间后,redis会开启新的线程进行倒计时,倒计时结束后会进行删除操作 | 删除比较及时,节约内存 | 消耗cpu资源 |
惰性删除 | 当读取数据(get,hget操作)的时候,会调用expireIfNeeded函数删除过期的数据,该函数判断当前获取数据是否过期,如果已经过期,调用dbDelete函数把它从数据库中删除. dbDelete函数除了删除数据外,还会把数据的过期时间信息删除 | 节省cpu资源 | 很多不活跃的key值不会触发回收,导致内存占用较大 |
定期删除 | 每隔一段时间,会对设置过期时间的键进行检查,删除里面的过期键 | 对cpu比较友好 | 仍然会有部分key值占用内存,导致内存占用过多 |
redis默认会采用 定期删除+惰性删除的方式,来达到内存和cpu的消耗平衡
RDB和AOF对过期键的处理
RDB
- 执行save或者bgsave命令会创建一个新的RDB文件,程序会对数据库中的键进行检查,对已过期的键不会存储到新的RDB文件中, 数据库中包含过期键不会对新生成的RDB文件产生影响
- 如果服务器以主从模式运行,会有下面的区别
2.1 服务器已主服务器运行,载入RDB文件时,程序对文件中保存的过期键进行检查,未过期的会被载入数据库,已过期的会被忽略.所以过期键对载入RDB文件的主服务器不会有影响
2.2 服务器已从服务器运行,载入RDB文件时,文件中保存的所有键,无论是否过期,都会载入数据库中,因为主从服务器进行数据同步的时候,从服务器的数据库会被清空,所以过期键对载入RDB的从服务器也不会有影响
AOF
AOF文件写入
当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但是还没被惰性删除和定期删除,AOF文件也不会因为这个过期键产生影响
- 过期键呗惰性删除/定期删除后,redis会向AOF文件追加一条DEL命令,显示记录该键被删除
AOF重写
在执行AOF重写过程,程序会对数据库中键进行检查,已过期的键不会被保存到重写后的AOF文件中