月光代碼園

記錄、分享、交流

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Redis学习笔记#9:缓存穿透、缓存击穿、缓存雪崩解决方案

缓存穿透

表示恶意用户模拟请求很多缓存中不存在的数据,由于缓存中都没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。

 

解决方案:

1.缓存空值,之所以发生穿透,是因为缓存中没有存储这些数据的key,从而每次都查询数据库 我们可以为这些key在缓存中设置对应的值为null,后面查询这个key的时候就不用查询数据库了 当然为了健壮性,我们要对这些key设置过期时间,以防止真的有数据

2.使用布隆过滤,将所有可能存在的数据缓存放到布隆过滤器中,当访问不存在的缓存时迅速返回避免缓存及DB挂掉。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String getByKey(String key) {
 // 通过key获取value
 String value = redisService.get(key);
 if (StringUtil.isEmpty(value)) {
 if (bloomFilter.mightContain(key)) {
 value = userService.getById(key);
 redisService.set(key, value);
 return value;
 } else {
 return null;
 }
 }
 return value;
}

 

缓存击穿

在高并发的情况下,大量的请求同时查询同一个key时,此时这个key正好失效了,就会导致同一时间,这些请求都会去查询数据库,这样的现象我们称为缓存击穿

解决方案:

采用分布式锁,只有拿到锁的第一个线程去请求数据库,然后插入缓存,当然每次拿到锁的时候都要去查询一下缓存有没有

 

缓存雪崩

缓存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

事前
①在设置key的过期时间时,在过期时间上加上一个随机值,防止大量key同时过期。
②搭建高可用的缓存架构,比如使用 哨兵+主从 结构或者使用 cluster模式,避免缓存系统出现故障。
③可以在系统中使用ehcache做个小缓存,防止redis崩掉之后,还有一部分缓存。
事中
①对系统请求进行降级和限流,防止数据库之间崩掉。
事后
赶快使用redis持久化的数据,快速恢复缓存数据
 
1.采用集群,降低服务宕机的概率
2.ehcache本地缓存 + Hystrix限流&降级
ehcache 本地缓存的目的也是考虑在 Redis Cluster 完全不可用的时候,ehcache 本地缓存还能够支撑一阵
使用 Hystrix进行限流 & 降级 ,比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑



 

posted on   bangdikka  阅读(266)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示