reids优化系列(五)

【Redis】缓存三件套:缓存雪崩+缓存穿透+缓存击穿 也就是说缓存穿透是因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透。:对于某些热点缓存,我们可以设置永不过期,这样就能保证缓存的稳定性,但需要注意在数据更改之后,要及时更新此热点缓存,不然就会造成查询结果的误差。,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严重情况下可能会导致数据库宕机的情况叫做缓存雪崩。:在缓存即将过期之前,提前异步加载缓存,避免在缓存失效时大量请求直接打到数据库或者后端服务。 阅读详情

        后面更新的这些文章是将所学的redis知识进行巩固并且分享,也希望这些知识不仅仅是用于复习面试,更能在实际的应用中起到优化的作用。

有时候我们会存储一些查询多,修改少,业务逻辑较弱的数据,并且还能高效查询,那么redis就是一种选择。

redis缓存三件套

        所谓的缓存三件套,说白了就是在高并发的场景下,因为一些奇奇怪怪的操作或者原因导致大量的请求没有去请求redis,而是去请求数据库了,而数据库的连接是有限的,一旦超过了就会出事。因此我们的最终目的就是减少或者尽量不去访问数据库。其实解决方法我觉得可以分为外在和内在,外分为如何控制请求量,内在于如何处理这些请求量。

内在操作

缓存穿透

        大量并发去访问一个数据库不存在的数据,由于缓存中没有该数据导致大量并发查询数据库,这个现象要缓存穿透。缓存穿透可以造成数据库瞬间压力过大,连接数等资源用完,最终数据库拒绝连接不可用。

解决

如何解决缓存穿透?

1、对请求增加校验机制

如果请求参数不符合我们规定的条件就直接让他滚蛋,返回,恶意攻击拜拜。

2、使用布隆过滤器

百度百科:

布隆过滤器可以用于检索一个元素是否在一个集合中。如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

布隆过滤器的特点是,高效地插入和查询,占用空间少;查询结果有不确定性,如果查询结果是存在则元素不一定存在,如果不存在则一定不存在;另外它只能添加元素不能删除元素,因为删除元素会增加误判率。

我们可以利用如果不存在则一定不存在的特性来运用过滤器去查询。

比如:将商品id写入布隆过滤器,如果分3次hash此时在布隆过滤器有3个点,当从布隆过滤器查询该商品id,通过hash找到了该商品id在过滤器中的点,此时返回1,如果找不到一定会返回0。

所以,为了避免缓存穿透我们需要缓存预热将要查询的内容提前存入布隆过滤器,添加数据时将信息的id也存入过滤器,当去查询一个数据时先在布隆过滤器中找一下如果没有到到就说明不存在,此时直接返回。

实现方法有:

Google工具包Guava实现。

redisson 。

2、缓存空值或特殊值

请求通过了第一步的校验,查询数据库得到的数据不存在,此时我们仍然去缓存数据,缓存一个空值或一个特殊值的数据。

但是要注意:如果缓存了空值或特殊值要设置一个短暂的过期时间。

缓存击穿

缓存击穿是指大量并发访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用。

解决

1、使用同步锁控制查询数据库的线程

使用同步锁控制查询数据库的线程,只允许有一个线程去查询数据库,查询得到数据后存入缓存。

锁的话就会想到sychronized,这锁很明显,重量级锁,效率太低。相比于sychronized,这种读多写少的情况更适合用ReentrantReadWriteLock,Semaphore,StampedLock读写锁。

同时我们应该尽量减少锁控制的代码块,可以使用双重校验,也可以用乐观锁来提高效率。

2、热点数据不过期

可以由后台程序提前将热点数据加入缓存,缓存过期时间不过期,由后台程序做好缓存同步。

缓存雪崩

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。

造成缓存雪崩问题的原因是是大量key拥有了相同的过期时间,如果高并发查询大量的课程信息,那么固定时间后就会过期一旦失效将同时失效,造成雪崩问题。

解决

我们要知道,缓存雪崩的原因出现在,请求量大,大量key过期时间相同。所以我们应该对症下药:

1、使用同步锁控制查询数据库的线程

主题的做法在击穿里已经说明

2、缓存预热

不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存。

3、对同一类型信息的key设置不同的过期时间

通常对一类信息的key设置的过期时间是相同的,这里可以在原有固定时间的基础上加上一个随机时间使它们的过期时间都不相同。

总结下来就是,尽量做到,控制请求量,防止数据不存在,热点数据过期时间设置,过期时间key随机。

外在操作

网关

网关不仅仅可以用来处理负载均衡,权限认证,跨域还可以限流。

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口。

public interface GlobalFilter {
    /**
     *  处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
     *
     * @param exchange 请求上下文,里面可以获取Request、Response等信息
     * @param chain 用来把请求委托给下一个过滤器 
     * @return {@code Mono<Void>} 返回标示当前过滤器业务结束
     */
    Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

在filter中编写自定义逻辑,可以实现下列功能:

登录状态判断,权限校验,请求限流等

sentinel

这也是一个微服务中间件,这里先不再详细介绍。

redis三件套(windows下) windows下redis需要的三件套 1. redis环境组件 2. redis命令行工具winform 3. 与java连接的jar包 立即下载

相关推荐

告别regsvr32!易语言调用大漠插件dm.dll的免注册实战(附Win7/10/11避坑指南)

本文详细介绍了易语言如何免注册调用大漠插件dm.dll的实战方法,通过`dmreg.dll`实现真正的免注册调用,规避了传统`regsvr32`注册方式带来的权限和兼容性问题。文章包含核心原理剖析、易语言实现细节、多系统兼容性方案及高级应用场景,帮助开发者实现绿色化部署,提升自动化脚本开发效率。

weixin_42553471的博客 296

缓存问题“三件套“------- 雪崩,击穿与穿透

缓存是后端开发中,经常用到的一种技术,缓存的存储介质读写效率都比较高,使用缓存可以加快我们对数据的读写,使用缓存主要用来加速我们的业务处理:把一些计算过程比较繁琐的结果数据或者读写效率比较低的存储介质上的数据,放到缓存中,这样当我们再次使用这些数据的时候,就可以直接从缓存中获取了,而不用再通过复杂的过程重复计算了,可以大大提供请求的处理速度。 凡事有利有弊,引入了缓存后,系统可以处理的qps也会大幅度增加,系统可以处理的流量,可以远远超出了系统本身能承受的流量,因为绝大部分的请求都被缓存处理了。但是引入缓

weixin_45701550的博客 1129

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3295

redis-缓存三剑客(缓存击穿,缓存穿透,缓存雪崩)

当请求未命中key时,先获取互斥锁(分布式锁),开启新线程进行查询和建立缓存数据,并重新写入逻辑过期时间,再释放锁,请求不需要等待新线程执行结束,直接返回未命中结果。,在每次请求前判断key是否存在,不存在则直接返回。:当请求未命中key时,先获取互斥锁(分布式锁),再通过查询建立缓存数据,写入缓存再释放锁。保证数据强一致,性能差,:在value中添加过期时间标识,通过该参数判断是否过期。1 大量key失效的场景:过期时间随机,分批设置过期时间。通过集群提高服务的可用性,例:哨兵模式,集群模式。

hzx790688184的博客 548

用PY32F003F18的PWM互补输出驱动无刷电机,保姆级配置流程(含代码)

本文详细介绍了如何利用PY32F003F18微控制器的TIM1定时器配置PWM互补输出功能来驱动三相无刷电机,涵盖硬件设计、代码实现及六步换相算法。通过保姆级配置流程和实用代码示例,帮助开发者快速掌握无刷电机驱动技术,适用于工业自动化和消费电子等领域。

weixin_26905487的博客 377

晶圆测试(Wafer Sort)的核心技术与良率提升策略

晶圆测试(Wafer Sort)是芯片制造中的关键“入学考试”,通过探针台与自动测试设备(ATE)对晶圆上的芯片进行功能与参数测试,筛选不合格芯片以控制成本。本文深入解析了其核心技术,包括自动化视觉系统对准、测试流程优化策略,并探讨如何利用测试数据驱动良率提升,展望了DFT与AI智能测试的未来趋势。

e4f5g6h的博客 514

Redis缓存三大问题实战:穿透、雪崩、击穿怎么解决

查询一个根本不存在的数据。缓存里没有,数据库里也没有。请求: GET /user/999999999 Redis: 没有这个key MySQL: SELECT * FROM users WHERE id = 999999999 → 空 返回: null 下次请求: 还是走MySQL恶意攻击者可以用大量不存在的ID疯狂请求,每个请求都打到数据库。大量缓存在同一时间失效,请求全部打到数据库。缓存设置了相同的过期时间Redis服务宕机某个热点key突然过期,大量并发请求同时打到数据库。

2401_89221867的博客 269

使用conda环境python3.13和python3.12下安装vllm过程记录

使用conda环境python3.13和python3.12下安装vllm过程记录

没刮胡子的程序员专栏 884

redis

XB处理方案 1、设置随机值 2、热点数据不设过期时间(在更新时刷新缓存) XT处理方案 1、对参数设置校验(不信任一切请求参数) JC处理方案 1、设置热点数据永不过期 2、加互斥锁

weixin_42608579的博客 259

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1242

AB测试面试题

AB实验流程以一个实际的业务场景去描述AB实验流程,限定场景来减少和面试官的信息差,确保沟通高效可以以自己简历上某个相关项目的场景来举例,或者以面试的岗位对应的业务来举例子。不能光自己说,要让面试官参与进来,引导面试官往自己熟悉的内容提问,从被动转为主动。回答要有逻辑性,简洁、准确的表达。还是延用之前提到的项目案例,假设之前抖音拍摄页面中右下角相册功能的icon 由相册图标改为 用户相册的最新一张照片这个案例写在了我的简历中。

qq_45727498的博客 857

Redis系列复习笔记--Reids集群

第五章 Redis系列复习笔记–持久化第七章 Redis系列复习笔记–Reids集群。

qq_38364419的博客 743

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 168

【25-Reids内存优化】

edis2.2版本及以后,存储集合数据的时候会采用内存压缩技术,以使用更少的内存存储更多的数据。如Hashes,Lists,Sets和Sorted Sets,当这些集合中的所有数都小于一个给定的元素,并且集合中元素数量小于某个值时,存储的数据会被以一种非常节省内存的方式进行编码,使用这种编码理论上至少会节省10倍以上内存(平均节省5倍以上内存)。

https://github.com/Wang-Jun-Chao 1364

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Reids系列-Redis持久化与备份 【5】

`Redis` 的持久化方式有 `RDB` 和 `AOF` 两种

寓教于乐。教己助人 165

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【 Reids内存回收】

Redis内存回收机制主要包括内存过期策略和内存淘汰策略。Redis通过哈希表存储键值对和过期时间,采用惰性删除和定期删除两种策略处理过期键。惰性删除在访问键时检查并删除过期键,避免立即删除导致的性能问题,但可能造成内存泄漏。定期删除通过定时任务抽样删除过期键,分为低频高时长和高频低时长两种模式,确保内存回收的同时不影响主线程性能。当内存达到阈值时,Redis会主动删除部分键以释放内存,确保服务的连续性和性能。这些策略共同保障了Redis在内存管理上的高效性和稳定性。

qq_46005538的博客 1202

廖雪峰Python教程[完整版]

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

Reids大key优化

现象: 1、单个简单的key存储的value很大 2、hash, set,zset,list 中存储过多的元素 3、一个集群存储了上亿的key 问题: 1,读写bigkey会导致超时严重,甚至阻塞服务 2,大key相关的删除或者自动过期时,会出现qps突降或者突升的情况,极端情况下,会造成主从复制异常,Redis服务阻塞无法响应请求 解决方式 1,拆分对象:将对象拆分成多个key-value,使用multiGet获取值,这样分拆意义在于分拆操作的压力,将操作压力平摊到多个redis实例,降低

lovewebeye的专栏 309

Reids(基础篇)

快速了解redis的各种存储结构和在Java中的使用方式

2302_77423520的博客 1033

Reids面试问题以及答案

Reids面试问题以及答案

XMYX-0 1719

reids

Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性能...

yzj5208的专栏 226

黑马点评Reids重点详解(Reids使用重点)

关于黑马点评重点内容的详细解读,有关eids+seesion、缓存击穿、缓存穿透、缓存雪崩、乐观锁,悲观锁、分布式锁、与HyperLogLog的使用,对我们来说非常的重要

2303_81146519的博客 1005

Reids总结

Redis 五种数据类型,每种数据类型都有相关的命令,几种类型分别如下: String(字符串) List(列表) Hash(字典) Set(集合) Sorted Set(有序集合) Redis 有五种常见的数据类型,每种数据类型都有各自的使用场景,通用的字符串类型使用最为广泛,普通的 Key/Value 都是这种类型;列表类型使用的场景经常有粉丝列表,关注列表的场景;字典类型即哈希表结构,这个类型的使用场景也很广泛,在各种系统里面都会用到,可以用来存放用户

SnowDujc的博客 327

Reids面试

给热点 key 设置了过期时间,当 key 恰好过期的瞬间,有大量并发请求同时查询该 key。正常流程:请求查 Redis → 命中则返回;未命中则查 DB → 写入 Redis 再返回。击穿场景:热点 key 过期瞬间,所有并发请求都查不到 Redis,直接同时打到 DB,瞬间压垮数据库。key 本身存在,只是缓存过期了,和缓存穿透(查询不存在的 key)有本质区别。缓存雪崩是指在同一时段大量的缓存 key 同时失效,或者 Redis 服务宕机。

qq_68799755的博客 346

Reids 源码导读

本文以 Reids 6.0 版本的 readme 为底本,结合 unstable 分支进行整理。从 Redis 是什么?怎么构建、如何运行、体验,及主要代码文件、数据结构等方面从高纬度视角介绍 Redis,以及如何阅读 Reids 源代码。

aneutron的博客 203

Reids缓存设计与性能优化

Redis缓存设计及性能优化、缓存穿透、缓存击穿、缓存雪崩、热点缓存key重建优化、缓存与数据库双写不一致

weixin_38277138的博客 135
上一篇: redis实现延迟任务(四)
下一篇: Kafka系列(一)
happystudy_neu
博客等级 码龄4年 1140粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值