首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >理解Redis的内存回收机制和过期淘汰策略

理解Redis的内存回收机制和过期淘汰策略

作者头像
黎明大大
发布2021-03-08 12:52:19
发布2021-03-08 12:52:19
1.9K0
举报
文章被收录于专栏:java相关资料java相关资料

前言

我们知道Redis是分布式缓存中间件,它是基于内存运行,可是有没有想过比较好的服务器内存也不过几十G,能存多少数据呢,当内存占用满了之后该怎么办呢?需要存储新的数据到缓存中该如何办?就这些问题,接下来本文带你了解redis的内存回收机制。

为什么需要内存回收

在redis缓存中,set 指令可以指定 key的过期时间,当过期时间达到以后,key就会失效,那么redis就得将该key的内存进行释放掉。

redis回收机制有两部分

  • 过期删除策略
  • 内存淘汰策略

过期删除缓存策略

过期删除策略是指删除缓存中到期的数据key

Redis对于过期键有三种清除策略:

  • 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  • 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
  • 主动清理:当前已用内存超过maxmemory限定时,触发主动清理策略

内存淘汰策略

内存淘汰策略是指达到maxmemory极限时,使用某种算法来决定来清理哪些数据,以保证新数据存入。

maxmemory:该参数在redis.conf文件中,如下图

通过maxmemory-policy参数来设置内存淘汰策略,当Redis所使用的内存达到maxmemory所设定的值时就会触发该策略。

主动清理策略在Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策略,总共8种:

针对设置了过期时间的key做处理:

  • volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。【删除即将过期的key】
  • volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。【随机删除即将过期的key】
  • volatile-lru:会使用 LRU 算法筛选设置了过期时间的键值对删除。【使用LRU算法删除即将过期的key】
  • volatile-lfu:会使用 LFU 算法筛选设置了过期时间的键值对删除。【使用LFU算法删除即将过期的key】

针对所有的key做处理:

  • allkeys-random:从所有键值对中随机选择并删除数据。【所有的数据集中随机删除数据,非常不靠谱的方式】
  • allkeys-lru:使用 LRU 算法在所有数据中进行筛选删除。【所有的数据集中筛选部分使用LRU算法删除key】
  • allkeys-lfu:使用 LFU 算法在所有数据中进行筛选删除。【所有的数据集中筛选部分使用LFU算法删除key】

不处理:

  • noeviction:(默认使用该策略)不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error) OOM command not allowed when used memory",此时Redis只响应读操作。

LRU和LFU的区别

LRU 算法(Least Recently Used,最近最少使用)

淘汰很久没被访问过的数据,以最近一次访问时间作为参考。

LFU 算法(Least Frequently Used,最不经常使用)

淘汰最近一段时间被访问次数最少的数据,以次数作为参考。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黎明大大 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档