文章目录
- 面试题
- 内存满怎么办
- 写入的数据如何删除的(删除策略)
- 立即删除
- 惰性删除
- 上面两种方案都走极端
- 缓存淘汰策略
- 配置文件
- LRU和LFU区别
- 有哪些
- 如何配置、修改
- redis缓存淘汰策略配置性能建议
面试题
- 生产上你们的redis内存设置多少?
- 如何配置、修改redis的内存大小
- 如果内存满了你怎么办
- redis清理内存的方式?定期删除和惰性删除了解过吗
- redis缓存淘汰策略有哪些?分别是什么?你用那个?
- redis的LRU了解过吗?请手写LRU
- lru和lfu算法的区别是什么
内存满怎么办
-
查看Redis最大占用内存
打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。
在64位系统下maxmemory设置为0表示不限制使用 -
一般生产设置多少
最大物理内存的3/4
- 修改内存设置
除以上修改配置文件外,可用命令设置
- 查看目前内存情况
info memory
config get maxmemory
补充
设置最大为1byte
结论:无法set,提示OOM,没有设置过期时间的使用内部淘汰策略
写入的数据如何删除的(删除策略)
立即删除
总结:对CPU不友好,用处理器性能换取存储空间(拿时间换空间)
优点:立即删除能保证内存中数据的最大新鲜度
缺点:但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力
惰性删除
数据到达过期时间,不做处理。等下次访问该数据时
如果一个键已经过期,而这个键又仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。
总结:对memory不友好,用存储空间换取处理器性能(拿空间换时间)
开启惰性淘汰
lazyfree-lazy-eviction=yes
上面两种方案都走极端
- 定期删除时,从来没有被抽查到
- 惰性删除时,也从来没有被点中使用过
上述两个步骤:大量过期的key堆积在内存中,导致redis内存空间紧张或者很快耗尽
缓存淘汰策略
配置文件
LRU和LFU区别
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算法进行删除
小结
两个维度:
- 过期键中筛选
- 所有键中筛选
四个方面
- LRU
- LFU
- random
- ttl
如何配置、修改
- 直接用config命令
- 直接redis.conf配置文件
redis缓存淘汰策略配置性能建议
- 避免存储bigkey
- 开启惰性淘汰,lazyfree-lazy-eviction=yes