当前位置: 首页 > article >正文

【Redis】内存淘汰策略

文章目录

  • 什么是内存淘汰策略
  • 设置`Redis`最大内存
  • 执行内存淘汰策略的流程
  • `Redis`的八大内存淘汰策略
  • 深入源码进行理解
  • 内存淘汰策略流程

什么是内存淘汰策略

Redis内存淘汰策略是指当Redis的内存使用达到其配置的最大内存限制maxmemory)时,Redis根据预设的策略自动删除一部分键(key)及其对应的值(value,以释放内存空间,从而避免内存溢出(OOMOut Of Memory)错误的发生。Redis提供了多种内存淘汰策略,以满足不同应用场景的需求。

设置Redis最大内存

Linux系统中,使用命令:vim /etc/redis/redis.conf,打开Redis配置文件.

在这里插入图片描述
如:maxmemory 1gb

执行内存淘汰策略的流程

  • 进行内存淘汰的时机: Redis处理客户端命令之前,都会检查一遍内存,然后尝试淘汰内存
    在前面的学习过程中,我们了解到,在执行Redis命令时,会调用processCommand来进行Redis命令的执行.
    在这里插入图片描述

分析该源码的内容:
在执行Redis命令之前,都会调用processCommand函数,在设定了server.maxmemory属性并且未有执行Lua脚本的情况下,尝试淘汰内存,调用performEvictions()函数,尝试淘汰内存,如果内存淘汰失败,拒绝执行该Redis命令.(因为Redis中默认的内存淘汰策略是noeviction,不进行key的删除,而是直接不允许写入新的数据)

Redis的八大内存淘汰策略

在配置文件中可以对不同的内存淘汰策略进行选择:
打开/etc/redis/redis.conf,Redis的配置文件,找到maxmemory-policy属性.
Redis支持八种不同的策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新的数据,这是Redis默认的内存淘汰策略
  • volatile-ttl:对设置了ttlkey,比较key的剩余ttl的值,ttl越小越先被淘汰.
  • allkeys-random: - 对全体的key进行随机淘汰,也就是从db->dict(对所有的key)中随机挑选
  • Volatile-random:对设置了ttlkey,随机进行淘汰.也就是从db->expires(对所有带过期时间的key)中随机挑选
  • Allkeys-lru:对全体的key,基于lru算法进行淘汰
  • Volatile-lru:对于设置了ttlkey,基于lru算法进行淘汰
  • Allkeys-lru:对于全体key,基于lfu算法进行淘汰
  • volatile-lfu:对于设置了ttlkey,基于lfu进行淘汰
  • LRU:最少最近使用,用当前的时间减去最后一次访问的时间(即该key多久没有被访问),这个值越大则淘汰的优先级越高.
  • LFU :最少频率使用,会统计每个key的访问概率,值越小淘汰级别越高.

总结八大淘汰策略:

  • 淘汰范围
    • 全体key
    • 全体设置了ttlkey
  • 淘汰算法
    • TTL排序
    • LRU排序
    • LFU排序

深入源码进行理解

redis如何统计key最近的使用时间访问频率呢?
Redis的数据都会被封装为RedisObject结构中:
在这里插入图片描述
LFU的访问次数之所以叫做逻辑访问次数,是因为并不是每次key被访问都计数,而是通过运算:

  1. 生成0~1之间的随机数R
  2. 计算1/(旧次数*lfu_log_factor+1),记录为P,lfu_log_factor默认为10
  3. 如果R<P,则计数器+1,且最大不超过255
  4. 访问次数会随着时间衰减,距离上一次访问时间间隔lfu_decay_time分钟(默认1),计数器-1(比如某个key已经255分钟没有被访问了,就会减少到0,所以LFU的前16位需要记录最近一次访问的时间,单位是分钟)

内存淘汰策略流程

在这里插入图片描述

这里我们重点理解eviction_pool

  • 这里相当于一个淘汰池,因为如果我们每次进行内存淘汰时,都将所有的key进行精确的排序,所消耗的时间是相当大的,所以这里进行了一个相对精确的筛选,也就是从每个DB中随机选取maxmemory_samples个数据进入淘汰池中,再按照选择的淘汰算法(TTL,LRU,LFU)进行排序.
  • 这里我们注意到此处的idleTime的计算方式:
    • TTL算法:maxTTL-TTL
    • LRU算法 :now-LRU
    • LFU算法:255-LFU
      为什么要进行这样的计算,而不是直接使用数据呢?原因在于:在淘汰池中,我们进行的是升序排列,倒序淘汰的方式进行key的淘汰.(maxTTL-TTL)进行升序排列,相当于TTL进行降序排列;同理now-LRU255-LFU的计算方式也是如此.

http://www.kler.cn/a/374753.html

相关文章:

  • 一文详解精细化工行业持续增长的策略与路径解析
  • Python学习的自我理解和想法(22)
  • 【安全解决方案】深入解析:如何通过CDN获取用户真实IP地址
  • java项目之基于智能推荐的卫生健康系统(springboot)
  • 未来之维,陈欣的智能CAD
  • 【设计模式系列】迭代器模式(七)
  • sqoop Oracle to hive出现 Error Msg = ORA-00933: SQL 命令未正确结束
  • 3周岁孤独症儿童:治愈的希望还是幻想?
  • 一文读懂 HTTP Cookies
  • Python批量查找包含多个关键词的PDF文件
  • CSP/信奥赛C++刷题训练:经典差分例题(2):洛谷P9904 :Mieszanie kolorów
  • TS:如何推导函数类型
  • 探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作
  • 双十一大促有哪些值得入手的产品?这五款产品实用又划算!
  • Three.js 粒子系统教程构建炫酷的 3D 粒子效果
  • 蘑菇书(EasyRL)学习笔记(2)
  • 如何在算家云搭建GFP-GAN(图像生成)
  • h510主板怎么装win7_h510装win7完美解决方案
  • VB.NET中如何利用WCF(Windows Communication Foundation)进行服务间通信
  • 抗扭截面模量公式
  • OSError: Can‘t load tokenizer for ‘bert-base-uncased‘.
  • vscode开发项目常用插件
  • AIGC:开启人工智能生成内容的新时代
  • Kafka集群数据迁移方案
  • 20241028软考架构-------软考案例7答案
  • Kubernetes——part10-1 kubernetes日志收集方案 ELK