一、内存淘汰策略
1.场景
redis的数据会在内存里面,并且有配置设置redis最多能占用多少内存,那就一定存在一个情况:当redis能占用的内存已满,但redis还需要再存新的数据在内存中,那怎么办?
这个就是内存淘汰策略解决的问题
2.配置redis最大占用内存
1.通过配置文件设置
redis.conf配置文件中添加以下配置,设置Redis最大占用内存大小为多少,比如
maxmemory 100mb
2.通过命令修改
设置Redis最大占用内存大小为100M
127.0.0.1:6379> config set maxmemory 100mb
获取配置的Redis能使用的最大内存大小
127.0.0.1:6379> config get maxmemory
如果设置为0表示没有限制
3.redis支持的内存淘汰策略
在配置文件redis.conf中
# maxmemory <bytes>
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# The default is:
# maxmemory-policy noeviction
redis3.0开始支持6种策略
1. volatile-lru
volatile表示:从设置了过期时间的数据集中根据某个算法(LRU)选出数据来淘汰。
lru表示:使用LRU(最近最少使用)算法进行淘汰
连起来就是:从设置过期时间的数据集(键值对过期时间的表,即 redisDb.expires)中挑选出最近最少使用的数据淘汰。
注意:没有设置过期时间的key不会被淘汰。
特点:在增加内存空间的同时保证需要持久化的数据不会丢失。
2. volatile-ttl
volatile表示:从设置了过期时间的数据集中根据某个算法(ttl)选出数据来淘汰。
ttl表示:过期时间,即使越快过期的约先被淘汰。
注意:没有设置过期时间的key不会被淘汰。
特点:在增加内存空间的同时保证需要持久化的数据不会丢失。
3. volatile-random
volatile表示:从设置了过期时间的数据集中根据某个算法(random)选出数据来淘汰。
random表示:随机。从设置了过期时间的数据集中随机选出数据来淘汰
注意:没有设置过期时间的key不会被淘汰。
特点:在增加内存空间的同时保证需要持久化的数据不会丢失。
4. allkeys-lru
allkey表示:从所有的数据集中根据某个算法(lru)选出数据来淘汰。
lru表示:使用LRU(最近最少使用)算法进行淘汰
5. allkeys-random
allkey表示:从所有的数据集中根据某个算法(random)选出数据来淘汰。
random表示:随机。从所有的数据集中随机选出数据来淘汰
6. no-enviction
默认的淘汰策略
no表示:不淘汰
此时,当内存不足以容纳新入数据时,新写入操作就会报错(DEL请求和部分特殊请求除外)
二、key过期策略
Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。
Redis中同时使用了惰性过期和定期过期
常见的过期策略有以下三种:
1.定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。
优点:可以立即清除过期的数据,对内存很友好。
缺点:会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2.惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。
优点:不过多占用CPU资源去做过期处理
缺点:该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3.定期过期
首先:redis中,每个库(0-15)都有一个expires字典,它会保存所有设置了过期时间的key的过期时间数据。
定期过期是说的:每隔一定的时间,会扫描一定数量的库(比如0-15号库其中几个库)的expires字典中一定数量的key,并清除其中已过期的key。
该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。