RDB内存回收机制主要从两方面考虑
删除过期键
redis可以对所有的键设置过期属性,过期键会存在过期字典中,字典中保存了大量的过期键会占用内存,所以要有删除机制。过期键删除有三种机制
- 定时删除
设置一个过期键的同时,会创建一个定时器,让定时器在过期时间来临的时候执行过期操作。这样,删除过期键会占用CPU的时间,影响服务器的吞吐量
优点:能尽快释放内存,最大程度节省空间
缺点:需要大量的定时器去删除过期键,占用CPU时间,影响服务器的性能 - 惰性删除
对过期时间放任不管,但是每次从键空间去获取的时候,都会去检查是否过期,如果已过期,执行删除操作,如果没有,返回该键。被动删除
优点:就不会占用CPU的时间
缺点:对内存很不友好 - 定期删除
定期删除是定时删除和惰性删除的折中,每隔一段时间,程序就会对数据进行检查,删除里面的过期键,限制删除过期键的时长和频率,来减少删除操作对CPU的影响
redis.conf 配置文件hz
默认是每秒运行10次
redis是使用定期删除和惰性删除两种
####AOF、RDB和复制功能对过期键的影响
- RDB
1、生成RDB文件
在执行save或bgsave命令生成新的RDB文件时,会对过期键进行检查,如果键已经过期,不写写入RDB文件
2、执行RDB文件
在重启Redis服务器时,如果已经开启了RDB,会载入RDB 文件。如果是以主服务器进行载入,会对RDB文件的过期键进行检查,不会把已过期的键载入数据。如果是以从服务器进行载入,不会删除过期键,但是同步的时候会删除,所以也不会保留过期键 - AOF
1、写入AOF文件
在写入AOF文件的时候,如果过期键还没有被定期删除或者惰性删除,那么写入的时候会保留过期键,但是在被定期或惰性删除的时候,会加入一条delete命令,来记录该键已被删除
2、AOF文件重写
AOF重写的时候会对过期键进行检查,已过期的键不会被重写到数据,因此过期键不会对AOF有影响 - 复制
主服务器会删除过期键,同时会发给从服务器该操作
内存溢出淘汰策略
当Redis内存达到maxmemory上限时会出发响应的内存溢出策略,具体策略配置受maxmemory-policy控制
- volatile-lru:当内存空间不足以写入新数据时,在设置了过期时间的键中,移除最近很少用的key
- allkeys-lru:当内存空间不足以写入新数据时,在键空间中,移除最近很少使用的key
- volatile-lfu:当内存空间不足以写入新数据时,在设置了过期时间的键中,移除最少用的key
- allkeys-lfu:当内存空间不足以写入新数据时,在键空间中,移除最少用的key
- volatile-random:当内存空间不足以写入新数据时,在设置了过期时间的键中,随机选择某个删除,不推荐
- allkeys-random:当内存空间不足以写入新数据时,在所有的键中,随机删除某个key,不推荐
- volatile-ttl:当内存不足以写入新的数据时,在设置了过期时间的键空间中,选择最早时间过期的键删除,不推荐,如果没有设置过期时间的键,会报错
- noeviction:默认策略,当内存不足以写入新数据时,直接报错