Redis不同场景下的注意事项

Redis常见的 使用场景:

  • 缓存系统(核心场景)
    • 存储热点数据,减少数据库访问压力。提升接口响应速度。
    • 技术点:
      • 用String/Hash 存储结构化数据
      • 结合过期时间(TTL)和缓存淘汰策略(如LRU)管理内存。
      • 解决缓存问题:穿透(布隆过滤器)、击穿(互斥锁)、雪崩(随机过期时间)。
  • 计数器与限流
    • 实时统计高频变动的值,或限制接口访问访问频率。
    • 技术点:
      • 用String存储单计数器(INCR )。
      • 用HASH存储多维计数器(HINCRBY user:100 stats:likes 1)
      • 限流可结合Expire自动重置技术(如 INCR limit:ip:192.168.1.1 + EXPIRE … 60)。
  • 消息队列
    • 实现简单的异步通信,解耦生产者和消费者。
    • 技术点:
      • 用List模拟队列:LPUSH(生产)+ RPOP(消费),或阻塞版本BRPOP避免空轮询。
      • 缺点:无消息确认机制,需要结合确认机制,需结合AOF持久化减少丢失风险;高级需求(如延时队列)需要额外设计。
  • 排行榜与实时排名
    • 作用:根据分数动态排序,商品销量榜,用户贡献榜。
    • 技术点:
      • 用Sorted Set存储:ZADD rank:game user:100 95(用户 100 分数 95),ZRANGE rank:game 0 9 WITHSCORES 取前 10 名。
      • 支持分数自增(ZINCRBY),适合动态更新排名。
  • 分布式锁
    • 作用:在分布式系统中保证临界资源的互斥访问(如库存扣减、订单创建)
    • 优化:使用Redisson框架,支持自动续期、公平锁、可重入等高级特性。
  • 用户行为分析
    • 记录用户行为状态,快速统计群体特征。
    • 技术点:
      • 用BitMap存储每日登录状态:SETBIT login:20201001 user:100 1(用户100在20201001登录)通过BITOP作位运算统计活跃用户。
      • 用SET存储用户标签:SADD tag:view:goods100 :100,通过交集(SINTER)找共同标签用户。
  • 地理信息服务
    • 作用:存储地理位置,实现附近搜索,距离计算等功能;
    • 技术点:
      • 用Geospatial命令:GEOADD shops 116.40 39.90 shop:1 存储经纬度,GEORADIUS shops 116.40 39.90 5 km 查找 5 公里内的商家。
  • 会话存储
    • 作用:存储用户登录状态(如Session、Token),支持分布式系统共享会话。
    • 技术点:
      • 用String存储Session/Token:SET session:user100 ”xxx“EX 7200(2小时过期)。
      • 结合EXPIRE自动销毁过期会话,减轻服务器存储压力。

缓存场景

缓存关键问题:数据一致性、可用性、内存效率。同时规避缓存常见风险(如穿透、击穿、雪崩)。

  1. 缓存穿透:避免”不存在的数据“,穿透到数据库。
    问题本质:请求查询 不存在的数据,导致缓存无法命中。所有请求都直接打到数据库,导致数据库压力骤增。
    解决方案

    • 空值缓存:数据库给查询为空时,可以将空值存入缓存。并设置较短的过期时间。避免重复穿透。 恶意攻击会导致内存膨胀。
    • 布隆过滤器:在缓存前加一层布隆过滤器,将数据库中存在的key提前存入过滤器,请求先过过滤器。
    • 参数校验:接口层直接拦截非法参数(如id<0,非预期格式的key),从源头阻断无效请求。
  2. 缓存击穿:避免热点key过期,导致数据库瞬间过载。

    • 问题本质:某个高频访问的热点key过期瞬间大量请求同时命中失效的缓存,全部穿透到数据库,造成数据库“瞬间峰值”。
    • 解决方式:
      • 互斥锁(分布式锁):缓存未命中时,只有一个请求能获取锁并查询数据库,其他请求自选等待(或直接返回默认值),避免“并发穿透。注意:锁过期时间需要大于数据库查询时间,防止锁提前释放导致并发问题;同时注意避免死锁。
      • 热点key永不过期
        • 业务层不设置TTL,通过后台定时任务(如Cron脚本主动更新(如每小时更新商品信息)。
        • 若数据需要实时更新,壳子啊数据变更时主动SET命令覆盖缓存,而非TTL过期。
      • 过期时间错开:对同类热点key设置随机过期时间(如基础过期时间+5~8分钟随机值)。
  3. 缓存雪崩问题,避免大量key集体过期/集群宕机导致数据库崩溃
    问题本质
    同一时间段内大量缓存key集中过期,请求全部穿透到数据库。
    Redis缓存集群整体宕机,缓存层整体失效。所有请求直接打向数据库。
    解决方法

    • 针对大量key同时过期:给每个key设置随机过期时间。分散过期时间。
    • 针对集群宕机:
      • 缓存使用集群高可用
      • 多级缓存:在Redis之前使用本地缓存(如:Caffeine、GuavaCache),即使Redis宕机本地缓存也可以暂代部分请求,减轻数据库压力。
      • 熔断降级:通过监控工具(如Prometheus+Grafana)实时检测数据库压力。当压力超过指定阈值时,出发熔断(直接返回默认值或错误提示),避免数据库崩溃。
      • 流量控制:结合网关做接口限流,限制单位时间内的请求量。

数据一致性

缓存与数据库 尽量保持一致,避免缓存存旧数据,数据库存新数据 的矛盾场景。

  1. 选择合适的 更新策略
  2. 处理缓存更新失败问题:
    • 若数据库更新成功,但删除缓存失败,会导致缓存残留旧数据。解决方案:
      • 重试机制:删除缓存失败后,通过 本地重试机制或消息队列 异步重试(如将”删除缓存任务存入队列中,失败后重新消费),确保缓存最终被删除。
      • 版本号+时间戳:缓存中存储“数据+版本号”,查询时对比数据库版本号,若缓存版本低则主动更新。

相关优化

Redis是内存数据库,需合理管理内存,避免内存溢出 性能下降。

  1. 缓存key的设计:
    • 简洁且唯一:用“业务前缀+唯一标识”格式(如user:session:1001、goods:detail:abc123)避免key冲突
    • 避免过长:key过长会增加内存占用。
    • 避免大量小key,大量零散的小key会浪费内存(如 user💯name、user💯age)建议使用Hash合并(如 user:100 {name: “xxx”, age: 20})。
  2. 合理配置淘汰策略:当Redis内存到达maxmemory阈值时,需通过淘汰策略释放内存,避免OOM内存溢出。需根据业务选择策略:
    • 核心策略推荐:
      • LRU:淘汰 最近最少使用的key(适合热点数据场景,如商品详情),对应配置 maxmemory-policy allkeys-lru(所有 key 中选 LRU)或 volatile-lru(只在设置了 TTL 的 key 中选 LRU)。
      • LFU:淘汰最近访问频率最低的key(适合长期低频访问数据,如历史订单)。对应配置:allkey-lfu或volatile-lfu。
    • 避免使用的策略:
      • noeviction(默认):内存满时,直接拒绝写请求,会导致业务报错,除非是只读场景。
      • random:随即淘汰,可能淘汰热点数据,不推荐。
  3. 控制缓存粒度与过期时间。
    • 缓存粒度不宜过粗过细:
      • 过粗:导致缓存数据冗余,更新世需全量替换,浪费带宽和内存。
      • 过细:将对象每个属性单独存储,导致 key数量增加,和查询次数增多。
      • 建议:按“业务查询维度”设计粒度,缓存对象采用聚合数据。
    • 过期时间合适

监控与运维

  • 核心指标:需要实时监控Redis的缓存命中率(目标>=95%),内存使用率、key过期数量、数据库访问量等。当指标异常时(如命中率骤降、内存超阈值) 及时告警。
    • 工具推荐:Prometheus+Grafana、Redis Insight。
  • 持久化配置:若缓存数据需要重启后恢复(如热点商品缓存),需要开启AOF和RDB持久化‘
    • 优先使用AOF+RDB混合持久化。AOF保证数据不丢失(每秒刷盘),RDB用于数据快速恢复。
    • 若缓存数据可重建(如数据库重新加载),可关闭持久化,减少IO操作。

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

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

相关文章

【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN

背景意义 随着城市化进程的加快&#xff0c;高速公路建设与维护工作日益频繁&#xff0c;施工区域的安全管理成为亟待解决的重要问题。在高速公路施工区域&#xff0c;工人和设备的安全是首要考虑因素&#xff0c;而有效的物体检测系统能够显著提高施工现场的安全性与工作效率。…

如何在FastAPI中玩转全链路追踪,让分布式系统故障无处遁形?

url: /posts/30e1d2fbf1ad8123eaf0e1e0dbe7c675/ title: 全链路追踪如何让FastAPI微服务架构的每个请求都无所遁形? date: 2025-08-28T23:40:47+08:00 lastmod: 2025-08-28T23:40:47+08:00 author: cmdragon summary: 全链路追踪是现代微服务架构中监控系统行为的核心技术,通…

Win11 压缩实测:Win11 的压缩软件的最佳配置和使用方式

文章目录测试环境机器配置被压缩文件WinRAR7zipLinux子系统准备极限压缩减小字典的极限压缩7zipWin11准备极限压缩7zip系统内置右键压缩菜单极限压缩总结&#xff1a;Win11 的压缩软件的最佳配置和使用方式测试环境 机器配置 Win11系统 16GB内存 8核CPU 被压缩文件 文件夹内…

CMake构建学习笔记22-libxml2库的构建

在上一篇文章《CMake构建学习笔记21-通用的CMake构建脚本》中&#xff0c;笔者封装了一个通用的cmake构建脚本cmake-build.ps1&#xff0c;那么这里笔者就尝试通过这个脚本来构建libxml2库。 libxml2是GNOME项目下的XML库&#xff0c;虽然比不上TinyXML-2轻量&#xff0c;但是…

虚拟私有网络笔记

VPN应用场景 ——VPN概述  利用公共网络来构建的私人专用网络称为虚拟私有网络&#xff08;VPN&#xff0c; Virtual Private Network&#xff09;&#xff0c;用于构建VPN的公共网络包括Internet 、帧中继、ATM等。在公共网络上组建的VPN象企业现有的私有网络 一样提供安全性…

Python 轻量级 HTML 解析器 - lxml入门教程

文章目录初始化解析器路径查找查找所有标签查找指定 id 的标签查找指定 class 的标签查找包含指定 class 的标签复杂路径查找示例1示例2常见操作获取所有标签的链接获取 div 标签的文本内容, 其他标签类似其他元素操作初始化解析器 from lxml import html from lxml.html impor…

(CVPR-2025)VideoMage:文本生成视频扩散模型的多主体与动作定制化

VideoMage&#xff1a;文本生成视频扩散模型的多主体与动作定制化 paper title&#xff1a;VideoMage: Multi-Subject and Motion Customization of Text-to-Video Diffusion Models paper是National Taiwan University发表在CVPR 2025的工作 Code:链接 图1. 多主体与动作定制化…

OpenCV轮廓近似与Python命令行参数解析

在计算机视觉任务中&#xff0c;轮廓分析是目标检测、形状识别的核心步骤。而approxPolyDP函数作为轮廓简化的关键工具&#xff0c;能有效减少轮廓顶点数量&#xff0c;降低计算复杂度&#xff1b;同时&#xff0c;argparse库则能让Python脚本更灵活、易用。本文将结合具体案例…

基于Springboot在线音乐推荐平台

目录 一、项目介绍 二、功能介绍 三、核心代码 四、效果图 源码获取 前言 在经济繁荣的浪潮过去后&#xff0c;社会的焦点逐渐从物质追求转向了文化和生活品质的提升[1]。文化生活的繁荣成为人们关注的焦点之一&#xff0c;而音乐&#xff0c;作为文化的一部分&#xff0…

LeetCode算法日记 - Day 26: 归并排序、交易逆序对的总数

目录 1. 归并排序 1.1 题目解析 1.2 解法 1.3 代码实现 2. 交易逆序对的总数 2.1 题目解析 2.2 解法 2.3 代码实现 1. 归并排序 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任…

C++(Qt)软件调试---vcpkg安装crashpad(34)

C(Qt)软件调试—vcpkg安装crashpad&#xff08;34&#xff09; 文章目录C(Qt)软件调试---vcpkg安装crashpad&#xff08;34&#xff09;[toc]1 概述&#x1f41c;2 环境配置3 qt使用crashpad库捕获异常4 cmake中添加crashpad5 相关地址&#x1f410;更多精彩内容&#x1f449;内…

Kafka 副本同步异常与 ISR 收缩故障排查实录

背景 某高流量 Kafka 集群&#xff08;原 10G 网卡&#xff09;在切中心时频繁触发带宽报警&#xff0c;扩容至 25G 网卡后出现副本同步异常&#xff1a; 操作流程&#xff1a;停机→升级网卡→重启→触发分区同步→切换首选 Leader现象&#xff1a; 写入流量上升后&#xff0c…

顶点 (VS)vs 片段(FS):OpenGL纹理滚动着色器的性能博弈与设计哲学

一个微妙的选择&#xff0c;影响整个应用性能表现在实时图形渲染中&#xff0c;实现纹理滚动效果是一种常见需求。但当我们在顶点着色器和片段着色器之间做出不同实现选择时&#xff0c;会对性能产生显著影响。今天&#xff0c;我们将深入探讨这两种实现的差异&#xff0c;帮助…

基于博客系统的自动化测试项目

目录 一、引言 二、项目背景 三、项目功能 1&#xff09;初始登录界面 2&#xff09;博客首页 3&#xff09;博客详情页 4&#xff09;博客编辑页 四、测试工具 1&#xff09;基础操作系统环境 2&#xff09;浏览器环境 3&#xff09;开发与测试工具环境 4&#xf…

R 语言 eulerr 包绘制韦恩图:比例精准

在数据可视化中,韦恩图是展示多组数据交集关系的常用工具,尤其在生物信息(如基因差异表达分析)、统计分析等领域高频使用。但传统绘图工具常面临椭圆比例失衡、数值显示混乱、样式调整繁琐等问题,而 R 语言的eulerr包恰好能解决这些痛点 —— 它支持按数据比例自动适配图形…

CRYPT32!CryptMsgUpdate函数分析和asn.1 editor nt5inf.cat 的总览信息

0000: 30 83 09 69 2f ; SEQUENCE (9692f Bytes) 0005: 06 09 ; OBJECT_IDENTIFIER (9 Bytes) 0007: | 2a 86 48 86 f7 0d 01 07 02| ; "PKCS 7 已签名 (1.2.840.113549.1.7.2)" 0010: …

04数据库约束实战:从入门到精通

感谢黑马程序员提供的免费课程约束概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。目的&#xff1a;保证数据库中数据的正确、有效性和完整性。常见的几种约束&#xff1a;注意&#xff1a;约束是作用于表中字段上的&#xff0c;可以在创…

WPF+IOC学习记录

最近在学WPF&#xff0c;上一篇文章记录了WPF的MVVM自己实现和用框架的区别&#xff08;WPFMVVM入门学习&#xff09;&#xff0c;接下这篇文章记录一下在WPF中使用IOC&#xff0c;这里演示用的是微软官方的DependencyInjection&#xff0c;也可以用其他的第三方框架。 项目源…

从零开始学习单片机16

STM32单片机STM32和51单片机的区别51单片机的外设资源少&#xff0c;寄存器少&#xff0c;运行速度慢&#xff0c;价格便宜&#xff0c;容易上手STM32单片机的外设资源更多&#xff0c;寄存器多&#xff0c;运行速度相对快&#xff0c;价格相对贵&#xff0c;上手相对较难STM32…

[特殊字符]论一个 bug 如何经过千难万险占领线上

谨以此文献给每一个曾与 Bug 搏斗、最终却目睹它成功上线的你 本文旨在揭露 Bug 的狡猾&#xff0c;绝非鼓励以下行为。若你照做&#xff0c;后果自负&#x1f436;每一个在线上逍遥法外的 Bug&#xff0c;都不是偶然。它是一场精心策划的奇迹&#xff0c;是开发、联调、测试、…