目录
1、Redis内存淘汰策略
在redis作为缓存使用的过程中,当内存不足时,Redis根据配置进行缓存淘汰大部分keys,保证后续写入能够成功。
2、内存维护解决方案
在Redis的配置文件中redis.conf 中memeory managent
# maxmemory <bytes>
# MAXMEMORY POLICY:
# volatile-lru -> Evict using approximated LRU, only keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key having 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 evict anything, just return an error on write operations.
# The default is:
# maxmemory-policy noeviction
如果Redis没有设置最大内存大小或者设置为0,在64操作系统下Redis不限制使用内存大小,在32位操作系统下最多使用3/4内存空间。
2.1、内存操作命令:
config get maxmemory :查看最大内存情况
config set maxmemory value :设置大小
info memory :查看当前Redis内存使用命令
2.2、内存维护的方案主要是过期策略和内存淘汰策略
过期策略用户处理过期的缓存数据;
内存淘汰策略用于在 内存空间不足时需要额外申请空间的数据。
3、过期策略
redis中对过期的数据的处理,通常有三种方式:
1、定时过期:对每个设置过期时间的key都需要建一个定时器,到达过期时间会立即清除。该方法对内存友好,对CPU不友好,会占用大量的CPU资源去处理过期数据。
2、惰性过期:只有当访问一个key时,才会判断key是否过期,该方案最大化的节省CPU资源,但会占用内存资源(对CPU友好,对内存不友好)。
3、定期过期:每隔一定的时间,会扫描一定数据的expires字典中的一些数据,并清除掉其中已过期的数据。
expires字典会保存所有设置过期时间的数据。
4、内存淘汰策略
在内存不足时(内存使用已经超过mexmemory参数设定值时),需要处理新写入的且需要申请额外的空间的数据。
4.1、volatile-lru:从设置过期时间的数据集中(expires)中挑选出最近最少使用的数据淘汰。
4.2、volatile-ttl:从设置过期时间的数据集中(expires)中挑选中将要过期的数据淘汰,ttl的值越大越优先被淘汰。
4.3、volatile-random:从设置过期时间的数据集(expries)中随机的选取数据淘汰。
4.4、allkeys-lru:从数据集(dict)中挑选最近最少使用的数据淘汰,该策略要淘汰的数据是全体key的集合,而非过期的key。
4.5、allkeys-random:从数据集(dict)中选择任意数据淘汰。
4.6、noeviction:禁止删除数据,当内存不足时,新写入操作就会报错,请求可以继续进行,保证已插入的数据不会丢失。默认是noeviction。
5、主要策略:分为LRU淘汰、TTL淘汰、Random淘汰
5.1、LRU策略(最近最少使用),核心思想,如果数据最近被访问过,那么将来被访问的几率也就会越高。
5.2、TTL策略:在Redis中设置过期时间的数据集expires中挑选数据,根据ttl 过期时间来进行淘汰,值越大越先淘汰。
5.3、随机策略:在数据集中随机数据的获取进行删除。
5.4、LFU策略:Redis 4.0中新增策略,(最近最少使用)核心思想:如果数据在最近一段时间很少被访问到,那么认为数据在将来被访问的可能性也比较小,因此,当空间满时,最小访问频率的数据会被最先淘汰。
5.5、LRU与LFU是不同的:
LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!