目录

  • Redis 过期策略和内存淘汰机制
    • 过期策略
      • 淘汰过期 key 方式
    • 内存淘汰机制
    • 参考

Redis 过期策略和内存淘汰机制

众所周知,redis 是一个基于内存的,能够持久化到硬盘的缓存数据库,所以 redis 缓存服务器会配置较高的内存资源

一般而言,缓存总量小于数据总量,但如果对缓存数据不管不顾,内存资源总会有耗尽的时候,而为了节约成本,不能一直增加服务器的内存。因此在有限的资源下,为了支撑更多的业务,就必须将访问频率不高的缓存删掉,为新的缓存腾出内存空间

Redis 主要通过两种方式相互配合实现 key 的清理,即:过期策略和内存淘汰机制

过期策略

Redis 通过 Expire 命令设置 key 的过期时间,设置过期时间后, key 会被自动删除。通常称带有过期时间的 key 为易失的 (volatile);过期时间的 key,可以调用 EXPIPE 重新设置

过期时间计算
key 的过期时间以绝对 Unix 时间戳的方式存储,也就是无论 Redis 是否进行,过期时间都会流逝。即要求服务器的时间必须准确,否则但两个时间相差较多的机器之间移动 RDB 文件,那么可能会出现所有的 key 在加载的时候都过期。

测试:运行的 Redis 会不停检查服务器的时间,如果设置一个带有 1k 秒过期时间的 key,然后把服务器的时间向前调 2k 秒,那么这个 key 就会立刻过期,而不是等待 1k 秒后过期

淘汰过期 key 方式

被动方式

在用户访问某个 key 的时候,Redis 会检测 key 是否过期,如果没有过期,则返回给用户;过期则删除 key。也就是等 key 被访问才会知道是否过期,这种方式对于那些永远不会再次访问的 key 没有效果,所以 Redis 还会周期性主动随机检测一部分被设置过期时间的 key,将已经过期的 key 从 key 空间删除

主动方式

Redis 每秒会执行10次以下操作:

  1. 从带有过期时间的 key 集合中随机选 20 进行检查
  2. 删除所有过期的 key
  3. 如果里面超过 25% 的 key 过期,立刻继续执行步骤 1

一种狭义概率算法,假设选出来的样本 key 代表整个 key 空间,会一直执行过期检查直到 key 的比例降到 25% 以下;意味着在任意时刻已经过期但还占用内存 key 的数量,最多等于每秒最多写操作的 1/4

内存淘汰机制

Redis 的内存一般会根据 “八二原理” 进行配置,即80%的请求访问了20%的数据,将 Redis 内存大小设置为数据总量的20%。当然,对于不同的业务场景会有不一样的配置

当 redis 节点分配的内存使用到达最大值,Redis 会启动内存淘汰策略,Redis 4.0 之前主要是以下六种策略:

  • noenviction:不清除数据,只是返回错误,这样会导致浪费掉更多的内存,对大多数写命令(DEL 命令和其他的少数命令例外)
  • allkeys-lru:从所有的数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,以供新数据使用
  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰,以供新数据使用
  • allkeys-random:从所有数据集(server.db[i].dict)中任意选择数据淘汰,以供新数据使用
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰,以供新数据使用
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,以供新数据使用

Redis 4.0 新增了两种 LFU 淘汰策略:

  • allkeys-lfu,淘汰整个键值中最少使用的键值,这也就是我们常说的LRU算法。
  • volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值。

LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰;在使用内存作为缓存的时候,缓存的大小一般是固定的。当缓存被占满,这个时候继续往缓存里面添加数据,就需要淘汰一部分老的数据,释放内存空间用来存储新的数据。这个时候就可以使用LRU算法了。其核心思想是:如果一个数据在最近一段时间没有被用到,那么将来被使用到的可能性也很小,所以就可以被淘汰掉
LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰;根据key的最近被访问的频率进行淘汰,很少被访问的优先被淘汰,被访问的多的则被留下来

普适经验规则:

  • 如果期望用户请求呈现幂律分布(power-law distribution),也就是,期望一部分子集元素被访问得远比其他元素多时,可以使用allkeys-lru策略。在你不确定时这是一个好的选择
  • 如果期望是循环周期的访问,所有的键被连续扫描,或者期望请求符合平均分布(每个元素以相同的概率被访问),可以使用allkeys-random策略
  • 如果你期望能让 Redis 通过使用你创建缓存对象的时候设置的TTL值,确定哪些对象应该是较好的清除候选项,可以使用volatile-ttl策略
  • 当你想使用单个Redis实例来实现缓存和持久化一些键,allkeys-lru和volatile-random策略会很有用,但通常最好是运行两个Redis实例来解决这个问题

参考

[1] EXPIRE key seconds
[2] 使用Redis作为LRU缓存

Redis 过期策略和内存淘汰机制相关推荐

  1. Redis过期策略与内存淘汰机制

    参考博客:https://blog.csdn.net/u010006156/article/details/124914082 Redis过期策略与内存淘汰机制 过期策略简介 作用 redis数据都是 ...

  2. @cacheable 设置过期时间_缓存面试三连击——聊聊Redis过期策略?内存淘汰机制?再手写一个LRU 吧!...

    大家好,今天我和大家想聊一聊有关redis的过期策略的话题. 听到这里你也许会觉得:"我去,我只是个日常搬砖的,这种偏底层的知识点,我需要care吗?" 话虽如此·,但是兄die, ...

  3. redis过期策略和内存淘汰机制

    Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据,对内存很友好:但是会占用大量的CPU资源去处理过期的数据,从而影 ...

  4. java 过期策略实现_Redis过期策略和内存淘汰机制

    Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制. 大家都知道,Re ...

  5. Redis的过期策略以及内存淘汰机制

    Redis的过期策略以及内存淘汰机制 我们知道,redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样删除过期数据的?删除过期数据的策略是什么? ...

  6. 【带你重拾Redis】Redis过期策略 和 内存淘汰策略(key回收)

    过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效. 如果假设你设置一个一批key只能存活1个小 ...

  7. stringredistemplate设置过期时间_Redis的过期删除策略和内存淘汰机制

    Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 本篇文章将介绍一下Redis的过期策略和内存淘汰 ...

  8. Redis 过期键删除策略、内存淘汰机制

    文章目录 过期键删除策略 定时删除 惰性删除 定期删除 Redis的选择 内存淘汰机制 redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期数据以节省内存,那redis是怎样怎 ...

  9. redis同步效率秒_redis过期策略、内存淘汰策略、持久化方式、主从复制

    一.Redis的过期策略以及内存淘汰策略: 1.过期策略:定期删除+惰性删除: ①定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除.注意这里 ...

  10. Redis基础(五)——删除策略和内存淘汰机制

    文章目录 删除策略和内存淘汰机制 1 删除策略 1.1 定时删除 1.2 惰性删除 1.3 定期删除 2 内存淘汰机制 删除策略和内存淘汰机制 1 删除策略 Redis是一个内存级数据库,内存中的数据 ...

最新文章

  1. c++11 之模板定义别名(using)
  2. python readline_python文件读read()、readline()、readlines()对比
  3. Web测试与APP测试有哪些异同?
  4. Redis学习手册(实例代码)
  5. jQuery的HTML与CSS方法
  6. 小米刷第三方recovery_小米平板4/Plus LTE版本开启电话功能
  7. 埃及分数问题+迭代加深搜索
  8. 拓端tecdat|Prophet在R语言中进行时间序列数据预测
  9. 8848Android 版本,【8848钛金手机M5评测】拍照配置保持Android阵容顶配堆积_8848 钛金手机M5_手机评测-中关村在线...
  10. 应聘计算机程序员英文,计算机程序员英文简历模板
  11. matlab 关联矩阵,(案例)利用Matlab实践关联矩阵与邻接矩阵的转换
  12. 微信小程序登录注册界面
  13. oracle ap tp是什么,AP模式和Router模式区别是什么
  14. 使用OpenCV实现运动背景的重建
  15. 剑与家园服务器信息,《剑与家园》合服规则公示
  16. 数字格式化、大数据BigDecimal、随机数生成方法random()
  17. 2019TFE计算机科学排名,2019TFE Times 硕士专业排名
  18. 数据库安全性控制(授权:授予与收回)
  19. java 做日历_java编程实现日历
  20. STM32、NBIOT、Lora模块烧写方法-Hex文件烧录步骤详解-新大陆物联网设备-NEWLab开发板

热门文章

  1. Clion配置MinGW
  2. Ubuntu编译MT7628的固件(openwrt)
  3. Java中unicode占几个,Java语言使用的是Unicode字符集,每个字符在内存中占8位。()...
  4. ali p3c规则扩展-集成sonar
  5. adb配置环境变量没有反应
  6. 文字生成图片:输入描述语,人工智能自动帮你绘图!
  7. 使用Auto.js实现微信自动发朋友圈脚本
  8. 麦腾股份正式挂牌新三板,创业孵化市场或将深度洗牌
  9. 大华摄像机RTSP断流
  10. Nmap库ICMP主机探测