• 三、Redis内存淘汰策略


    一、题目

    • 谈谈你对Redis中内存淘汰策略的了解
    • 如何保证 Redis 中数据都是热点数据

    二、内存淘汰策略

    2.1、策略

    1. Volatile-LRU:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰;
    2. Volatile-TTL:从已设置过期时间的数据集中挑选将要过期的数据淘汰;
    3. Volatile-Random:从已设置过期时间的数据集中任意选择数据淘汰;
    4. Allkeys-LRU:当不足以容纳新写入数据时,移除最近最少使用的 key(最常用);
    5. Allkeys-Random:从数据集中任意选择数据淘汰;
    6. No-Eviction(默认策略):当内存不足以容纳新写入数据时,新写入操作会报错;

    4.0 版本后增加了以下两种:

    1. Volatile-LFU:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰;
    2. Allkeys-LFU:当内存不足以容纳新写入数据时,移除最不经常使用的 key;

    2.2、LRU算法

    LRU(Least Recently Used)表示最近最少使用,该算法根据数据的历史访问记录来进行淘汰数据,其核心思想是 “如果数据最近被访问过,那么将来被访问的几率也更高”

    LRU算法的常见实现方式为链表,新数据放在链表头部 ,链表中的数据被访问就移动到链头,链表满的时候从链表尾部移出数据

    在这里插入图片描述
    而在 Redis 中使用的是近似 LRU 算法,为什么说是近似呢?Redis中是随机采样5个(可以修改参数 maxmemory-samples 配置)key,然后从中选择访问时间最早的 key 进行淘汰,因此当采样 key 的数量与 Redis 库中 key 的数量越接近,淘汰的规则就越接近 LRU 算法。但官方推荐 5 个就足够了,最多不超过 10 个,越大就越消耗 CPU 的资源

    但在 LRU 算法下,如果一个热点数据最近很少访问,而非热点数据近期访问了,就会误把热点数据淘汰而留下了非热点数据,因此在Redis4.x中新增了 LFU 算法

    2.3、LFU 算法

    LFU(Least Frequently Used)表示最不经常使用,它是根据数据的历史访问频率来淘汰数据,其核心思想是 “如果数据过去被访问多次,那么将来被访问的频率也更高”

    LFU算法的常见实现方式为链表:新数据放在链表尾部 ,链表中的数据按照被访问次数降序排列,访问次数相同的按最近访问时间降序排列,链表满的时候从链表尾部移出数据

    在这里插入图片描述

    LFU 算法在 Redis 中是通过一个计数器来实现的,每个 key 都有一个计数器,访问频度越高,计数器的值就越大,Redis 就根据计数器的值来淘汰 key,当然计数器的值也是会随着时间减少的

    用户可配置的 LFU 算法参数一共有两个分别是:lfu-log-factor 和 lfu-decay-time

    • lfu-log-factor 参数值设置的越大,key 的计数值就越难增长,因此就要求 key 的访问频度较高才能避免被淘汰
    • lfu-decay-time 参数值是表示隔多久将计数器的值减一

    三、获取及设置内存淘汰策略

    3.1、获取内存淘汰策略

    获取当前内存淘汰策略

    127.0.0.1:6379> config get maxmemory-policy
    
    • 1

    在这里插入图片描述

    3.2、设置淘汰策略

    通过配置文件设置淘汰策略(修改 redis.conf 文件):

    maxmemory-policy allkeys-lru
    
    • 1

    通过命令修改内存淘汰策略

    127.0.0.1:6379> config set maxmemory-policy allkeys-lru
    
    • 1

    转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916 如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。
    这里写图片描述

  • 相关阅读:
    Mac 下 Python+Selenium 自动上传西瓜视频
    java毕业设计物流车辆规费管理系统的设计与实现Mybatis+系统+数据库+调试部署
    OpenCV从入门到精通实战(五)——dnn加载深度学习模型
    计算机视觉-数学基础
    基于人工蜂群算法的线性规划求解matlab程序
    C#使用策略模式或者委托替代多IfElse判断和Switch语句
    python设计模式(四)--行为类设计模式
    Cruise 从零搭建模型
    Moment.js 如何对时间进行比较获得不同的天数
    Unity Mono和.Net平台浮点算法的区别
  • 原文地址:https://blog.csdn.net/weixin_41835916/article/details/125792346