文章目录
- 一、面试题
- 二、redis内存
- 1. Redis的内存大小怎么查看?
- 2. 设置redis内存
- 3. redis内存的OOM
- 三、redis内存淘汰策略
- 1. redis的过期键删除策略
- 2. redis缓存淘汰策略
一、面试题
1. 生产上你们redis内存设置多少?
2. 如何配置、修改redis内存大小?
3. 如果内存满了你怎么办?
4. redis清理内存的方式? 定期删除和惰性删除了解过吗?
5. redis缓存淘汰策略有哪些?分别是什么? 你用哪个?
6. redis的LRU了解过吗? 请手写LRU算法?
7. LRU和LFU的区别是什么?
二、redis内存
redis内存满了怎么办?
1. Redis的内存大小怎么查看?
打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转化
我们可以看看redis默认的最大内存大小:
我们可以看到redis默认的内存大小为0,意思是如果我们不设置最大内存大小,0就表示不限制redis内存使用(在64位操作系统中,在32位机中redis默认能使用的最大内存是3GB)。
在实际生产中,我们推荐redis设置内存为最大物理内存的四分之三。
2. 设置redis内存
手动设置redis内存有两种方式,一种是直接在配置文件中修改,另一种是通过下面的命令修改:
#这种设置方式只是临时有效,重启后又会恢复原来配置文件的设置
config set maxmemory 104857600
- 什么命令可以查询redis内存使用情况
info memory
config get maxmemory
3. redis内存的OOM
如果redis超过了设置的最大值会怎么样?
上面的案例中我将redis的内存临时设置为1字节,然后插入一个key,发现报出了OOM异常
三、redis内存淘汰策略
redis里写的数据是怎么没了的?它如何删除?
1. redis的过期键删除策略
如果一个键是过期的,那它到了过期时间之后是不是马上就从内存中删除?
redis有三种不同的删除策略:
- 立即删除
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上删除,其所占用的内存也会随之释放,但是立即删除对cpu是不友好的,因为删除操作会占用cpu的时间,如果刚好碰上cpu很忙的时候,比如正在做交集或者排序等计算的时候,就会给cpu造成额外的压力。redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经达到过期时间,然后对它进行删除,而且立即删除会产生大量的性能消耗,同时会影响数据的读取操作。
上面这种策略就是拿时间换空间的策略
- 惰性删除
惰性删除是指,数据如果到达过期时间,先不做处理,等到下次访问数据的时候,再删除。如果一个键已经过期,而这个键又仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。使用惰性删除策略时,如果数据库中有非常多的键,而这些键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看成一种内存泄露。
上面策略对内存是非常不友好的,开启惰性淘汰在redis中配
置lazyfree-lazy-eviction=yes
- 定期删除
上面两种方案都太极端,定期删除策略每隔一段时间执行一次删除过期键操作并通过限制删除操作执行时长和频率来减少删除操作对CPU的影响。
周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频率
- CPU性能占用设置峰值,检测频率自定义设置
- 内存压力不是很大,长期占用内存的冷数据就被持续清理
总的来说,周期性抽查存储空间(随机抽查,重点抽查)
如果定期删除有些键一直没被抽查到,那么这个key会一直在内存中。
2. redis缓存淘汰策略
我们看配置文件:
可以看到有8种淘汰策略。
LRU:最近最少使用页面值换算法,淘汰最长时间未被使用的页面,看页面最后一次被使用到发生调度的时间长短,首先淘汰最长时间没有被使用的页面
LFU:最近最不常用页面值换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用的频率,淘汰一定时期内被访问次数最少的页
redis的内存淘汰策略:
- noeviction:不会驱逐任何key,表示即使内存达到上限也不进行置换,所有能引(起内存增加的命令都会返回error(默认策略)
- allkeys-lru:对所有key使用LRU算法进行删除,优先删除掉最近最不经常使用的key,用以保存新数据
- volatile-lru:对所有设置了过期时间的key使用LRU算法进行删除
- allkeys-random:对所有key随机删除
- volatile-ttl:删除马上要过期的key
- allkeys-Ifu:对所有kev使用LU算法进行删除
- volatile-lfu:对所有设買了过期时间的key使用LFU算法进行删除