Redis----缓存设计、旁路缓存优化

别再只会用MySQL了!用PHPStudy+Redis给你的本地开发环境加个‘内存缓存’Buff 本文详细介绍了如何在PHPStudy集成环境中部署Redis,为MySQL数据库添加高性能内存缓存层。通过Redis的安装配置、缓存策略选择及实战案例演示,帮助开发者显著提升本地开发环境的查询性能,实现毫秒级响应。文章还涵盖了高级技巧如缓存雪崩预防和连接池优化,是Redis入门教程的实用指南。 阅读详情

一.缓存三大问题

1.缓存雪崩

大量缓存数据在同一时间过期,那么此时用户的大量请求就会直接访问数据库,数据库的并发能力有限,可能会宕机导致连锁反应,造成整个系统的崩溃.

1.1解决方案

避免数据同时过期:给key的TTL添加较小的随机值

设置缓存不过期: 后台更新缓存数据

2.缓存击穿

某个高并发且缓存重建业务比较复杂的key突然失效,大量请求冲击数据库且多个线程尝试重建缓存

2.1解决方案

互斥锁:基于sexnx命令的互斥锁,在尝试缓存重建前先获取互斥锁,获取到了再进行缓存重建的工作,保证只有一个线程进行缓存重建的操作,避免浪费系统资源

逻辑过期+缓存预热:提前将热点数据添加到Redis中,不设置真正的过期时间,利用额外字段保存逻辑过期时间,查到数据时判断是否过期.若过期则先返回旧数据,并开启一个子线程获取互斥锁进行异步重建

3.缓存穿透

用户要访问的数据本身在数据库中就不存在,那么缓存中必然也不会存在.这样的请求,首先会访问缓存,缓存中不存在对应的数据必然会访问数据库,而数据库中也没有数据,无法进行缓存重建,那么后续的请求都会重复该流程,请求最终都会到达数据库,无法承受过高的并发导致宕机。缓存穿透一般是数据误删或恶意攻击导致

3.1解决方案

参数校验:提前对参数格式做特殊要求,当请求到来时先进行参数校验,不合法的参数直接拒绝访问

缓存空值:对于缓存中没有,数据库也查不到的数据向Redis中缓存一个空值,避免后续相同的请求再次访问到数据库;缺点:无法处理大量不同非法请求的情况

布隆过滤器:保存数据时,利用哈希函数计算key多个位置,将相应的位置都设置为1,查询元素时同样利用哈希元素进行计算,如果计算出的位置都是1,则认为该元素肯能存在,继续执行后续操作,否则认为元素一定不存在拒绝访问;可能存在元素误删问题

二.缓存更新策略

Cache Aside(旁路缓存) 适合读多写少的场景

写策略:先更新数据库中的数据,再删除缓存中的

直接删除缓存的方式,若每次修改数据都更新缓存则可能会产生很多无效更新,有数据修改时直接删除缓存,有新的读需求时从数据库中查最新的数据重建缓存即可,避免无效更新;若先删除缓存再更新数据库,数据库更新还未完成,此时其他线程查询到旧数据并重建缓存,此时就导致了数据长期不一致.

先更新数据库再删除缓存,更新数据库过程中,其他线程读取到了缓存未来的及删除的旧数据,但当数据库更新完毕后会删除缓存,后续请求会读到最新的数据并重建和缓存,只会导致中途短暂数据不一致,最终数据是一致的.

先更新数据库再删除缓存可能出现的极小概率极端情况:线程A进行数据更新的流程,线程A首先将进行数据库数据更新的操作,与此同时线程B查询缓存(此时缓存还没有被线程A删除),但由于某中原因缓存提前失效,线程B查询到了数据库未来得及更新的旧数据并进行重建缓存的操作,但恰好在此期间线程A更新数据库完毕并删除了缓存,线程B在线程A删除了缓存后才进行缓存重建的操作,此时多种小概率事件叠加在一起导致了数据的长期不一致,此种情况发生概率较低.可以为缓存添加有效时间,一段时间后缓存失效,自动纠错.

存在的隐患: 更新数据库与删除缓存是两个操作,若删除缓存失败,缓存中还是旧值与数据库中的数据短期不一致,等自动过期后才会最终一致.

读策略: 如果读取的数据命中了缓存,则直接返回数据 ; 如果读取的数据没有命中缓存,则从数据库中读取数据,然后将数据写入到缓存,并且返回给用户。

若写操作较多旁路缓存方案会影响缓存命中率

若对缓存命中率要求较高,可采用【更新数据库+更新缓存】的方案,同时在此基础上增加别的手段避免并发问题:

分布式锁: 在更新缓存前加互斥锁,保证统一时间只有一个请求更新缓存,解决了并发问题;缺点:影响更新缓存的性能

较短过期时间: 给缓存加上较短过期时间,即便并发问题导致数据不一致,很快也会自动纠错,性能较好;缺点: 还是会出现短期数据不一致

旁路缓存优化,解决缓存删除失败的问题

旁路缓存优化 保证缓存删除成功

消息队列: 将删除缓存要操作的数据添加到消息队列中,由消费者操作数据;若删除缓存成功则移除数据,若删除缓存失败,则利用MQ提供的重试机制进行重试.缺点:入侵原业务,需要改造原有业务代码

订阅binlog+消息队列: 数据库更新成功后会生成相应的日志记录在binlog中,利用Canal订阅binlog,再将Canal订阅到的数据发送到MQ中,利用MQ将消息发送到消费者尝试删除即可. 不入侵原有业务代码,缺点: 引入的额外组件较多

延迟双删?

不实用,无法落地,无法确定第二次删除时机。

短链接系统全解析:从核心原理到高并发实践 短链接系统是现代互联网中一项基础且关键的服务,其核心原理是基于键值对的映射与重定向。当用户访问一个短链接时,服务端通过短码查询到对应的原始长URL,并利用HTTP 302状态码引导浏览器完成跳转。这项技术的核心价值在于高效管理链接、实现精准的数据追踪与分析,并能在营销推广、跨平台分享等场景中发挥重要作用。一个健壮的短链接服务必须应对高并发挑战,其设计通常涉及短码生成算法、高性能存储与缓存策略。例如,通过**发号器模式**生成唯一短码,并结合**Redis缓存**来保障毫秒级的查询响应,以支撑海量的跳转请求。 阅读详情

相关推荐

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 267

Redis:代码实战之旁路缓存

但是当一个系统引入缓存时,需要面临最大的问题就是,如何保证缓存和后端数据库的一致性问题,最常见的3个解决方案分别是Cache Aside、Read/Write Throught和Write Back缓存更新策略,也就是下面所描述的两张缓存类型。缺点:高并发下的同步直写可能会发生缓存和数据库不一致的情形,由于写入数据库后写入缓存操作存在竞态条件(更新覆盖,由于请求数据库可能先请求后返回),需要配合分布式锁。所有写请求现在缓存处理,等增改的数据被从缓存中淘汰时,将需要淘汰的数据写入后端数据库。

张豫湘的博客 1092

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1285

缓存的设计

一个读请求和一个写请求的并发,当写请求进来,把缓存删了,更新数据库这步操作还没完成,读请求进来,发现没缓存,往数据库中读取,这个时候数据库的数据还是老的数据,读请求把老的数据写入了缓存,然后写请求才把数据更新到数据库,这就造成了数据库和缓存的双写一致性问题。比方一个读操作,一个写操作的并发,读操作没有了删除缓存的操作,直接命中拿的是缓存中的数据,写操作更新了数据库中的数据,并删除了缓存,读操作读的就是老的数据。就是在更新晚数据库之后,sleep一段时间,再次进行删除缓存的操作,能极大的保证双写一致性。

yaoxie1534的博客 1515

Error relaunching VirtualBox VM process:5错误解决

前几天在重新使用VirtualBox的时候出现了一个挺恶心的错误,如图 百度了好久没有找到合适的解决方法。功夫不负有心人,在查阅了vb相关论坛时发现了大牛对此问题的诸多解决方案。下面我把此论坛的内容总结一下,希望对大家有帮助。 论坛链接:Diagnosing VirtualBox Hardening Issues 时间不足的小伙伴可以直接看 解决方法 造成这个错误的主要原因是,windows操作系统与oracle vb的不兼容。有两个方面,一是非官方windows系统中包含了一些没有签名的d

JaCenz的博客 3万+

rk3568 android 11.0 userdata 改为ext4格式

功能:解决设备在恢复出厂设置进行擦除数据的时候卡住问题。 1.修改userdata分区为ext4格式 diff --git a/device/rockchip/common/scripts/fstab_tools/fstab.in b/device/rockchip/common/scripts/fstab_tools/fstab.in index 583e75579d..036336835d 100755 --- a/device/rockchip/common/scripts/fstab_tools/

chgh1306的专栏 2576

Redis之旁路缓存

Redis之旁路缓存Redis作为缓存中间件早已深入人心,但我们有没有想过Redis为什么能作为缓存呢?Redis到底怎样使用缓存呢?本篇文章详细聊聊。Redis为什么能作为缓存聊Redis为什么能作为缓存前先需要清楚缓存的作用,我们在很多场景都有接触过缓存就如Redis本身的输入输出缓存、复制缓冲区、复制积压缓存区等等,又如操作系统本身的LLC,page cache缓存等等,这些缓存的主要作用是什么呢?是在一个多层次系统中平衡上下级系统的速度差异。这里以操作系统为例说明,操作系统的存储结构一般为CPU、内

zzf1233的博客 2688

多路输出电源的交叉调整率:从理论到无源优化实践

本文深入探讨了多路输出电源中的交叉调整率问题,分析了其物理根源及无源优化方法。通过漏感与耦合的理论分析,结合加权反馈、电感耦合等五种无源优化技术,帮助工程师有效解决交叉调整率挑战。文章还以TDK-Lambda CUT75系列为例,展示了优化技术的实际应用与效果。

weixin_26886855的博客 281

Redis第12讲——缓存的三种设计模式

缓存的使用在项目中是极其常见的,如果使用得当,缓存可谓时提升系统性能的最简单方法之一,反之则会出现一些莫名其妙的问题,在不同场景下,所使用的缓存策略也是有所变化的,下面我们就介绍一下三种常见的缓存设计模式——Cache Aside Pattern(重点)、Read/Write Through Pattern、Write Behind Caching Pattern。

让~学习~成为一种习惯(橡 皮 人の技术博客) 3090

广东省低应变题库

11.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,采用低应变法对混凝土预制桩进行检测时,地基基础设计等级为甲级的桩基工程抽检桩数不应少于总桩数的30%,其余桩基工程抽检桩数不应少于总桩数的20%,且不得少于10根;16.按《建筑地基基础检测规范》DBJ/T15-60-2019的规定,当对某桩的桩身完整性判定为III类时,可认为该桩不满足验收条件,不用进一步确定该桩桩身缺陷对桩身结构承载力的影响程度。2.地基基础检测所用计量器具均应在检定(校准、验证)的有效期内,性能符合相关技术要求。

ZShy001238的博客 320

【四足机器人项目实战】四足机器人嵌入式硬件设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、电源管理板设计及制作二、通讯中继板设计及制作三、力控无刷电机驱动板设计及制作1.磁场定向控制FOC控制原理2.电机转子位置、速度检测原理3.硬件CAN通讯原理 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–嵌入式硬件设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、电

qq_35635374的博客 1万+

23 Redis 的旁路缓存

23 Redis 的旁路缓存前言一、缓存的特征二、Redis 缓存处理请求的两种情况三、Redis 作为旁路缓存的使用操作四、缓存的类型总结 前言 Redis 提供了高性能的数据存取功能,广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发大压力的请求发送到数据库层。但如果 Redis 做缓存时出现了问题,比如缓存失效,大量请求就会直接积压到数据库层,必然会给数据库带来巨大的压力,很可能会导致数据库宕机或是故障,那么业务应用就没有办法存取数据、响应用户请求了。 正因为 Redis

海陆云的博客 2万+

Django框架中settings文件的部署建议

为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。然后,通过在启动应用程序时指定不同的settings文件,来加载相应的配置。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。在Django框架中,settings.py文件是非常重要的配置文件,它包含了项目的各种设置和选项。可以使用Python的。为了更好地管理开发和生产环境的配置,建议将settings文件分为多个文件,分别用于不同的环境。

WELL_CODER的博客 129

Redis缓存设计模式与失效策略

Redis在缓存设计方面提供了极大的灵活性和高性能。通过合理的缓存设计模式和失效策略,可以极大地提升应用程序的性能和用户体验。了解和实施这些策略对于构建高效、可靠的系统至关重要。最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软本文已收录于我的技术网站,有大厂完整面经,工作技术等经验分享。

升仔聊编程的博客 1154

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Python大模型API缓存策略】:揭秘高效缓存设计的5大核心模式

掌握Python大模型API缓存策略,提升系统性能与响应速度。涵盖本地内存、Redis缓存、请求去重、过期机制与分级缓存五大模式,适用于高并发、低延迟场景。有效降低API调用成本,提高数据复用率,值得收藏。

LearnFlow的博客 579

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Redis 旁路缓存深度解析

合理设计:根据业务特点选择合适的缓存策略一致性保障:根据一致性要求选择延迟双删或 Binlog 方案容错机制:做好缓存穿透、击穿、雪崩的防护监控告警:实时监控缓存命中率、内存使用等关键指标预热与降级:系统启动时预热缓存,异常时做好降级正确使用旁路缓存,能够将系统性能提升一个数量级,是后端开发必备的核心技能。

2301_79404691的博客 1357

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

电商后台架构:FastAPI+Redis缓存策略,高并发下的稳定性保障

电商后台系统高并发场景下,FastAPI与Redis组合是理想解决方案。FastAPI凭借异步非阻塞特性提供高性能API服务,Redis通过内存级读写和丰富数据结构实现高效缓存。本文详细介绍了商品信息、列表、库存等核心场景的缓存策略,包括旁路缓存、原子操作和分布式锁等关键技术。同时针对缓存穿透、击穿、雪崩三大问题提供防护方案,并给出生产环境部署建议。实际应用表明,该架构可使接口响应降至毫秒级,数据库压力降低90%以上,大幅提升系统稳定性和并发能力。该方案适用于各类电商平台,具有轻量、易扩展的特点。

2603_96171993的博客 24

告别缓存不一致!Redis三种经典读写策略深度解析

本文深入分析了三种常见的缓存读写策略:Cache Aside(旁路缓存)、Read/Write Through(读写穿透)和Write Behind(写回)。Cache Aside作为主流方案,通过先更新数据库再删除缓存实现简单可靠;Read/Write Through将缓存作为主数据源,统一管理数据访问;Write Behind则采用异步写入提升性能。文章详细对比了三者的优缺点和适用场景,并提供了Java代码示例。建议根据业务对性能、一致性和复杂度的需求进行选择:多数场景适用Cache Aside,高一致

baidu_25106585的博客 390

大型网站缓存实战:从浏览器到数据库的7层缓存优化技巧

本文深入探讨了大型网站性能优化的核心策略,详细拆解了从浏览器到数据库的七层缓存架构实战技巧。内容涵盖HTTP缓存、CDN、Nginx代理、进程内缓存、Redis集群及数据库读写策略,重点分析了多级缓存的设计、调优与避坑指南,旨在帮助中高级开发者构建高并发下弹性可观测的缓存体系,有效提升系统响应速度与稳定性。

cicd6pipeline的博客 431

Flink实时数仓项目—DWD层设计与实现

Flink实时数仓项目—DWD层设计与实现前言一、功能三:订单宽表1.需求描述2.需求分析3.思路分析与代码实现3.1 实体类的创建3.2 读取Kafka订单数据和订单明细数据3.3 双流Join—关联事实表3.4 关联维度表二、优化:关联维度表优化—旁路缓存1.旁路缓存选型2.Redis设计3.代码实现 前言 前面已经完成了两个功能,下面实现订单宽表的功能,比较复杂,所以单独列出来。 一、功能三:订单宽表 1.需求描述 订单在电商中属于比较重要的分析对象,关于订单也有许多的维度统计需求,比如用户、地区

yunweijie_cn的博客 929

Chatbot Arena官网性能优化实战:从架构设计到效率提升

本次对Chatbot Arena官网的性能优化实践,是一次从架构层面解决 scalability 问题的典型战役。通过引入Redis分布式缓存和Nginx负载均衡,我们不仅解决了眼前的性能瓶颈,更为系统应对未来更大的流量增长奠定了弹性基础。进一步的优化可能性:多级缓存:在应用服务器本地内存(如node-cache)增加一层极热数据的缓存,用于应对Redis访问的微小网络延迟,适合访问频率极高的全局配置或首页Banner数据。读写分离与分库分表:随着数据量持续增长,单一的MySQL主库可能再次成为瓶颈。

2600_94960153的博客 248

Redis:缓存、集群、优化与数据结构

本文系统总结了Redis核心知识点与应用优化策略。主要内容包括:缓存更新策略对比(内存淘汰/超时剔除/主动更新)及三种主动更新模式(旁路缓存/读写穿透/异步回写);缓存问题解决方案(穿透/雪崩/击穿);分布式锁实现与优化(唯一标识/原子释放/可重入/主从一致);消息队列三种实现方式对比(List/PubSub/Stream);持久化机制(RDB/AOF)与优化建议;集群架构(主从同步/哨兵/分片集群);多级缓存同步方式;键值设计规范与性能优化(批处理/慢查询/内存配置)。

qq_51942551的博客 453

网上订餐系统毕业设计:基于微服务与缓存优化的效率提升实战

面对上述问题,我选择了这个组合。2.1 Spring Boot:快速构建的基石对于学生项目来说,开发效率至关重要。Spring Boot的“约定大于配置”理念,让我们能快速搭建起一个结构清晰、功能完整的Web后端。它内嵌了Tomcat服务器,简化了部署;强大的Starter依赖(如)让我们能轻松集成Redis和消息队列,无需处理复杂的XML配置。作为毕业设计,用它来展示你对主流框架的掌握程度,再合适不过。2.2 Redis:扛住读压力的“内存加速器”

2600_94959960的博客 165

FastAPI从0到1做项目-随记

模块化路由就是把每个业务功能的接口拆分到独立文件里,再统一挂载到主应用种。编写独立路由模块里:把创建api实例,改成创建APIRouter实例,其余代码保持不变。

m0_54702492的博客 198

苍穹外卖day07(黑马程序员)

文章摘要 本文分析了外卖系统缓存优化方案和购物车功能实现。在菜品查询优化部分,针对高频读场景提出引入Redis缓存,通过先查缓存再查数据库的策略降低MySQL压力,提高响应速度。关键点包括缓存key设计(dish_分类id)、缓存命中逻辑及数据一致性处理。购物车功能则通过ThreadLocal获取用户ID,构建查询条件后从数据库获取购物车列表,实现分层架构(Controller-Service-Mapper)。整体方案兼顾性能优化与功能实现,通过缓存和分层设计提升系统响应能力。

2403_88860769的博客 387

系统架构设计师-以“云服务”主题为例的范文参考

本文以某大型企业“智慧供应链协同平台”项目为背景,该项目于2023年1月启动,历时10个月,总投资1200万元,旨在构建连接供应商、仓储、物流和销售终端的全链路协同系统。本人作为项目架构师,全面负责技术方案设计与架构落地。针对高并发、弹性伸缩、数据一致性等核心挑战,本文重点论述了云原生架构的服务拆分策略、容器化部署方案、弹性伸缩设计及数据一致性保障机制。项目实施后,系统峰值QPS达8000,部署效率提升60%,计算资源成本节约45%,圆满完成项目目标。

张三的博客 455
上一篇: 二叉树----14.二叉树的最近公共祖先
下一篇: 二叉树----15.二叉树中的最大路径和
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值