一、redis内存
配置文件中设置redis内存的参数:。
该参数如果不设置或者设置为0,则redis默认的内存大小为:
32位下默认是3G
64位下不受限制
一般推荐Redis设置内存为最大物理内存的四分之三,也就是0.75
命令行设置config set maxmemory <内存大小,单位字节>
,服务器重启失效
config get maxmemory
获取当前内存大小
永久则需要设置maxmemory参数,maxmemory是bytes字节类型,注意转换
info memory
:查看redis内存情况
当redis内存满的时候同样会报OOM
删除策略是预防redis内存占满情况,淘汰策略是在redis内存占满的情况下的处理措施。
二、过期key的删除策略
定时策略
:在设置键的过期时间的同时,创建⼀个定时器。当键的过期时间来临时,⽴即执⾏对键的删除操作。惰性策略
:每次获取键的时候,判断键是否过期,如果过期的话,就删除该键,如果没有过期,则返回该键。定期策略
:每隔⼀段时间,对键进⾏⼀次检查,删除⾥⾯的过期键 。Redis中过期的key是由主线程删除的,为了不阻塞⽤户的请求,所以删除过期key的时候是少量多次。 举例如下:
- 每秒进⾏10次过期扫描,每次从过期字典中随机选出20个key
- 删除20个key中已经过期的key
- 如果过期key的⽐例超过1/4,则进⾏步骤⼀
- 每次扫描时间的上限默认不超过25ms,避免线程卡死
定时删除策略对CPU不友好
,当过期键⽐较多的时候, Redis线程⽤来删除过期键,会影响正常请求的响应。
惰性删除读CPU是⽐较有好的,但是会浪费⼤量的内存
。如果⼀个key设置过期时间放到内存中,但是没有被访问到,那么它会⼀直存在内存中。
定期删除策略则对CPU和内存都⽐较友好
。
三、Redis缓存淘汰策略
noeviction
: 不会驱逐任何key,默认值
volatile-ttl
: 删除马上要过期的key
allkeys-lru
: 对所有key使用LRU算法进行删除
volatile-lru
: 对所有设置了过期时间的key使用LRU算法进行删除
allkeys-random
: 对所有key随机删除
volatile-random
: 对所有设置了过期时间的key随机删除
allkeys-lfu
: 对所有key使用LRU算法进行删除
volatile-lfu
: 对所有设置了过期时间的key使用LRU算法进行删除
lru
:Least recently used,最近最少使用,LinkedHashMap
自带该算法。
lfu
:Least Frequently Used ,最近最少频率使用算法,如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。
可以通过命令行进行设置:
config set maxmemory-policy allkeys-lru
,但当数据库重启之后会失效,若想永久有效,需要对配置文件信息进行修改,如下图所示: