面试切入点
Redis内存满了怎么办?
redis的默认内存多少?在哪里查看?如何设置修改?
查看redis最大占用内存
打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。
redis默认内存多少可以使用?
如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下表示不限制内存大小,在32位操作系统下最多使用3GB内存。
注意,在64bit系统下,maxmemory设置为0表示不限制Redis的内存使用。
一般生产上你如何设置?
一般推荐Redis设置内存为最大物理内存的四分之三
如何修改Redis内存设置?
通过修改配置文件的方式进行修改
通过命令进行修改
什么命令可以查看redis的内存使用情况?
info memory
config get maxmemory
真要打满了会怎么样?如果redis内存使用超过了设置的最大值会怎么样?
把最大值改为1byte后的情况
命令操作演示:
设置了maxmemory选项,加入redis内存使用达到上限。没有加上过期时间就会导致数据写满maxmemory,为了避免类似的情况发生,引入了内存淘汰策略。
往redis里面写的数据是怎么没得了?他是如何删除的?
redis过期键的删除策略
三种不同的删除策略
立即删除
Redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经到达过期时间,然后对它进行删除。
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力,让CPU心累,时时需要删除,忙死。。。。。。。
这会产生大量的性能消耗,同时也会影响数据的读取操作。
对CPU不友好,用处理器性能缓存存取空间(拿时间换取空间)惰性删除
数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据 ;发现已过期,删除,返回不存在。
惰性删除策略的缺点是,它对内存是最不友好的。 如果一个键已经过期,而这个键又仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。
在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏–无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。
对memory不友好,用存储空间换取处理器性能(拿空间换时间)。开启惰性淘汰:lazyfree-lazy-eviction=yes
上面两种方案都走极端 --定期删除
三种方案存在问题
1 定期删除时,从来没有被抽查到
2 惰性删除时,也从来没有被点中使用过
上述两个步骤======> 大量过期的key堆积在内存中,导致redis内存空间紧张或者很快耗尽
必须要有一个更好的兜底方案…
Redis缓存淘汰策略
redis的配置文件
LRU与LFU的区别
相关策略
- noeviction: 不会驱逐任何 key,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回 error。
- allkeys-lru: 对所有 key 使用 LRU 算法进行删除,优先删除掉最近最不经常使用的 key,用以保存新数据。
- volatile-lru: 对所有设置了过期时间的 key 使用 LRU 算法进行删除。
- allkeys-random: 对所有 key 随机删除。
- volatile-random: 对所有设置了过期时间的 key 随机删除。
- volatile-ttl: 删除马上要过期的 key。
- allkeys-lfu: 对所有 key 使用 LFU 算法进行删除。
- volatile-lfu: 对所有设置了过期时间的 key 使用 LFU 算法进行删除。
上面总结
2 * 4 得 8 这表示有 8 个选项。
2 个维度 过期键中筛选与所有键中筛选
4 个方面
LRU (Least Recently Used)
LFU (Least Frequently Used)
random
ttl (Time To Live)8 个选项
结合上述两个维度和四个方面,可以得出 8 种不同的策略组合。
具体组合如下:
过期键中筛选 + LRU
过期键中筛选 + LFU
过期键中筛选 + random
过期键中筛选 + ttl
所有键中筛选 + LRU
所有键中筛选 + LFU
所有键中筛选 + random
所有键中筛选 + ttl
这些策略描述了 Redis 在处理内存不足时的不同行为。
使用策略
Redis 缓存淘汰策略配置性能建议
- 避免存储 bigkey
避免在 Redis 中存储大键(bigkey),因为它们会占用大量内存,影响性能。 开启惰性淘汰 - 开启惰性淘汰机制
通过设置 lazyfree-lazy-eviction=yes 来实现。 惰性淘汰意味着 Redis
在需要访问一个过期的键时才会将其删除,而不是立即删除。