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