Redis 知识点一

news2025/6/9 14:07:46

参考
Redis - 常见缓存问题 - 知乎
Redis的缓存更新策略 - Sherlock先生 - 博客园
三种缓存策略:Cache Aside 策略、Read/Write Through 策略、Write Back 策略-CSDN博客

1.缓存问题

1.1.缓存穿透

大量请求未命中缓存,直接访问数据库。
解决办法:
1)对请求进行校验,不合理的直接返回
2)将查询不到的数据也存入缓存,但是过期时间设置短一点
3)设置布隆过滤器

1.1.1.布隆过滤器

数据结构
位数组(Bit Array):初始全为0的二进制位序列。
哈希函数集合:多个独立哈希函数(如 hash1, hash2, hash3)。
操作流程
添加元素:
对元素应用所有哈希函数,得到多个索引位置。
将位数组中对应索引位置设为1。
查询元素:
对元素应用所有哈希函数,得到多个索引位置。
若任一位置为0:元素一定不存在。
若所有位置为1:元素可能存在(存在误判概率)。
操作命令
SETBIT key offset value
GETBIT key offset

1.2.缓存雪崩

大量缓存同时过期,导致请求直击数据库。
解决办法:
1)给所有的缓存设置不一样的过期时间
2)构建多级缓存。如:本地cache、redis、数据库

1.3.缓存击穿

某个热点缓存过期或者被移出,导致大量请求直击数据库。
解决办法:
1)对热点数据加分布式锁
2)后台异步续期
3)多缓存策,使用备份缓存,当主缓存失效,则查询备份缓存,若备份缓存中存在,再更新到主缓存。

1.4.缓存污染

大量不经常被访问的数据把缓存占满了。

1.4.1.淘汰策略

noeviction

该策略是Redis的默认策略。在这种策略下,一旦缓存被写满了,再有写请求来时,Redis 不再提供服务,而是直接返回错误。这种策略不会淘汰数据,所以无法解决缓存污染问题。一般生产环境不建议使用。

allkeys-lru

从所有键中使用LRU(Least Recently Used,最近最少使用)算法淘汰键。
适用场景:缓存场景中,保留频繁访问的键,逐出很少被访问的键。

volatile-lru

从设置了过期时间的键中使用LRU算法进行淘汰。
适用场景:缓存一些有过期时间的数据,并根据访问频率进行内存管理。

allkeys-random

从所有键中随机选择并删除某个键。
适用场景:缓存数据访问频率没有明显差异的情况。

volatile-random

从设置了过期时间的键中随机选择并删除某个键。
适用场景:缓存带有过期时间的数据,且删除哪个数据不重要的场景。

volatile-ttl

在设置了过期时间的键中,根据过期时间的先后进行删除,越早过期的越先被删除。
适用场景:希望优先清理即将过期的数据的场景。

allkeys-lfu(Redis 4.0+)

从所有键中使用LFU(Least Frequently Used,最不常用)算法淘汰键。
适用场景:需要根据使用频率进行淘汰的场景,适用于访问频率有明显差异的数据集。

volatile-lfu(Redis 4.0+)

从设置了过期时间的键中使用LFU算法进行淘汰。
适用场景:与volatile-lru类似,但更关注使用频率。

1.4.2.过期键处理方式

惰性处理:当访问到了这个key再去删除
定时处理:定时遍历所有的key,找到过期的key并删除。

定时依次遍历所有的 DB,默认每 100ms 执行一次。
从 DB 的过期列表中随机取20个 Key ,判断是否过期,如果过期,则清理。
如果有5个以上的 Key 过期,则重复步骤2,否则继续处理下一个 DB 。
在清理过程中,如果达到 CPU 的 25% 时间,退出清理过程。

2.内存和数据库一致性问题

2.1.延迟双删-读多写少

1)删除缓存
2)更新数据库
3)过一段时间后再一次删除缓存

2.2.异步写回-写多读少

讲多次写入归并到缓存队列中,定时的将缓存中的数据计算之后写入数据库。

2.3.写操作时,为什么是删除缓存,而不是更新缓存?

1多线程并发修改的问题,例:
线程A更新数据库(值V1→V2)。
线程B更新数据库(值V2→V3)。
线程B更新缓存(值V3)。
线程A更新缓存(值V2)。

2 更新缓存会面临多次无效写操作(多次对该数据进行写时,缓存中的值会多次update,实际有意义的值只有最后一次写时更新的值),而删除逻辑就更加简单。

2.4.先改数据库还是先删缓存?

2.4.1.如果先删缓存

失败,则直接抛出异常,不存在不一致问题
成功,但是数据库修改失败,则还需更新缓存,可能导致不一致。
成功,数据库也成功,仍然存在不一致问题,例:
A线程删除缓存
B线程查询发现内存不存在,则查询数据库,并将数据库的值存入缓存
A线程更新数据库
在先删缓存,再改数据库的情况下,即使都成功了,仍旧可能存在不一致问题,如何解决?
延迟双删

2.4.2.如果先改数据库

失败,则直接抛出异常,不存在不一致问题
成功,但是缓存删除失败,存在不一致问题
成功,缓存删除也成功,不存在不一致问题
数据库修改成功,但是缓存删除失败,如何处理?
失败重试:失败后,通过消息队列重新删除。
异步更新:监听日志,监听到修改操作,则执行删除任务,如果删除失败,再发送消息队列。

2.5.缓存更新策略

2.5.1.Cache Aside(旁路缓存)-读多写少

应用程序同时和数据库/缓存交互。
读:
如果命中缓存,则直接返回。
如果没命中,则查询数据库,回写缓存。
写:
先更新数据库,再删除缓存。

2.5.2.Read/Write Through(读写穿透)

应用程序只和缓存交互。
读:
如果命中缓存,则直接返回。
写:
如果缓存中存在,则直接更新缓存,再通过缓存组件,同步更新到数据库。
如果缓存没命中,则直接更新数据库,然后返回。

2.5.3.Write Back(写回)-写多读少

Write Back(写回)策略在更新数据的时候,只更新缓存,同时将缓存数据设置为脏的,然后立马返回,并不会更新数据库。对于数据库的更新,会通过批量异步更新的方式进行。

3.Redis发布订阅模式

3.1.基于channel的发布订阅

订阅者可以订阅多个channel,一个channel也可以有多个订阅者。
发布者向channel发布消息后,channel的所有订阅者都能收到消息。
订阅者只能收到订阅之后的消息,订阅前发布的消息接收不到。
发布:publish
订阅:subscribe
实现原理:
字典+链表
每个channel作为一个字典项。字典项后面跟着一个链表,链表上的每个节点就是一个订阅者。

3.2.基于pattern的发布订阅

通过通配符订阅,多个channel
发布:publish
订阅:psubscribe

Subscribe:订阅单个channel
Psubscribe:通过通配符,订阅多个channel

实现原理:
基于链表实现,每个订阅者都是链表上的一个节点,节点描述了订阅的pattern。

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

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

相关文章

分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)

一、作者介绍:六年算法开发经验、AI 算法经理、阿里云专家博主。擅长:检测、分割、理解、大模型 等算法训练与推理部署任务。 二、数据集介绍: 质量高:高质量图片、高质量标注数据,吐血标注、整理,可以作为…

Web后端开发(SpringBootWeb、HTTP、Tomcat快速入门)

目录 SpringBootWeb入门 Spring 需求: 步骤: HTTP协议: 概述: 请求协议: 响应协议: 协议解析: Web服务器-Tomcat: 简介: 基本使用: SpringBootWeb…

android binder(四)binder驱动详解2

二、情景分析 1、ServiceManager 启动过程 2. 服务注册 服务注册过程(addService)核心功能:在服务所在进程创建binder_node,在servicemanager进程创建binder_ref。其中binder_ref的desc在同一个进程内是唯一的: 每个进程binder_proc所记录的…

4G无线网络转串口模块 DTU-1101

4G无线网络转串口模块概述 4G无线网络转串口模块是一种工业通信设备,通过4G网络将串口(如RS232/RS485)设备接入互联网,实现远程数据传输与控制。适用于物联网(IoT)、工业自动化、远程监控等场景。 核心功能…

机器学习方法实现数独矩阵识别器

目录 导包 工具函数构建说明 1. 基础图像处理工具 2. 图像预处理模块 3. 数独轮廓检测与定位 4. 网格划分与单元格提取 5. 数字特征提取 6. 多网格处理流程 数据流分析 核心算法详解 核心机器视觉方法 1. 透视变换校正算法 2. 数字区域提取算法 3. 多网格检测算法…

【Vmwrae】快速安装windows虚拟机

前言 虚拟机是我们在使用电脑进行开发或者平常工作时经常使用到的工具 它可以自定义各种硬件,运行各种不同的系统,且无论发生什么都不会影响到实体机。 教程主要讲了如何在零基础的情况下快速安装一台虚拟机。 下载安装 VMware Workstation Pro17 …

多线程3(Thread)

wait / notify 线程调度是随机的,但是我们可以使用wait/notify进行规划。 join是控制线程结束顺序,而wait/notify是控制详细的代码块,例如: 线程1执行完一段代码,让线程2继续执行,此时线程2就通过wait进…

附加模块--Qt Shader Tools功能及架构解析

Qt 6.0 引入了全新的 Shader Tools 模块,为着色器管理提供了现代化、跨平台的解决方案。 一、主要功能 核心功能 跨平台着色器编译 支持 GLSL、HLSL 和 MetalSL 着色器语言 可在运行时或构建时进行着色器编译 自动处理不同图形API的着色器变体 SPIR-V 支持 能…

网络编程(计算机网络基础)

思维导图 认识网络 1.网络发展史 ARPnetA(阿帕网)->internet(因特网)->移动互联网->物联网 2.局域网与广域网 局域网 概念:的缩写是LAN(local area network),顾名思义,是个本地的网络,只能实现…

在React 中安装和配置 shadcn/ui

1. 创建 React 项目 pnpm create vitelatest .选择模板:React TypeScript安装依赖:pnpm install2. 添加 Tailwind CSS pnpm add -D tailwindcss postcss autoprefixer修改 src/index.css 内容: import "tailwindcss";3. 配置 T…

WINUI——WINUI开发中谨慎使用x:Bind

原因——为什么需要谨慎使用x:Bind? 在实际开发中发现,使用它会导致VM回收不及时,可能导致内存泄漏。 那为何要在项目中使用它呢? 因为:{x:Bind} 标记扩展(Windows 10 的新增功能)…

MSYS2 环境配置与 Python 项目依赖管理笔记

#工作记录 MSYS2 环境配置 安装和更新 MSYS2 初始安装 下载并安装 MSYS2: 访问 MSYS2 官方网站 并下载安装包。 按照安装向导完成安装。 更新 MSYS2: 打开 MSYS2 终端(MSYS2 MINGW64)。 更新包数据库和核心系统包&#xff1…

华为云Flexus+DeepSeek征文|华为云一键部署知识库搜索增强版Dify平台,构建智能聊天助手实战指南

目录 前言 1 架构描述 2 资源栈创建流程详解 2.1 选择部署模板 2.2 参数配置内容 2.3 资源栈设置选项 2.4 配置确认与执行方式 3 部署过程与控制台反馈 3.1 实时资源监控 3.2 资源详情与访问路径 3.3 模板与事件管理 4 知识库构建流程 4.1 数据导入操作 4.2 文本…

分形几何在医学可视化中的应用:从理论到Python实战

分形几何在医学可视化中的应用:从理论到Python实战 前言 分形几何作为描述自然界复杂结构的数学工具,正通过其自相似性和分数维度特性,革新医学影像分析领域。本文系统阐述分形几何在医学影像中的创新应用,涵盖从图像预处理、分…

ESP-Brookesia:融合 AI 大模型,全新一代 GUI 开发与管理平台

乐鑫信息科技 (688018.SH) 推出 ESP-Brookesia ——一款专为物联网设备打造、集成 AI 交互能力的 UI 开发与管理框架。 ESP-Brookesia 深度融合 AI 大模型技术,为智能屏显应用赋予语音识别、自然语言对话、拟人化反馈等能力,帮助开发者构建更智能、更具…

【MATLAB去噪算法】基于CEEMD联合小波阈值去噪算法(第三期)

02.去噪算法原理 1.引言 传统EMD方法存在模态混叠问题,即信号成分在不同IMF分量中出现碎片化分布。为改进这一问题,Huang等(1999)提出间歇性测试算法,但效果有限。Wu和Huang(2009)发展的集合经…

机器学习实战37-基于情感字典和机器学习的股市舆情分析可视化系统

文章目录 一、项目背景数字时代情感分析情况二、项目流程1.数据采集与预处理2.复合情感分析模型构建3.舆情分析可视化:三、机器学习算法原理1.支持向量机基础2.核函数与高维映射3.情感分类特征融合4.模型训练与优化四、实现代码五、系统特点与优势1.复合情感分析模型2.多维度可…

CAD多面体密堆积3D插件

插件介绍 CAD多面体密堆积3D插件可在AutoCAD内建立三维随机多面体密堆积模型。 插件内置物理动力学模拟算法,通过模拟重力、碰撞等现象,使多面体在虚拟环境中发生自然堆积,进而实现真实的堆积效果。多面体堆积模拟中存在的局部穿模问题可通…

LLMs 系列科普文(5)

在前文中,我们讲述了什么是基础模型,并重点以 LLaMA 3.1 基础模型为例,向大家演示了它可以做什么,有哪些问题或有趣的现象。 在进入新的主题内容之前,我们再次对 基础模型 做一些总结: 这是一个基于 toke…

HarmonyOS开发:显示图片功能详解

目录 前言 Image组件基础 1、Image组件概述 2、加载图片资源 3、存档图类型数据源 (1)本地资源 (2)网络资源 (3)Resource资源 (4)媒体库file://data/storage (…