一般用redis做数据缓存,查询缓存时先查询缓存,没有再查下数据,然后更新缓存。

这里会存在一个问题:并发情况10000个用户查询缓存,缓存失效,那么10000个用户都怼到数据库了,会造成很大压力,也就是缓存击穿,不是穿透。

击穿与穿透区别:

穿透:缓存无(压根没有),数据库无

击穿:缓存无(缓存失效),数据库有

相同点:大量请求怼到数据库

按理说:10000请求,都判断无缓存,那么如果只有一个线程能继续执行,(加锁)继续取读到数据库数据,然后更新缓存,这时其他线程等待。之后,其他线程就可以读取缓存了。

好处:1.防止大量请求到数据库 2.避免重复更新缓存

代码如下:

@Slf4j
@Component
public class CacheTemplateService {@Autowiredprivate RedisManager redisManager;public <T> T fetchCache(String key, Integer expire, TypeReference<T> clazz, CacheLoadable<T> cacheLoadable) {String json = (String) redisManager.get(key);if (Objects.nonNull(json) && StringUtils.isNotBlank(json) && !json.equalsIgnoreCase("null")&& !"[]".equals(json) && !"{}".equals(json)) {return JSON.parseObject(json, clazz);}synchronized (this) {json = (String) redisManager.get(key);if (Objects.nonNull(json) && StringUtils.isNotBlank(json) && !json.equalsIgnoreCase("null")&& !"[]".equals(json) && !"{}".equals(json)) {return JSON.parseObject(json, clazz);}// 核心业务T result = cacheLoadable.load();redisManager.put(key, expire, JSON.toJSONString(result));return result;}}public void invalidate(String key) {redisManager.remove(key);}}
List<ResLiveVO> resLiveVOS = cacheTemplateService.fetchCache(RedisEnum.ADVANCE_LIVE_KEY.key, RedisEnum.ADVANCE_LIVE_KEY.expired,new TypeReference<List<ResLiveVO>>() {}, new CacheLoadable<List<ResLiveVO>>() {@Overridepublic List<ResLiveVO> load() {return selectAdvanceLive(uid);}});

参考:

https://blog.csdn.net/hjl021/article/details/79168783

缓存穿透、缓存并发、缓存失效之思路变迁 | 并发编程网 – ifeve.com

读redis->双重检测同步锁->防止Redis缓存击穿相关推荐

  1. Redis 缓存问题(Redis 与 DB 更新一致性问题、缓存击穿、缓存穿透、缓存雪崩)

    Redis 与 DB 更新一致性问题 缓存更新策略 1. 内存淘汰 说明:不用自己维护,利用 Redis 的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存 一致性:差 维护成本:无 2 ...

  2. java redis的同步_java同步系列之redis分布式锁进化史

    标题: 死磕 java同步系列之redis分布式锁进化史 - 彤哥读源码 - 博客园 转帖原地址: https://www.cnblogs.com/tong-yuan/p/11621361.html ...

  3. Redis核心数据结构List应用场景-商品列表、缓存击穿、PV阅读量、抢红包、推送帖子、普通分布式锁、Redis可重入锁与红锁

    List应用场景 Redis之List 一. Redis list命令实战 二.商品列表 高并发的淘宝聚划算实现技术方案 SpringBoot+Redis实现商品列表功能 二.缓存击穿 什么是缓存击穿 ...

  4. Redis 作者 Antirez 讲如何实现分布式锁?Redis 实现分布式锁天然的缺陷分析Redis分布式锁的正确使用姿势!...

    Redis分布式锁基本原理 采用 redis 实现分布式锁,主要是利用其单线程命令执行的特性,一般是 setnx, 只会有一个线程会执行成功,也就是只有一个线程能成功获取锁:看着很完美. 然而-- 看 ...

  5. Spring Cloud Alibaba微服务项目中集成Redis实现分布式事务锁实践

    引言 我们知道同一个进程里面为了解决资源共享而不出现高并发的问题可以通过高并发编程解决,通过给变量添加volatile关键字实现线程间变量可见:通过synchronized关键字修饰代码块.对象或者方 ...

  6. 分布式锁 基于Redis

    分布式锁的实现(基于Redis) 参考:http://www.jb51.net/article/75439.htm http://www.linuxidc.com/Linux/2015-01/1118 ...

  7. Redis缓存击穿、雪崩、穿透!(超详细)

    缓存的击穿.穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题. 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的. 而且,网络上仍然充斥着,大量不太靠谱的解决方案, ...

  8. Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

    一.前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是 ...

  9. 懒汉式单例中使用双重检测详解

    一.前言 本文的目的是探讨懒汉式单例为什么一定要使用双层if (instance == null)来保证多线程情况下安全运行,文章第二部分是双层检测的合理性,第三部分是双层检测的局限性,相互对应,从浅 ...

  10. Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

    前言 在日常的项目中,缓存的使用场景是比较多的.缓存是分布式系统中的重要组件,主要解决在高并发.大数据场景下,热点数据访问的性能问题,提高性能的数据快速访问.本文以Redis作为缓存时,针对常见的缓存 ...

最新文章

  1. autoware使用相机和深度学习进行目标检测(六)
  2. MySql 5.7.19 源代码安装 for ubuntu 16.04
  3. 单链表进阶学习 三段
  4. 【Go】优雅的读取http请求或响应的数据-续
  5. Kotlin的一点学习资源
  6. X9C102PIZ数字电位器-中文
  7. jmeter调用Python脚本(java调用Python程序)阶段一(可实现版)
  8. [Linux command]批处理注释
  9. Spring Boot应用在kubernetes的sidecar设计与实战,mysql分表分库技术实现
  10. 修改登录密码html代码,html登录界面设置账号密码
  11. 【清华大学】操作系统 陈渝——Part11 死锁
  12. 如何启用台式计算机无线开关,联想一体机无线网卡开关如何开启_怎么打开联想电脑一体机WiFi无线开关-win7之家...
  13. 携程AI和推荐系统的云化实践
  14. 医学自然语言处理(NLP)相关论文汇总之 NAACL 2021
  15. c++代码使用堆空间实现数据结构栈
  16. 低功耗蓝牙BLE之修改广播间隔等参数
  17. LINUX 一键装机 PXE system-config-kickstart 资源 实现简单操作镜像装机
  18. Linux基础之 getopts
  19. arduino 定时器、定时中断与PWM使用以及注意事项
  20. 【MySQL从入门到精通】【高级篇】(二十六)建了索引就能用么?我看未必。来看看几种索引失效的情况吧

热门文章

  1. 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
  2. 全面剖析Linux库文件路径的添加
  3. php 数组排序以及按照某个字段排序
  4. linux内核之系统调用
  5. 数控技术计算机学什么,长沙数控技术专业学什么,有前途吗?
  6. vuejs2.0从入门到放弃--入门实例(四)
  7. 买菜201809-2
  8. 中国农田生产潜力数据集
  9. 1.5.2 Prime Palindromes 回文质数(构造回文)
  10. awk字符串匹配与传参