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

Redis数据淘汰策略

        数据的淘汰策略:当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

一、8种淘汰策略

        Redis支持8种不同策略来选择要删除的key:

1.1 核心算法原理

        在学习这8中淘汰策略前,我们先来了解一下其中的核心算法原理:

1.LRU(最近最少使用)

  • 核心思想:优先淘汰最久未被访问的数据

  • 类比:像整理书架,把最近用过的书放在前面,长期不用的放到后面

2. LFU(最少频率使用)

  • 核心思想:优先淘汰使用频率最低的数据

  • 类比:图书馆下架那些借阅量最少的书籍

3.TTL(生存时间)

  • 优先淘汰即将过期的键

  • 对没有设置TTL的键永不淘汰

1.2 8种淘汰策略

1. 不淘汰策略

noeviction(默认):不淘汰任何的key,但是内存满时不允许写入新的数据。

2. 全体键范围淘汰

策略算法描述
allkeys-lruLRU从所有键中淘汰最近最少使用的
allkeys-lfuLFU从所有键中淘汰使用频率最低的
allkeys-random随机随机淘汰所有键

3. 过期键范围淘汰

策略算法描述
volatile-lruLRU从设置了过期时间的键中淘汰LRU
volatile-lfuLFU从设置了过期时间的键中淘汰LFU
volatile-random随机随机淘汰有过期时间的键
volatile-ttlTTL淘汰剩余生存时间最短的键

1.3 策略选择建议

        针对于不同的场景问题,我们可以在配置文件中设置合适的淘汰策略:

场景特征推荐策略理由
数据重要性相同allkeys-lru有效利用内存
有明显热点数据allkeys-lfu更好保护热点
数据访问均匀allkeys-random公平淘汰
混合持久/临时数据volatile-lru保护持久数据
临时缓存数据volatile-ttl自然淘汰
数据不可丢失noeviction确保数据安全

        以下是配置文件中的相应配置示例:

# 内存限制1GB

maxmemory 1gb

# 使用LFU淘汰策略

maxmemory-policy allkeys-lfu

二、相关面试问题

2.1 redis的内存淘汰策略有哪些?

        首先,在了解redis的内存淘汰策略之前,我们需要了解到2个核心的算法概念:LRU最近最少使用算法,优先淘汰最近最少使用的数据;LFU最少频率使用算法,优先淘汰最少频率使用的数据。

        然后,redis中提供了8种内存淘汰策略,其可分为三大类:不淘汰策略、全体键淘汰策略和过期键淘汰策略。首先,redis默认就是不淘汰策略noeviction,不淘汰数据,但是内存满时也无法填加新数据;然后,全体键淘汰策略主要包含有allkeys-lru、allkeys-lfu和allkeys-random;其次,过期键淘汰策略主要包含有volatile-ttl、volatile-lru、volatile-lfu和volatile-random。

        最后,在redis的config配置文件中,我们可以根据不同的业务场景来选择适合的淘汰策略

2.2 数据库中有1000万条数据,redis中只能存储20w条数据。如何保证redis中的数据都是热点数据?

        我们可以使用allkeys-lru内存淘汰策略,挑选出最近最少使用的数据淘汰,那么留下来的就是热点数据。

http://www.xdnf.cn/news/15052.html

相关文章:

  • 从0开始学习R语言--Day42--LM检验
  • 旅游管理实训室建设的关键要点探讨
  • uniapp中使用uView-plus踩坑记录
  • 数据结构基础准备:包装类 泛型 泛型的上界 密封类
  • 脑电分析入门指南:信号处理、特征提取与机器学习
  • 主流大模型Agent框架 AutoGPT详解
  • 深度学习模型在C++平台的部署
  • vue2 echarts中国地图、在地图上标注经纬度及标注点
  • 伪装计算器软件,隐藏手机隐私文件
  • 精准医疗,AR 锚定球囊扩张导管为健康护航​
  • 暑假读书笔记第五天
  • 剑指offer54_平衡二叉树
  • PostgreSQL如何进行跨服务器迁移数据
  • JavaEE初阶第八期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(六)
  • Flink-1.19.0源码详解-番外补充4-JobGraph图
  • HTML应用指南:利用GET请求获取全国山姆门店位置信息
  • 二分查找篇——在排序数组中查找元素的第一个和最后一个位置【LeetCode】
  • Go 延迟调用 defer 用法详解
  • dify配置邮箱,密码重置以及邮箱邀请加入
  • Android Notification 通过增加addAction 跳转回Service重新执行逻辑
  • 中山排气歧管批量自动化智能化3D尺寸测量及cav检测分析
  • QNX中timer的使用
  • 【C++】容器适配器 + stack/queue/deque详解
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 【Linux网络编程】Socket - TCP
  • linux-进程信号的产生与发送
  • WPF使用WebBrowser 解决href标签target=_blank在浏览器窗口打开新链接而非窗体内部打开的问题
  • Python 项目快速部署到 Linux 服务器基础教程
  • 【macOS】【Swift】不让App采用macOS的外观风格,直接保持白色背景,怎么处理?
  • 区块链平台以太坊核心原理