java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...
【并发编程】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缓存穿透、缓存雪崩(高性能示例代码)...相关推荐
- java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
点击蓝色"程序员书单"关注我哟 加个"星标",每天带你读好书! 在介绍本书单之前,我想先问一下各位读者,你们之前对于Java并发编程的了解有多少呢.经过了1 ...
- Java增强之并发编程
Java增强之并发编程 1 多线程 1.1 进程及线程 程序启动的时候,电脑会把这个程序加载到内存,在内存中需要给当前的程序分配一段的独立运行的空间,这个空间就专门负责这个程序的运行.每个应用程序运行 ...
- 《Java线程与并发编程实践》—— 2.6 小结
本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.6节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...
- Java多线程与并发编程终极宝典
阅读本文需要了解的概念 原语 所谓原语,一般是指由若干条指令组成的程序段,用来实现某个特定功能,在执行过程中不可被中断.在操作系统中,某些被进程调用的操作,如队列操作.对信号量的操作.检查启动外设操作 ...
- 基于《狂神说Java》JUC并发编程--学习笔记
前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...
- Java JUC高并发编程(三)-CallableJUC辅助类
目录 一.Callable接口 二.JUC辅助类 1.减少计数CountDownLatch 2.循环栅栏CyclicBarrier 3.信号灯Semaphore 一.Callable接口 Callab ...
- Java 多线程与并发编程专题
Java 线程基础 Java 多线程开发 线程安全与同步 并发控制 非阻塞套接字(NIO) Java 5 中的并发 JDK 7 中的 Fork/Join 模式 相关书评 Java 平台提供了一套广泛而 ...
- Java JUC高并发编程(一)
目录 一.概述 二.Lock接口 三.线程间的通信 解决虚假唤醒问题 Lock通信示例: 四.线程间定制化通信 一.概述 JUC就是java.util.concurrent工具包的简称,这是一个处理线 ...
- 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题
本节书摘来异步社区<Java线程与并发编程实践>一书中的第2章,第2.3节,作者: [美]Jeff Friesen,更多章节内容可以访问云栖社区"异步社区"公众号查看. ...
最新文章
- 深度学习奠基人特伦斯:美国学界已经找到了解释人工智能“黑盒子”的方法...
- 欢迎使用CSDN-markdown编辑器保存
- Oracle 表空间与数据文件
- activemq高可用
- python入门经典100例-【python】编程语言入门经典100例--37
- 基于微信小程序的电影院购票系统丨毕业设计源码
- 网易校招笔试第三题匈牙利算法
- 【Unity 3D】简易小车游戏
- linux下移植mplayer播放器
- 易路代理静态IP和动态IP解析以及存在的区别
- 保险机构如何保护客户信息安全?
- html静态页面作业——海贼王中乔巴漫画(5页) 学生动漫网页设计模板下载 海贼王大学生HTML网页制作作品 简单漫画网页设计成品
- 如何把app运行在手表和电视上
- 图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)
- HCIP之MPLS中的LDP协议
- 使用javascript通过className来获取元素
- 大力出奇迹,GPU 加速 TiDB | TiDB Hackathon 2020 优秀项目分享
- android 微信缩小通话界面_Android仿微信多人音视频通话界面
- Visual Studio 2017报错‘GetVersionExW‘: 被声明为已否决
- Oracle 创建PDB的几种常用方法