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

Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案

在现代的高性能应用开发中,Redis作为一款极为热门的内存数据库,其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而,在实际使用过程中,处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存一致性,是保障系统稳定、高效运行的关键。本文将详细探讨这几个方面的实践方案。

 

 一、Redis过期key处理

(一)过期时间的设置

在Redis中,可以为每个键值对设置过期时间,这有助于控制数据的有效期,避免存储不必要的数据占据过多的内存空间。Redis提供了两种设置过期时间的方式:`EXPIRE`和`PEXPIRE`(用于设置毫秒级的过期时间)。例如:

```redis

SET key value

EXPIRE key 60 # 设置键key在60秒后过期

PEXPIRE key 5000 # 设置键key在5000毫秒(即5秒)后过期

```

(二)过期key的处理机制

Redis处理过期key采用的是惰性删除和定期删除相结合的方式:

- 惰性删除:当客户端访问一个key时,Redis会先检查该key是否存在且已过期,如果满足条件,则删除该key,并返回相应结果。这种方式确保了过期的key不会被无意义地读取,但存在一定的风险,即过期key只有在被访问时才会被删除,如果某个过期key一直未被访问,它将一直占用内存。

- 定期删除:Redis会周期性地从设置了过期时间的key集合中随机抽取一定数量的key,并检查它们是否过期,如果过期则删除。这种方式可以避免大量过期key因未被访问而长期占用内存的问题,但并不能保证所有的过期key都能被及时清理。

 

 二、内存淘汰策略

随着Redis的使用,内存占用可能会不断增加,如果不加以控制,可能会导致性能下降甚至触发内存不足的情况。因此,合理的内存淘汰策略至关重要。

 (一)常见的内存淘汰策略

- noeviction(默认策略):当内存不足以容纳新写入数据时,新的写入操作会报错。只有在没有设置淘汰策略或者设置的淘汰策略无效时,才会采用此策略。这种策略保证了数据的一致性,但可能会影响系统的可用性。

- allkeys-lru:在所有的key中使用LRU(Least Recently Used,最近最少使用)算法进行淘汰,即删除最近最少访问的key。这种策略适用于数据访问具有一定的局部性特征的场景。

- volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰。

- allkeys-random:从所有的key中随机淘汰一部分key,简单直接,但可能不是最优的选择。

- volatile-random:从设置了过期时间的key中随机淘汰部分key。

- volatile-ttl:从设置了过期时间的key中,淘汰剩余有效期最短的key,即优先删除即将过期的key。

(二)实践方案

在配置内存淘汰策略时,需要根据实际业务场景和需求进行选择。例如,对于缓存系统,如果数据具有明显的时效性,`volatile-ttl`可能是一个不错的选择,可以优先清理即将过期的数据;如果数据访问较为均匀,`allkeys-lru`能够更好地利用内存空间。

 

以下是将内存淘汰策略设置为`allkeys-lru`的示例配置:

```redis

maxmemory 512mb # 设置Redis使用的最大内存为512MB

maxmemory-policy allkeys-lru # 设置内存淘汰策略为allkeys-lru

```

 

三、缓存一致性策略的实践方案

在分布式系统中,缓存与数据源之间的一致性是一个重要问题。当数据源中的数据发生变化时,如果缓存中的数据没有及时更新,可能会导致数据不一致的情况。以下是几种常见的缓存一致性策略及其实践方案:

(一)缓存更新策略

- 先更新数据库,后更新缓存:在数据源发生变化时,先更新数据库中的数据,然后再更新缓存中的数据。这种方式保证了缓存中的数据最终与数据源中的数据一致,但在高并发场景下,可能会出现缓存与数据源数据不一致的短暂窗口,例如在更新缓存过程中,如果有其他请求读取数据,可能会读取到旧的数据。

- 先删除缓存,后更新数据库:当数据源发生变化时,先删除缓存中的数据,然后再更新数据库。这样可以避免在更新缓存过程中出现数据不一致的问题,下次读取数据时,会从数据源中读取最新数据并重新放入缓存。但这种方式可能会导致在高并发场景下,大量请求在缓存被删除后直接从数据库中读取数据,给数据库带来较大压力。

(二)监听数据源变化

在某些情况下,如果能够实时监听到数据源的变化,就可以在数据源更新时及时更新缓存中的数据。例如,对于使用关系型数据库的应用,可以使用数据库的触发器或者监听数据库的变更日志(如MySQL的binlog)来实时感知数据的变化,并相应地更新缓存。

 (三)采用消息队列

引入消息队列机制也是一种常用的解决缓存一致性的方案。当数据源发生变化时,将变更事件发送到消息队列中,然后由消费者接收到消息后,更新缓存中的数据。这样可以解耦数据源和缓存的更新逻辑,同时保证数据的一致性。

 

四、总结

Redis的过期key处理、内存淘汰策略和缓存一致性策略对于保障系统的性能和数据一致性至关重要。在实际应用中,需要根据业务的实际需求和场景特点,合理选择和配置相应的方法和策略。通过科学的设置和处理,可以充分发挥Redis的优势,为高性能应用提供可靠的支持,同时避免因内存不足和数据不一致等问题导致的系统故障和风险。

相关文章:

Redis过期key处理、内存淘汰策略与缓存一致性策略实践方案

在现代的高性能应用开发中,Redis作为一款极为热门的内存数据库,其快速的读写性能和丰富的数据结构使其在缓存、消息队列等诸多领域得到了广泛应用。然而,在实际使用过程中,处理好Redis过期key、选择合适的内存淘汰策略以及确保缓存…...

@linux系统SSL证书转换(Openssl转换PFX)

在Linux中,你可以使用OpenSSL工具将PFX/P12格式的证书转换为单独的CRT(证书)、KEY(私钥)文件以及提取证书链 1. 提取私钥文件(.key) openssl pkcs12 -in your_certificate.pfx -nocerts -out private.key -nodes系统会…...

工业制造各个系统术语

简单总结下 文章目录 MES:制造执行系统ERP:企业资源计划PLM:产品生命周期管理MRP:物资需求计划QMS:质量管理系统APS:高级计划与排程SRM:供应商关系管理SCM:供应链管理CRM:客户关系管理WMS:仓库管理系统TMS:运输管理系统PMS:生产管理系统LES:物流执行系统FICO:财务与成本控制模块…...

深入解析:Python爬取Bilibili视频的技术创新与高阶实践

一、技术背景与挑战 Bilibili(B站)作为中国最大的泛二次元文化社区,其视频内容防护机制持续升级,传统爬虫技术面临三大核心挑战:动态加密参数、音视频分离存储、反爬策略多样化。本文提出一套融合AIGC辅助分析的智能爬…...

VS Code Markdown渲染配置

VS code markdown preview enhanced插件渲染配置 mac: commandshiftP命令输入Markdown Preview Enhanced: Customize CSS,并点击在打开的style.less配置文件添加一下配置 /* Please visit the URL below for more information: */ /* https://shd101wyy.github.…...

gcc -Wno-cpp

-Wno-cpp 是一个 GCC(GNU 编译器) 的编译选项,用来控制对 #warning 或 #error 指令中 # 注释的警告显示。 🌟 简单解释: 在 C/C 代码中,有时候我们会看到这样的宏定义或注释: #warning This f…...

数据结构篇:线性表的另一表达—链表之单链表(上篇)

目录 1.链表的引入 1.1 链表的概念 1.2 next的意义 2.链表的分类 3.单链表的实现 3.1 单链表实现接口 3.1.1 插入节点函数封装 3.1.2 尾插 3.1.3 头插 3.1.4 报错的根本问题 3.1.5 头删 3.1.6 尾删 4.小结 1.链表的引入 根据顺序表的一些缺陷…...

SpringBoot企业级开发之【用户模块-获取用户详细信息】

接口文档的要求: 了解一下token令牌头是怎么用的 我们直接放到前端交互的controller类下,在声明的方法中加入参数为String token且加入注解RequestHeader(name"Authorization【你自己设定的token】") 设计思路: 实战开发: control…...

Mockito如何对静态方法进行测试

在 Mockito 中,直接对静态方法进行模拟是困难的,因为 Mockito 的设计理念是优先通过依赖注入(DI)管理对象,而静态方法破坏了这种设计(难以解耦)。不过,从 Mockito 3.4.0 版本开始,通过 mockStatic 方法支持了对静态方法的模拟(需配合 mockito-inline 依赖)。 从 Mo…...

患者根据医生编号完成绑定和解绑接口

医疗系统接口文档 一、Controller 层 1. InstitutionDoctorController 医疗机构和医生相关的控制器,提供机构查询、医生查询、绑定解绑医生等功能。 RestController RequestMapping("/institution-doctor") public class InstitutionDoctorController…...

Navicat 17 for Mac 数据库管理

Navicat 17 for Mac 数据库管理 一、介绍 Navicat Premium 17 for Mac是一款专业的数据库管理工具,适用于开发人员、数据库管理员和分析师等用户。它提供了强大的数据管理功能和丰富的工具,使用户能够轻松地管理和维护数据库,提高数据处理效…...

面试如何应用大模型

在面试中,如果被问及如何应用大模型,尤其是面向政务、国有企业或大型传统企业的数字化转型场景,你可以从以下几个角度进行思考和回答: 1. 确定应用大模型的目标与痛点 首先,明确应用大模型的业务目标,并结合企业的实际需求分析可能面临的痛点。这些企业通常会关注如何提…...

grok 驱动级键盘按键记录器分析

grok是一个驱动模块,其主要功能就行进行键盘按键及剪切板数据的记录,也就是一个键盘记录器。实现原理是通过对shadow-ssdt的相关函数进行hook,和r3对GetUserMessage进行hook的原理差不多。 关键部分如下: 查找csrss.exe进程是否已经启动&…...

MyBatis中特殊符号处理总结

前言 MyBatis 是一款流行的Java持久层框架&#xff0c;广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时&#xff0c;会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号&#xff0c;而 MyBatis 使用…...

【学Rust写CAD】37 premultiply 函数(argb.rs补充方法)

源码 fn premultiply(self) -> Argb {//预乘// This could be optimized by using SWARlet a self.alpha32();if a < 255 {Argb::new32(a, div255(self.red32() * a), div255(self.green32() * a),div255(self.blue32() * a))}else{self}源码分析 这个函数实现了颜色预…...

MYSQL——SQL语句到底怎么执行

查询语句执行流程 MySQL 查询语句执行流程 查询缓存&#xff08;Query Cache&#xff09; MySQL内部自带了一个缓存模块&#xff0c;默认是关闭的。主要是因为MySQL自带的缓存应用场景有限。 它要求SQL语句必须一摸一样表里面的任何一条数据发生变化时&#xff0c;该表所有缓…...

智能血压计WT2801芯片方案-BLE 5.0无线传输、高保真语音交互、LED显示驱动、低功耗待机四大技术赋能

在智能健康设备飞速发展的今天&#xff0c;血压计早已不再是简单的“测量工具”&#xff0c;而是家庭健康的“智能管家”。然而&#xff0c;一台真正可靠、易用、功能全面的血压计&#xff0c;离不开一颗强大的“核心芯片”。 今天&#xff0c;我们揭秘医疗级芯片WT2801的硬核实…...

基于51单片机的智能火灾报警系统—温度烟雾检测、数码管显示、手动报警

基于51单片机的火灾报警系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 由51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块构成 具体功能&#xff1a;…...

【Java】Java 中不同类型的类详解

目录 Java 中不同类型的类详解一、基础类类型1. 普通类&#xff08;Concrete Class&#xff09;2. 抽象类&#xff08;Abstract Class&#xff09;3. 接口&#xff08;Interface&#xff09;4. 枚举类&#xff08;Enum Class&#xff09; 二、嵌套类与特殊类5. 内部类&#xff…...

指定运行级别

linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程&#xff1a; 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…...

解决playwright操作网页下拉菜单问题

一个通俗易懂的 Playwright Python 教程&#xff0c;教你如何操作网页的下拉菜单。我们会从基础开始&#xff0c;一步步讲解&#xff0c;并配上实际例子。 Playwright 操作网页下拉菜单教程&#xff08;Python版&#xff09; 什么是 Playwright&#xff1f; Playwright 是一个…...

Python标准库:sys模块深入解析

sys模块是Python标准库中一个非常重要的内置模块&#xff0c;它提供了与Python解释器及其环境交互的多种功能。本文将深入探讨sys模块的各个方面&#xff0c;帮助开发者更好地理解和利用这个强大的工具。 1. sys模块概述 sys模块提供了对由解释器使用或维护的变量的访问&…...

HOW - 实现 useClickOutside 或者 useClickAway

场景 在开发过程中经常遇到需要点击除某div范围之外的区域触发回调&#xff1a;比如点击 dialog 外部区域关闭。 手动实现 import { useEffect } from "react"/*** A custom hook to detect clicks outside a specified element.* param ref - A React ref object…...

加油站小程序实战教程10开通会员

目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面&#xff0c;有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候&#xff0c;在页面加载完毕后调用API看用户是否已经开通会员了&#xff0c;如果未开通就…...

TorchServe部署模型-index_to_name.json

在TorchServe部署模型时&#xff0c;若要将模型输出结果映射到指定标签&#xff08;如分类任务的类别名称&#xff09;&#xff0c;需通过index_to_name.json文件定义索引与标签的映射关系&#xff0c;并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例&#xff1…...

Python 3.x cxfreeze打包exe教程

Python 3.x cxfreeze打包exe教程 https://blog.csdn.net/qq_33704787/article/details/123926953 去官网 下载安装 pip install cx-Freeze7.2.9 https://pypi.org/project/cx-Freeze/7.2.9/ 安装到 你的 python 的 script文件夹下面 &#xff08;全局或是 虚拟环境都行&#x…...

Vue/React组件/指令/Hooks封装的基本原则以及示例

一、组件封装原则与示例 Vue组件封装 核心原则 • 单一职责:每个组件只解决一个功能(如分页、过滤表单) • Props控制输入:通过定义明确的Props接口接收外部数据(类型校验、默认值) • Emit事件通信:子组件通过$emit向父组件传递动作(如分页切换) • 插槽扩展性:使用…...

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...

SDL显示YUV视频

文章目录 1. **宏定义和初始化**2. **全局变量**3. **`refresh_video_timer` 函数**4. **`WinMain` 函数**主要功能及工作流程:总结:1. 宏定义和初始化 #define REFRESH_EVENT (SDL_USEREVENT + 1) // 请求画面刷新事件 #define QUIT_EVENT...

没有他的“变换”,就没有今天的人工智能

从ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLM&#xff09;是所有人追逐的方向&#xff0c;无论是将其看作“万能神”或是人工智能应用的基础构件&#xff0c;其重要性毋庸置疑。而随着大语言模型扩展到多模态领域&#xff0c;就需要更多的工具来帮助其进行处理。 例…...