架构师详解 Redis 内存淘汰机制


一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了。我们需要选定某种策略将“不重要”的数据从 Redis 中清除,为新的数据腾出空间。


架构师详解 Redis 内存淘汰机制

配置Redis内存大小

架构师详解 Redis 内存淘汰机制


我们应该为 Redis 设置多大的内存容量呢?

根据“八二原理“,即 80% 的请求访问了 20% 的数据,因此如果按照这个原理来配置,将 Redis 内存大小设置为数据总量的 20%,就有可能拦截到 80% 的请求。当然,只是有可能,对于不同的业务场景需要进行不同的配置,一般建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。

配置方式(以 5GB 为例,如果不带单位则默认单位是字节):

  • 命令行
config set maxmemory 5gb
  • 配置文件

架构师详解 Redis 内存淘汰机制

  • 查看 maxmemory 命令
config get maxmemory


架构师详解 Redis 内存淘汰机制

Redis的内存淘汰策略

架构师详解 Redis 内存淘汰机制


在 Redis 4.0 版本之前有 6 种策略,4.0 增加了 2种,主要新增了 LFU 算法。

下图为 Redis 6.2.0 版本的配置文件:

架构师详解 Redis 内存淘汰机制

其中,默认的淘汰策略是 noevition,也就是不淘汰

我们可以对 8 种淘汰策略可以分为两大类:

  • 不进行淘汰的策略

noevition,此策略不会对缓存的数据进行淘汰,当内存不够了就会报错,因此,如果真实数据集大小大于缓存容量,就不要使用此策略了。

架构师详解 Redis 内存淘汰机制

  • 会进行淘汰的策略

    • allkeys-random:随机删除
    • allkeys-lru:使用 LRU 算法进行筛选删除
    • allkeys-lfu:使用 LFU 算法进行筛选删除
    • volatile-random:随机删除
    • volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除
    • volatile-lru:使用 LRU 算法进行筛选删除
    • volatile-lfu:使用 LFU 算法进行筛选删除
    • 在设置了过期时间的数据中筛选

    • 在所有数据中筛选

以 volatile 开头的策略只针对设置了过期时间的数据,即使缓存没有被写满,如果数据过期也会被删除。

以 allkeys 开头的策略是针对所有数据的,如果数据被选中了,即使过期时间没到,也会被删除。当然,如果它的过期时间到了但未被策略选中,同样会被删除。


那么我们如何配置过期策略呢?

  • 命令行
config set maxmemory-policy allkeys-lru
  • 配置文件

架构师详解 Redis 内存淘汰机制


架构师详解 Redis 内存淘汰机制

LRU算法

架构师详解 Redis 内存淘汰机制


首先简单介绍一下 LRU 算法:

LRU 全称是 Least Recently Used,即最近最少使用,会将最不常用的数据筛选出来,保留最近频繁使用的数据。

LRU 会把所有数据组成一个链表,链表头部称为 MRU,代表最近最常使用的数据;尾部称为 LRU代表最近最不常使用的数据;

下图是一个简单的例子:

架构师详解 Redis 内存淘汰机制

但是,如果直接在 Redis 中使用 LRU 算法也会有一些问题:

LRU 算法在实现过程中使用链表管理所有缓存的数据,这会给 Redis 带来额外的开销,而且,当有数据访问时就会有链表移动操作,进而降低 Redis 的性能。

于是,Redis 对 LRU 的实现进行了一些改变:

  • 记录每个 key 最近一次被访问的时间戳(由键值对数据结构 RedisObject 中的 lru 字段记录)
  • 在第一次淘汰数据时,会先随机选择 N 个数据作为一个候选集合,然后淘汰 lru 值最小的。(N 可以通过 config set maxmemory-samples 100 命令来配置)
  • 后续再淘汰数据时,会挑选数据进入候选集合,进入集合的条件是:它的 lru 小于候选集合中最小的 lru。
  • 如果候选集合中数据个数达到了 maxmemory-samples,Redis 就会将 lru 值小的数据淘汰出去。


架构师详解 Redis 内存淘汰机制

LFU算法

架构师详解 Redis 内存淘汰机制


LFU 全称 Least Frequently Used,即最不经常使用策略,它是基于数据访问次数来淘汰数据的,在 Redis 4.0 时添加进来。它在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。

前面说到,LRU 使用了 RedisObject 中的 lru 字段记录时间戳,lru 是 24bit 的,LFU 将 lru 拆分为两部分:

  • ldt 值:lru 字段的前 16bit,表示数据的访问时间戳
  • counter 值:lru 字段的后 8bit,表示数据的访问次数 使用 LFU 策略淘汰缓存时,会把访问次数最低的数据淘汰,如果访问次数相同,再根据访问的时间,将访问时间戳最小的淘汰。

为什么 Redis 有了 LRU 还需要 LFU 呢?

在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。

由于 LRU 是基于访问时间的,如果系统对大量数据进行单次查询,这些数据的 lru 值就很大,使用 LFU 算法就不容易被淘汰。

参考:

《Redis核心技术与实战》

如喜欢本文,请点击右上角,把文章分享到朋友圈

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

·END·

    作者:Song

    来源:www.cnblogs.com/songjilong/p/14453051.html

    版权申明:内容来源网络,仅供分享学习,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

    架构师指南

    我们都是架构师!


    架构师详解 Redis 内存淘汰机制

    本篇文章来源于微信公众号:程序IT圈

    原创文章,作者:software,如若转载,请注明出处:https://www.sldh123.com/5905.html

    (0)
    上一篇 10月 27, 2022 8:30 上午
    下一篇 10月 27, 2022 8:30 上午

    相关推荐

    • 千万级并发架构下,关系型数据库应该如何优化?

      作者:善思者_tin链接:https://www.jianshu.com/p/c2c081b51ab9 一、概述 顺势而为,大数据高并发要有系统不断的升级,分库分表便是其一。 二、…

      11月 13, 2022
      240
    • 一张图看懂微服务架构路线

      我为什么选择微服务架构? 众所周知,单体应用程序,由于其种种不足,几乎不支持敏捷方法。如果你想为一个大型或复杂的业务创建一个软件项目,最好从微服务架构开始。 微服务架构是一种灵活的…

      6月 29, 2022
      180
    • 【收藏】19张最全的架构师技术栈图谱

      嗨喽,各位新来的小伙伴们,你们好!由于公众号做了改版,为了保证公众号的资源推送,能够第一时间及时送达,大家记得将小编的公众号 加星标置顶 ,在此真诚的感谢! 今…

      6月 18, 2022
      220
    • 架构师详解 OAuth 2.0 授权认证

      因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享 目录 1、Auth2.0 协议简介 2、OAuth 2.0的授权认证流程   &nbsp…

      10月 3, 2022
      320
    • 架构师:关系型数据库设计技巧?

      摘要 本文讨论关系数据库设计相关的一些内容,涉及关系模型,表结构设计等内容,以学生选修课程讲述设计过程,在尽量讲清楚设计要领的前提下,简化设计内容。 本文基于MySQL数据库为基础…

      8月 21, 2022
      240
    • 架构师如何写好技术文档 ?

      参加工作时间久一点的工程师应该有这样一个体会:自己平时代码写得再多再好,可一旦要用文档去描述或者表达某一个事情或者问题时,都感觉非常困难,无从下手,不知道自己该写什么不该写什么;或…

      10月 15, 2022
      800
    • sql语句优化的30种方法

      作者:羋虹光链接:https://www.jianshu.com/p/3ab117c83d0b 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order b…

      11月 13, 2022
      200
    • 软件架构师要怎样绘制系统架构蓝图?

      前言 大家好,我是架构师指南。 今天我们来了解一些关于软件设计文档的基础知识,这样你在学习后面的具体案例时,就能更加清楚地理解文档是基于什么方式来组织的了。 首先,请你设想这样一个…

      6月 19, 2022
      220
    • 深入理解MMAP原理,让大厂都爱不释手的技术

      作者:android阿牛链接:https://www.jianshu.com/p/0cf8eff07f5e 如微信的MMKV 组件、美团的Logan组件,还有微信的日志模块xlog…

      1天前
      00
    • 如何画出一张优秀的架构图?(老鸟必备)

      作者:三画 简介:阿里巴巴技术专家,梓敬、鹏升和余乐对此文亦有贡献。三画曾多年从事工作流引擎研发工作,现专注于高并发移动互联网应用的架构和开发。 技术传播的价值,不仅仅体现在通过商…

      9月 23, 2022
      270

    发表回复

    您的电子邮箱地址不会被公开。