【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)

发布时间:2018-11-22 16:48,

浏览次数:872

, 标签:

java

redis

<>缓存穿透

* 1、什么是缓存穿透:

从字面上理解,缓存穿透就是运行程序击穿了你的Redis缓存服务器,去访问MySQL数据库;

由于Redis存在一定的命中概率,进来的请求发现Redis中并没有相关数据或者是没有命中指定数据,会去数据库查询。

* 2、缓存穿透有什么危害:

如果大量请求进来,直接去访问数据库服务查询,数据库服务器CPU短时间内会超负载运行,致使数据库服务宕机。

解决思路:

* 1、简单:加synchronized关键字(同步锁);

* 2、推荐:使用Lock对象的tryLock()方法(定时锁); package com.cn.seesun2012.cache; import java

.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.

util.concurrent.locks.ReentrantLock; import com.cn.seesun2012.mapper.

ProductInfoMapper; import com.cn.seesun2012.util.JedisClient; /** * *

┏┓  ┏┓+ + *        ┏┛┻━━━┛┻┓ + + *        ┃       ┃ *        ┃   ━   ┃ ++ + + +

*        ████━████ ┃+ *        ┃       ┃ + *        ┃   ┻   ┃ *

┃       ┃ + + *        ┗━┓   ┏━┛ *          ┃   ┃ *          ┃   ┃ + + +

+ *          ┃   ┃ God beast body, code no BUG *          ┃   ┃ + 神兽护体,代码无BUG *

┃   ┃ *          ┃   ┃  + *          ┃    ┗━━━┓ + + *          ┃

┣┓ *          ┃        ┏┛ *          ┗┓┓┏━┳┓┏┛ + + + + *

┃┫┫ ┃┫┫ *           ┗┻┛ ┗┻┛+ + + + * * @title: 商品信息-模块 * @version

v1.0.0 * @author csdn:seesun2012 * @date 2018年11月22日 下午17:21:33 周四 * */ public

class ProductInfoCache { // Jedis 缓存对象 private JedisClient jedisClient; //

商品信息XML映射类 private ProductInfoMapper productInfoMapper; // 缓存业务KEY前缀 private

static final String PRODUCT_KEY = "项目名.模块名.业务名."; // 锁-实例 private Lock lock =

new ReentrantLock(); /** * 获取商品图片路径 * @param id */ public synchronized String

getProductImgUrlById(String id){ // 获取缓存 String product = jedisClient.get(

PRODUCT_KEY+ id); if (null == product) { // 如果没有获取锁等待3秒,SECONDS代表:秒 try { if (

lock.tryLock(3, TimeUnit.SECONDS)) { try { // 获取锁后再查一次,查到了直接返回结果 product =

jedisClient.get(PRODUCT_KEY + id); if (null == product) { // 查询数据库 product =

productInfoMapper.getProductInfoById(id); if (null == product) { //

假设有10000人的并发量,第一次查也没有数据, // 那么设定为"null",加入有效期6秒 jedisClient.setex((PRODUCT_KEY+

id), "null", 6); return product; } jedisClient.set((PRODUCT_KEY + id), product);

return product; } return product; } catch (Exception e) { product = jedisClient.

get(PRODUCT_KEY + id); } finally { // 释放锁(成功、失败都必须释放,如果是lock.tryLock()方法会一直阻塞在这)

lock.unlock(); } } else { product = jedisClient.get(PRODUCT_KEY + id); } }

catch (InterruptedException e) { product = jedisClient.get(PRODUCT_KEY + id); }

} return product; } }

tryLock(long time, TimeUnit

unit)方法和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false;如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。

Lock的使用法方法:

https://blog.csdn.net/zengmingen/article/details/53259394?utm_source=blogxgwz7

<>缓存雪崩

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

解决思路:

* 1、也是像解决缓存穿透一样加锁排队,实现同上;

* 2、建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存;

<>布隆过滤器

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

<>持续更新中…

如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:seesun2012

你的提问是小编创作灵感的来源!

java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...相关推荐

  1. java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!

    点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! ​ 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...

  2. Java增强之并发编程

    Java增强之并发编程 1 多线程 1.1 进程及线程 程序启动的时候,电脑会把这个程序加载到内存,在内存中需要给当前的程序分配一段的独立运行的空间,这个空间就专门负责这个程序的运行.每个应用程序运行 ...

  3. 《Java线程与并发编程实践》—— 2.6 小结

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.6节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

  4. Java多线程与并发编程终极宝典

    阅读本文需要了解的概念 原语 所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断.在操作系统中,某些被进程调用的操作,如队列操作.对信号量的操作.检查启动外设操作 ...

  5. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  6. Java JUC高并发编程(三)-CallableJUC辅助类

    目录 一.Callable接口 二.JUC辅助类 1.减少计数CountDownLatch 2.循环栅栏CyclicBarrier 3.信号灯Semaphore 一.Callable接口 Callab ...

  7. Java 多线程与并发编程专题

    Java 线程基础 Java 多线程开发 线程安全与同步 并发控制 非阻塞套接字(NIO) Java 5 中的并发 JDK 7 中的 Fork/Join 模式 相关书评 Java 平台提供了一套广泛而 ...

  8. Java JUC高并发编程(一)

    目录 一.概述 二.Lock接口 三.线程间的通信 解决虚假唤醒问题 Lock通信示例: 四.线程间定制化通信 一.概述 JUC就是java.util.concurrent工具包的简称,这是一个处理线 ...

  9. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题

    本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.3节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...

最新文章

  1. 深度学习奠基人特伦斯:美国学界已经找到了解释人工智能“黑盒子”的方法...
  2. 欢迎使用CSDN-markdown编辑器保存
  3. Oracle 表空间与数据文件
  4. activemq高可用
  5. python入门经典100例-【python】编程语言入门经典100例--37
  6. 基于微信小程序的电影院购票系统丨毕业设计源码
  7. 网易校招笔试第三题匈牙利算法
  8. 【Unity 3D】简易小车游戏
  9. linux下移植mplayer播放器
  10. 易路代理静态IP和动态IP解析以及存在的区别
  11. 保险机构如何保护客户信息安全?
  12. html静态页面作业——海贼王中乔巴漫画(5页) 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品
  13. 如何把app运行在手表和电视上
  14. 图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
  15. HCIP之MPLS中的LDP协议
  16. 使用javascript通过className来获取元素
  17. 大力出奇迹,GPU 加速 TiDB | TiDB Hackathon 2020 优秀项目分享
  18. android 微信缩小通话界面_Android仿微信多人音视频通话界面
  19. Visual Studio 2017报错‘GetVersionExW‘: 被声明为已否决
  20. Oracle 创建PDB的几种常用方法

热门文章

  1. UI使用素材模板|login登录界面
  2. Django视图层:视图函数、视图类
  3. Flink流处理练习
  4. Protobuf的优点
  5. ajax传递map参数给后端
  6. 服务器ip算是虚拟资产吗,云服务器算资产吗
  7. matlab 量化 策略,【策略分享】Matlab量化交易策略源码分享
  8. 从SQL中相对于日期的特定周获取数据
  9. 为制造业构建Teams Power App 3:创建制造商UI
  10. (六)使用Coral USB Accelerator在Raspberry Pi上部署YOLOv5模型