灵魂拷问:缓存为何被击穿! 何为击穿?

为何被击穿!

生活案例:相信"富有"的各位有过双十一和618抢商品的经历吧? 就酸没学过程序都咳哟粗略的估计一下,上百万人和自己抢东西是有多刺激.试想如果没有缓存机制。

上百万乃至上千万的同一时间请求查询,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。

总而言之,言而总之 就是 略过缓存 ! 简单来说各位程序流程都是自己写的,如果我们的缓存中没有了数据,我们的数据去哪里取?是的,数据库.准确来说,"我们"(热点秒杀商品上百万个同时请求在国内都很正常)直接进入请求了我们的数据库,那为什么会略过我的缓存呢?首先我们都明白一个redis的特性,key会过期。

何为击穿?

简明看一下key会具体出现的问题:

1、Key过期;

2、Key被页面置换淘汰。

对于第一个原因是因为在Redis中,Key有过期时间,如果某一个时刻(假如商城做活动,零点开始)key失效,那么零点之后对某一个商品查询请求将全都压到数据库上,导致数据库崩。

对于第二个原因,因为内存是有限的,要时时刻刻缓存新的数据,淘汰旧的数据,所以在一定的页面置换策略(常见页面置换算法)中,淘汰数据,如果某些商品做活动之前无人问津,势必会被淘汰。

上代码,以下是针对热点信息的方法块

@RequestMapping("getDetail")
public String getDetail(Modelmodel, Integerid) {//互斥锁防止击穿Goods goods = getGoodsByLock(id);model.addAttribute("goods", goods);return "sub/detail";
}private Goods getGoodsByLock(Integerid) {//1.先判断自己是否能获取到缓存的商品信息Goods goods = (Goods) redisTemplate.opsForValue().get("goods" + id);/***如果缓存中是空的, 不存在该对象的信息, 就去数据库中获取*/if (goods == null) {//2.创建一个互斥锁,如果数据库中不存在互斥锁,添加一个唯一锁,注意:唯一锁也可以加上UUID,(MyConsts.GOODS_LOCK是自己写的静态变量)Booleanflag = redisTemplate.opsForValue().setIfAbsent(MyConsts.GOODS_LOCK, 1);//如果数据库没有锁,并且可以添加进去锁,证明可以进入数据库,便去mysql数据库中查询出当前对象存入缓存if (flag == true) {goods = goodsService.getGoods(id);//将查询出的对象存入缓存,设置时长为20s如果20s内没人继续获取这个对象,防止缓存空间剧增,自动执行释放redisTemplate.opsForValue().set("goods" + id, goods, 20,
TimeUnit.SECONDS);//锁用完后释放掉redisTemplate.delete(MyConsts.GOODS_LOCK);} else {//如果数据库中已经有锁,说明有人正在从数据库查询信息,考虑互斥性,主动为虚拟机(程序)制造2ms的间隔,等待已有锁消失try {Thread.sleep(2000);//再次递归此方法,上锁后可执行添加和获取getGoodsByLock(id);} catch (InterruptedExceptione) {e.printStackTrace();}}}return goods;
}

redis 缓存防止击穿相关推荐

  1. 如何应对redis缓存的击穿、穿透和雪崩

    一.缓存击穿问题 对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常"热点"的数据.这个时候,需要考虑一个问题:缓存被"击穿&q ...

  2. Redis缓存穿透击穿和雪崩(八)

    1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...

  3. Redis缓存/穿透/击穿/雪崩

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

  4. Redis缓存穿透击穿雪崩

    目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...

  5. 一文搞懂Redis缓存穿透/击穿/雪崩

    缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...

  6. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

    欢迎关注方志朋的博客,回复"666"获面试宝典 原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上 ...

  7. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

  8. Redis缓存穿透、缓存击穿和缓存雪崩

    目录 一.缓存穿透 概念 解决方案 布隆过滤器 缓存空对象 二.缓存击穿 概念 解决方案 使用互斥锁(mutex key) 设置热点数据永不过期 三.缓存雪崩 概念 解决方案 redis高可用 限流降 ...

  9. Redis缓存穿透 缓存击穿 缓存雪崩原因及其解决方案

    解决缓存穿透 方法一:布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力. 方法二:如果一个查询返回 ...

最新文章

  1. android studio没有org.apache.http.client.HttpClient;等包问题 解决方案
  2. 在函数调用中,星号运算符是什么意思? [重复]
  3. 去除(还原)git diff 时出现的 ^M
  4. 快速入门SSM整合配置建立第一个SSM项目模板
  5. NVIDIA GPU 架构梳理
  6. 限制使用su命令的用户与使用sudo机制提升权限
  7. SAP S4 Finance6个支持企业实时财务管理的主要创新领域
  8. 大学生创新项目——机房监控系统设计概述
  9. linux oracle client 安装,Instant Client 下载 适用于 Linux x86-64(64 位)
  10. Newton形式的Hermite插值多项式
  11. 向量积计算三角形面积
  12. Flowable源码注释(三十二)任务超时作业
  13. windows开启网络共享
  14. 将vscode打造成无敌的IDE(1)初步探索vscode,解放生产力
  15. 2011年的暑假(大一的暑假——还算充实)
  16. 【思维导图怎么画】万彩脑图大师教程 | 添加备注
  17. 微信公众号给微信用户推送信息 模板信息
  18. 如何高效管理Linkedin账号
  19. D435i+vins-Fusion+ego-planner+yolo无人机避障实测
  20. 相机标定(基础)20221204

热门文章

  1. 编程达人海哥c语言,编程达人 我在写海哥初级班39课作业的时候遇到了问题,希望有兄弟帮忙解答一下...
  2. windows驱动开发教程 滴水_滴水编程达人全套
  3. vivo APEX 2019 概念机亮相:全屏幕指纹 + 无开孔,支持 5G
  4. PrimeNG p-tree 手动添加勾选
  5. Manifest is not valid JSON. Line: 1, column: 1 项目打包报错解决方法
  6. 天下难事必作于易,天下大事必作于细
  7. 天下大事,必做于细!
  8. 小啊呜产品读书笔记001:《邱岳的产品手记-05》第9讲 产品案例分析:Hopper的“人工智能” 第10讲 产品被抄袭了怎么办?
  9. LuceneElasticSeach
  10. py-02-DATABASE