Redis——三大策略

news2025/5/18 22:12:18

过期删除策略

Redis可以对key设置过期时间,因此需要有相应的机制将已过期的键值对删除

设置了过期时间的key会存放在过期字典中,可以用presist命令取消key过期时间

过期字典存储在redisDb结构中:

typedef struct redisDb {
    dict *dict;    /* 数据库键空间,存放着所有的键值对 */
    dict *expires; /* 键的过期时间 */
    ....
} redisDb;

过期字典数据结构:

  • key是一个指针,指向某个键对象
  • value是一个long long类型整数,保存key的过期时间

过期判断流程:

  • 字典实际上是哈希表,当我们查询一个key时,Redis会先检测该key是否存在于过期字典中
  • 如果不在,则直接读取键值
  • 如果存在,则会获取该key的过期时间,与当前系统时间进行对比,如果比系统时间小则判断为过期

三种过期删除策略:

定时删除:

设置key过期时间的同时,创建一个定时任务,由事件处理器自动执行key的删除操作

  • 优点:保证过期key被尽快删除,也就是内存尽快释放。对内存友好
  • 缺点:过期key较多时,删除过期key需要占用CPU时间进行处理,可能对服务器响应时间和吞吐量造成影响,对CPU不友好
惰性删除:

不主动删除过期key访问数据库的key时才检查是否过期,并删除过期key

  • 优点:每次访问时才触发检查和删除过期key操作,所以对CPU友好
  • 缺点:若过期key一直未被访问,那么它占用的内存就不会释放对内存不友好
定期随机删除:

每隔一段时间随机取出一定数量(Redis默认20个)的key进行检查,并删除其中的过期key

  • 优点:限制删除操作的执行频率,减少对CPU的影响,同时可释放一定内存
  • 缺点:执行频率较高会导致对CPU影响较大执行频率较低又会导致无效内存堆积

Redis的删除策略实现:

惰性删除+定期随机删除策略,在合理使用CPU时间和避免内存浪费之间取得平衡

Redis如何实现惰性删除?

通过expireIfNeeded函数实现:

int expireIfNeeded(redisDb *db, robj *key) {
    // 判断 key 是否过期
    if (!keyIsExpired(db,key)) return 0;
    ....
    /* 删除过期键 */
    ....
    // 如果 server.lazyfree_lazy_expire 为 1 表示异步删除,反之同步删除;
    return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :
                                         dbSyncDelete(db,key);
}

如果key过期,可选择同步删除或异步删除,并返回null

Redis如何实现定期随机删除?
  • 间隔检查时间:默认每秒进行10次过期随机抽查,可通过redis.conf的hz参数进行配置
  • 随机抽查数量:默认20个,但并不是每次都会检查到10次才结束,如果单次检查中过期Key占比超过25%(即5个以上),会继续重复抽样删除,直到比例低于25%或总耗时达到25ms上限,防止线程卡死。

内存淘汰策略

Redis运行内存超过设定的最大内存之后,会通过淘汰策略删除符合条件的key来保障Redis高效运行。可以在redis.conf中的参数maxmemory <bytes>来设定最大允许内存,默认为0,也就是没有大小限制。

Redis的内存淘汰策略

不进行数据淘汰的策略(Redis3.0后默认的淘汰策略)
  • 当内存超限时,不淘汰任何数据
  • 禁止新数据写入并报错通知
  • 查询和删除操作正常进行
进行数据淘汰的策略
在设置了过期时间的数据中淘汰:
  • volatile-random:随机淘汰设置了过期时间的任意键值
  • volatile-ttl:优先淘汰更早过期的键值
  • volatile-lru(3.0前的默认淘汰策略):淘汰最久未使用的键值
  • volatile-lfu:淘汰最少使用的键值
在所有数据中淘汰:
  • allkeys-random:随机淘汰
  • allkeys-lru:淘汰最旧未使用
  • allkeys-lfu:淘汰使用最少的

LRU(Least Recently Used)最久未使用:

  • 传统的LRU算法是使用链表实现的被访问到的数据会移动到表头。但Redis没有使用,因为缓存链表需要额外空间,且链表频繁变动有性能损耗
  • Redis则是在对象结构体中添加一个额外字段用于记录此数据的最后一次访问时间
  • 内存淘汰时,Redis采用随机采样的方式来淘汰数据,随机取5个值(可配置)并淘汰最久未使用的那个
  • 但LRU会造成缓存污染误删除热点数据问题,因为它只记录了最近访问时间,可能会导致不怎么使用的数据保留下来,以及误删除一定时间内未访问的热门数据

LFU(Least Frequent Used)最不常使用:

在LRU的基础上,增加了数据访问频次信息,更具访问频率来淘汰数据

缓存更新策略

1、Cache Aside(旁路缓存)策略

由应用程序与缓存和数据库交互

写策略:
  • 先更新数据库中的数据
  • 再删除缓存中的对应数据
读策略:
  • 若读取的数据命中了缓存,直接返回数据
  • 读取的数据没有命中缓存,从数据库读取数据并更新缓存,再返回数据
缺点:
  • 数据库已更新但由于并发请求查询问题,缓存删除后又被更新为旧数据,造成数据库和缓存数据不一致问题(尤其出现在先删除缓存再更新数据库时)
  • 先更新数据再删除缓存时,可能会出现读写请求并发时,读请求读取数据库,而数据库更新完后先删除了缓存,读请求又更新缓存的情况
解决:
  • 更新数据库时一起更新缓存,在更新缓存前先加一个分布式锁,这样在同一时间只允许一个线程更新缓存
  • 给缓存加较短的过期时间

2、Read/Write Through(读穿写穿)策略

应用程序只与缓存交互,缓存与数据库交互

读策略:
  • 先查询缓存中是否存在数据,若不存在则由缓存组件负责从数据库查询数据,并将结果写入到缓存组件,最后缓存组件将数据返回给应用
写策略:
  • 若缓存中数据已存在,更新缓存中的数据,并且由缓存组件同步更新到数据库中,然后缓存组件告知应用程序
  • 缓存数据不存在则直接更新数据库,然后返回
缺点:
  • 无论是Memcached还是Redis都不提供写入数据库和自动加载数据库中数据的能力,只有本地缓存可以考虑添加

3、Write Back(写回)策略

更新数据时只更新缓存并将缓存数据设为脏数据,随后立马返回数据。由开发者决定时机异步批量更新脏数据到数据库

优点:
  • 适合写多的场景,只需要更新缓存,不涉及到磁盘
缺点:
  • 数据不是强一致,且数据有丢失风险

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 操作系统使用 Tcping 命令检查目标主机端口是否开放

检查目标主机端口是否开放的方法已经很多了&#xff0c;网络上也有第三方网页版的检查工具&#xff0c;这篇文章给大家介绍一个实用小工具 Tcping 。 一、下载安装 Tcping 命令 Tcping 非 Windows 自带命令&#xff0c;我们需要下载 Tcping 可执行文件&#xff0c;然后将该文…

开源RTOS(实时操作系统):nuttx 编译

开源RTOS&#xff08;实时操作系统&#xff09;&#xff1a;nuttx 编译 手册&#xff1a;Installing — NuttX latest documentation 源码&#xff1a;GitHub - apache/nuttx: Apache NuttX is a mature, real-time embedded operating system (RTOS) Installing The fir…

python打包exe报错:处理文件时错误:Excel xlsx file; not supported

背景&#xff1a;最近用python写一个excel解析工具&#xff0c;然后打包成exe可执行文件的时候&#xff0c;遇到这样的问题 1.在我自己编译器运行是可以正常将上传后的excel进行解析&#xff0c;但是在打包成exe后&#xff0c;就无法正常解析excel 问题排查&#xff1a; 1.切换…

VUE3 -综合实践(Mock+Axios+ElementPlus)

目录 前言 目标 1.工程创建 2.Mock 2.1 配置Mock 扩 展 2.2 定义模拟数据 2.3 创建Mock服务器 3.导入ElementPlus 4.表格页面搭建 5.动态路由跳转 6.详情页面的制作 前言 基于前文 VUE3详细入门&#xff0c;我们对VUE3的基本使用有了初步的了解&#xff0c;下…

NDS3211HV单路H.264/HEVC/HD视频编码器

1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备&#xff0c;支持2组立体声&#xff0c;同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口&#xff1a;HD-SDI数字视频输入、HDMI高清输入&#xff08;支持CC&#xff09;、A…

LeetCode热题100--206.反转链表--简单

1. 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&…

来一个复古的技术FTP

背景 10年前的老代码&#xff0c;需要升级springboot框架&#xff0c;在升级过程中&#xff0c;测试业务流程里&#xff0c;有FTP的下载业务&#xff0c;不管测试环境如何测试&#xff0c;都没有成功&#xff0c;最后只能自己搭建一个FTP服务器&#xff0c;写一个ftp-demo来测试…

OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好&#xff0c;Open WebUI 迎来重要更新&#xff0c;现已正式支持 MCP 工具服务器&#xff0c;但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理&#xff0c;经测试&#xff0c;它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具&#xff…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Linux安全篇 --firewalld

一、Firewalld 防火墙概述 1、Firewalld 简介 firewalld 的作用是为包过滤机制提供匹配规则(或称为策略)&#xff0c;通过各种不同的规则告诉netfilter 对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式为了更加方便地组织和管理防火墙,firewalld 提供…

系分论文《论系统需求分析方法及应用》

系统分析师论文范文系列 【摘要】 2022年6月&#xff0c;我作为系统分析师参与了某金融机构“智能信贷风控系统”的建设项目。该系统旨在通过对业务流程的数字化重构&#xff0c;优化信贷审批效率并降低风险。项目涉及信贷申请、资质审核、风险评估、额度审批等核心流程&#x…

LIIGO ❤️ RUST: 12 YEARS

LIIGO &#x1f496; RUST: 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天&#xff0c;2015年的今天&#xff0c;Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare&#xff0c;Mozilla公司&#xff0c;…

Trivy:让你时刻掌控的开源安全扫描器

深入了解 Trivy:全面的安全扫描工具 在如今互联网快速发展的时代,软件的安全性显得尤为重要。随着应用程序的复杂性增加,其可能带来的安全漏洞也在不断增多。如何快速、准确地发现这些潜在威胁是每个开发者和运维人员心中的课题。今天,我们将为大家介绍一个开源的安全扫描…

LlamaIndex 第八篇 MilvusVectorStore

本指南演示了如何使用 LlamaIndex 和 Milvus 构建一个检索增强生成&#xff08;RAG&#xff09;系统。 RAG 系统将检索系统与生成模型相结合&#xff0c;根据给定的提示生成新的文本。该系统首先使用 Milvus 等向量相似性搜索引擎从语料库中检索相关文档&#xff0c;然后使用生…

2022河南CCPC(前四题)

签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…

谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程

软件下载 【名称】&#xff1a;谷歌浏览器&#xff08;Google Chrome&#xff09;136.0.7103.93 【大小】&#xff1a;170M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win10/Win11 【夸克网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; h…

高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案

引言&#xff1a;消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天&#xff0c;消息队列&#xff08;Message Queue&#xff09; 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而&#xff0c;传统的自建消息队列&#xff08;如RabbitMQ、Kafka&am…

「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面

一、概述 本篇基于上一节 Python 实现的双通道搜索服务&#xff08;聚合 SearxNG 本地知识库&#xff09;&#xff0c;构建一个完整的 HarmonyOS ArkTS 前端页面。用户可在输入框中输入关键词&#xff0c;实时查询本地服务 http://localhost:5001/search?q...&#xff0c;返…

springCloud/Alibaba常用中间件之Seata分布式事务

文章目录 SpringCloud Alibaba:依赖版本补充Seata处理分布式事务(AT模式)AT模式介绍核心组件介绍AT的工作流程&#xff1a;两阶段提交&#xff08;**2PC**&#xff09; Seata-AT模式使用Seata(2.0.0)下载、配置和启动Seata案例实战前置代码添加全局注解 GlobalTransactional Sp…

Datawhale FastAPI Web框架5月第1次笔记

原课程地址&#xff1a; FastAPI Web框架https://www.datawhale.cn/learn/summary/164本次难点&#xff1a; 切换python的版本为3.10 作业过程 启动&#xff1a; jupyter notebook 首先我们要确保自己的python版本是3.10 import sys print(sys.version) 第一个fastapi…