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

Redis 知识点一

参考
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。

相关文章:

Redis 知识点一

参考 Redis - 常见缓存问题 - 知乎 Redis的缓存更新策略 - Sherlock先生 - 博客园 三种缓存策略:Cache Aside 策略、Read/Write Through 策略、Write Back 策略-CSDN博客 1.缓存问题 1.1.缓存穿透 大量请求未命中缓存,直接访问数据库。 解决办法&…...

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

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

数据结构与算法——二叉树高频题目(1)

前言: 简单记录一下自己学习算法的历程,主要根据左老师自己的视频课进行,由于大部分课程涉及题目较多,所以分文章进行记录。 本文将简单记录一下二叉树的层序遍历和 Z 形层次遍历。 参考视频: 算法讲解036【必备】…...

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

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

CppCon 2015 学习:Memory and C++ debugging at Electronic Arts

这是关于 C 游戏开发中内存接口与调试工具演进 的介绍,主要回顾了从早期到现在平台上的内存与调试策略变化: 游戏平台演进与内存接口编程风格 2000年 (PlayStation 2) 编程风格偏向嵌入式 C 风格。系统资源有限(例如 32MB RAM)…...

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. 多网格检测算法…...

OpenEuler服务器警告邮件自动化发送:原理、配置与安全实践

OpenEuler服务器警告邮件自动化发送:原理、配置与安全实践 在服务器的运维管理过程中,及时感知系统异常状态至关重要。当OpenEuler系统运行时,将服务器的警告信息实时推送至邮箱,能帮助运维人员快速响应潜在问题,保障…...

随机访问介质访问控制:网络中的“自由竞争”艺术

想象一场自由辩论赛——任何人随时可以发言,但可能多人同时开口导致混乱。这正是计算机网络中随机访问协议的核心挑战:如何让多个设备在共享信道中高效竞争?本文将深入解析五大随机访问技术及其智慧。 一、核心思想:自由竞争 冲突…...

【Redis】笔记|第9节|Redis Stack扩展功能

Redis Stack 扩展功能笔记(基于 Redis 7) 一、Redis Stack 概述 定位:Redis OSS 扩展模块(JSON、搜索、布隆过滤器等),提供高级数据处理能力。核心模块: RedisJSON:原生 JSON 支持…...

【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 支持 能…...

ffmpeg(五):裁剪与合并命令

裁剪(剪切) 精准裁剪(有转码,支持任意起止时间) # 从第 10 秒到第 30 秒,重新编码 ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:30 -c:v libx264 -c:a aac output.mp4快速裁剪(无转码&#x…...

CCPC guangdongjiangsu 2025 F

题目链接:https://codeforces.com/gym/105945/problem/F 题目背景: 你知道自己队伍的过题数、罚时,还知道另一个队伍的每次提交记录(三种状态:ac:通过,rj:未通过,pb&…...

SSE (Server-Sent Events) 技术简介

一、SSE 技术概述 Server-Sent Events (SSE) 是一种允许服务器向客户端实时推送数据的 Web 技术,它基于 HTTP 协议实现服务器到客户端的单向通信。 基本特点 ● 单向通信:仅服务器→客户端方向 ● 基于HTTP:使用标准HTTP协议,无需…...

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

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

常见 DOM 事件全解析

常见 DOM 事件全解析 DOM 事件是用户与网页交互的核心机制,分为 用户交互事件、文档加载事件、表单事件、键盘事件 等 8 大类: 一、鼠标事件 事件触发时机典型应用场景click点击元素(按下+释放)按钮操作、导航跳转dblclick双击元素文件/图片编辑mousedown鼠标按下拖拽开始…...

在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…...

Elasticsearch:spring2.x集成elasticsearch8.x

相关安装就不介绍了直接代码集成 <!-- elasticsearch版本需要和你安装的版本一致 --><properties><elasticsearch.version>8.11.1</elasticsearch.version><jakarta-json.version>2.1.2</jakarta-json.version><logstash.version>7…...

华为云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 文本…...

gem5-gpu教程 在gem5-gpu上运行多个应用程序

问题一、gem5-gpu是否能够在系统调用仿真中同时运行两个不同的应用程序,一个在CPU上,另一个在gpu上。如果是这样,我该怎么做?我查看了配置和帮助文件,没有找到明确的方法。看起来rodinia基准测试使用CPU在GPU内核中启动工作,CPU内核在GPU执行时几乎处于空闲状态。这里的另…...

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

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

四自由度机械臂Simulink仿真设计与实现

四自由度机械臂Simulink仿真设计与实现 摘要 本文详细介绍了基于MATLAB/Simulink的四自由度机械臂建模、仿真与控制实现。通过建立完整的运动学和动力学模型,设计PID控制器,实现轨迹跟踪功能,并利用3D可视化技术进行仿真验证。全文涵盖理论建模、Simulink实现和仿真分析三…...

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

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

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

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

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

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