【redis】redis内存管理,过期策略与淘汰策略
一:Redis 的过期删除策略及处理流程如下:
1. 过期删除策略
Redis 通过以下两种策略删除过期键:
1.1 惰性删除
- 触发时机:当客户端访问某个键时,Redis 会检查该键是否过期。
- 执行流程:
- 客户端请求访问键。
- Redis 检查键的过期时间。
- 如果键已过期,Redis 删除该键并返回空;如果未过期,返回键值。
1.2 定期删除
- 触发时机:Redis 定期随机抽取部分键检查是否过期。
- 执行流程:
- Redis 从设置了过期时间的键中随机抽取一部分。
- 检查这些键是否过期。
- 删除已过期的键。
- 如果过期键比例超过一定阈值,重复该过程。
2. 处理流程
Redis 处理过期键的流程结合了惰性删除和定期删除:
-
客户端访问:
- 客户端请求访问键时,Redis 先检查键是否过期,若过期则删除并返回空。
-
定期检查:
- Redis 定期随机抽取部分键检查过期情况,删除已过期的键。
- 如果过期键比例较高,继续检查更多键。
-
内存回收:
- 通过惰性删除和定期删除,Redis 逐步回收过期键占用的内存。
3. 配置参数
- hz:控制定期删除的频率,默认 10,表示每秒执行 10 次检查。
- maxmemory-samples:设置每次检查时随机抽取的键数量,默认 5。
4. 总结
- 惰性删除:在访问时检查并删除过期键。
- 定期删除:定期随机检查并删除过期键。
这两种策略共同确保 Redis 高效管理内存,避免过期键占用过多资源。
在 Redis 中,缓存淘汰策略 和 过期策略 是两种不同的机制,但它们共同作用于缓存数据的管理。以下是对 LRU 和 LFU 缓存淘汰策略的区别,以及它们与过期策略的应用场景的详细解读。
二、缓存淘汰策略:LRU 和 LFU 的区别
1. LRU(Least Recently Used,最近最少使用)
- 原理:优先淘汰最近最少被访问的数据。
- 实现方式:Redis 使用近似 LRU 算法,通过随机采样一部分键,从中淘汰最近最少使用的键。
- 特点:
- 关注数据的访问时间。
- 适合访问模式有明显热点数据的场景。
- 适用场景:
- 热点数据缓存(如新闻、社交媒体热门内容)。
- 需要保留最近访问数据的场景。
2. LFU(Least Frequently Used,最不常用)
- 原理:优先淘汰访问频率最低的数据。
- 实现方式:Redis 记录每个键的访问频率,淘汰访问次数最少的键。
- 特点:
- 关注数据的访问频率。
- 适合访问模式较为均匀的场景。
- 适用场景:
- 访问频率差异较大的场景(如推荐系统、广告系统)。
- 需要保留高频访问数据的场景。
3. LRU 和 LFU 的区别
| 特性 | LRU | LFU |
|---|---|---|
| 关注点 | 数据的访问时间 | 数据的访问频率 |
| 适用场景 | 有明显热点数据的场景 | 访问频率差异较大的场景 |
| 优点 | 简单高效,适合短期热点数据 | 更精准,适合长期高频数据 |
| 缺点 | 可能误删高频但近期未访问的数据 | 需要额外记录访问频率,开销较大 |
三、缓存淘汰策略与过期策略的结合应用
在实际应用中,缓存淘汰策略和过期策略通常需要结合使用,以满足不同的业务需求。
1. 热点数据缓存
- 过期策略:为热点数据设置较长的过期时间。
- 淘汰策略:使用
allkeys-lru,优先保留最近访问的热点数据。 - 场景:新闻、社交媒体热门内容。
2. 临时数据缓存
- 过期策略:为临时数据(如验证码、会话)设置较短的过期时间。
- 淘汰策略:使用
volatile-ttl,优先淘汰即将过期的数据。 - 场景:验证码、会话缓存。
3. 冷数据清理
- 过期策略:为冷数据设置过期时间。
- 淘汰策略:使用
volatile-lfu,优先淘汰访问频率低的冷数据。 - 场景:历史数据、低频访问数据。
4. 不允许数据丢失的场景
- 过期策略:不设置过期时间,或设置较长的过期时间。
- 淘汰策略:使用
noeviction,确保数据不被淘汰。 - 场景:金融、交易系统。
四、总结
1. LRU 和 LFU 的选择
- 如果业务有明显的热点数据,选择 LRU。
- 如果业务需要关注数据的访问频率,选择 LFU。
2. 过期策略的选择
- 如果数据有明确的生命周期,设置 过期时间。
- 如果需要及时清理过期键,启用 定期删除。
3. 结合使用
- 根据业务特点,合理配置 缓存淘汰策略 和 过期策略,以优化 Redis 的性能和资源利用率。
通过合理选择策略,可以有效提升 Redis 的缓存命中率和系统性能。
相关文章:
【redis】redis内存管理,过期策略与淘汰策略
一:Redis 的过期删除策略及处理流程如下: 1. 过期删除策略 Redis 通过以下两种策略删除过期键: 1.1 惰性删除 触发时机:当客户端访问某个键时,Redis 会检查该键是否过期。执行流程: 客户端请求访问键。…...
RabbitMQ学习—day6—死信队列与延迟队列
目录 死信队列 1. 死信的概念 2. 死信的来源 实战演练 1. 消息TTL过期 2. 队列达到最大长度 3. 消息被拒绝 延迟队列 概念 使用场景 TTL的两种设置 死信队列 1. 死信的概念 1.1 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的…...
seacmsv9联合注入数据以及绕过 ORDERBY
seacmsv9联合注入数据 php源码 <?php session_start(); require_once("../../include/common.php"); $id (isset($gid) && is_numeric($gid)) ? $gid : 0; $page (isset($page) && is_numeric($page)) ? $page : 1; $type (isset($type) …...
day58 第十一章:图论part08
拓扑排序精讲 关键: 先找到入度为0的节点,把这些节点加入队列/结果,然后依次循环再找。 #include <iostream> #include <vector> #include <queue> #include <unordered_map> using namespace std; int main() {int …...
网络安全-openssl工具
OpenSSl是一个开源项目,包括密码库和SSL/TLS工具集。它已是在安全领域的事实标准,并且拥有比较长的历史,现在几乎所有的服务器软件和很多客户端都在使用openssl,其中基于命令行的工具是进行加密、证书管理以及测试最常用到的软件。…...
Java面试第六山!《MySQL基础知识点》
一、引言 MySQL 作为一款广泛使用的开源关系型数据库管理系统,在软件开发领域占据着重要地位。无论是小型项目还是大型企业级应用,都能看到 MySQL 的身影。今天就来和大家分享 MySQL 的相关知识,帮助大家更好地应对日常开发和面试。 二、My…...
云计算中的API网关是什么?为什么它很重要?
在云计算架构中,API网关(API Gateway)是一个重要的组件,主要用于管理、保护和优化不同服务之间的接口(API)通信。简单来说,API网关就像是一个中介,它充当客户端和后端服务之间的“桥…...
【WebGL】fbo双pass案例
双pass渲染案例(离线渲染一个三角面,然后渲染到一个占满屏幕的矩阵上) 离线渲染如何需要开启深度测试的话,需要额外操作,这里不展开 <!DOCTYPE html> <html lang"en"><head><meta ch…...
Unity面板介绍_层级面板(23.1.1)
一、Inspector(检视面板) 显示当前选定游戏对象附加的组件及其属性信息。为重要游戏物体选择图标 二、面板详情...
详解Nginx 配置
一、Nginx 介绍 Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器。它由俄罗斯的程序设计师 Igor Sysoev 所开发,自 2004 年发布以来,凭借其高性能、低内存消耗、高并发处理能力等特点…...
数据库系统概念
1. 绪论 数据库的基本概念: 数据(data): 数据库中存储的基本对象, 可以是文字, 声音, 图片, 视频等。 数据库(DB): 概括来说就是永久存储, 有组织, 可共享的大量数据的集合。 数据库管理系统(DBMS): 和操作系统一样是计算机基础软件, 主要有数据定义语言(DDL, 对数据对象的组…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
一台服务器将docker image打包去另一天服务器安装这个镜像
一台服务器将docker image打到去另一天服务器安装这个镜像 1. 打包2.另一台服务器执行 1. 打包 docker save -o nebula-graph-studio.tar harbor1.vm.example.lan/dockerio/vesoft/nebula-graph-studioxxx.tar 是打包好的文件 后面的是 docker image 2.另一台服务器执行 docke…...
QT串口通信之二,实现单个温湿度传感器数据的采集(采用Qt-modbus实现)
接上 QT串口通信之一,实现单个温湿度传感器数据的采集 上述文章中用QSerialPort实现了温湿度传感器的采集,实际上比较麻烦的,因为需要自定义解析帧, 接下来,用Qt-modbus-封装度更高的协议,来实现温湿度的采集; #include "MainWindow.h" #include "ui_M…...
基于SpringBoot的校园消费点评管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【小沐学Java】VSCode搭建Java开发环境
文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器,可在桌面上…...
《操作系统 - 清华大学》8 -4:进程管理:进程控制结构
深度剖析进程控制块:操作系统进程管理的核心关键 在操作系统的复杂体系中,进程控制块(PCB)是实现高效进程管理的关键所在。接下来,将从多个维度深入剖析进程控制块,帮助更好地理解其在操作系统中的重要作用…...
RPC 框架项目剖析
RPC 框架项目剖析 说明 本文用于梳理一个 rpc项目的实现细节,此项目基于cpp语言 大概三千行左右,用于学习目的。 项目链接:rpc项目 项目底层类 1.抽象消息类 描述: 各种消息的基类 属性: 消息id,消息类型…...
C++ Boost面试题大全及参考答案
目录 boost::thread_group 如何实现批量线程管理? 解释 boost::asio 中 proactor 模式的设计原理 使用 boost::atomic 实现无锁环形缓冲区 boost::mutex 与 std::mutex 在异常安全上的差异 如何用 boost::condition_variable 实现生产者 - 消费者模型 当 boost::shared_p…...
关于Transparent native-to-ascii conversion
1、功能 自动转换ASCII编码,即在文件系统上,文件的编码格式为ascii编码,在编辑器(idea/pycharm)中,其展现结果为配置的编码格式,仅展现方便阅读 使用UTF-8并勾选自动转换ASCII编码结果&#x…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
