上一篇演示了通过redis实现ID生成器,本篇模拟缓存击穿,穿透,雪崩的场景。

package com.coderman.jedis.clusterdemo.hack;import com.coderman.jedis.clusterdemo.ClusterTest;
import org.junit.Test;/*** @Author fanchunshuai* @Date 2020/1/31 15* @Description:*  * 缓存穿透:*  参考 https://mp.weixin.qq.com/s?__biz=MzU0MDEwMjgwNA==&mid=2247486705&idx=2&sn=33f90d9606ad32384d351a2cc170ba2d&chksm=fb3f150acc489c1c967f2bb250d14c3e44d4f4f2dff6991f8315043ca247819b3bfd973650ef&mpshare=1&scene=1&srcid=&sharer_sharetime=1579147583247&sharer_shareid=9c9dad852994f99c77b36e07bf5e0634&key=e10552fbfdccf7e3c22c51843df41144e9c3289850973823df906830ec355cb3e209383648ee671a95a76047a8153bff8ebc315cdcb6a94cb28e546b334ff71bab7a01ea25dc2a703afcccd1ddd6d5fe&ascene=1&uin=MjYzNzcyMTYyNw%3D%3D&devicetype=Windows+10&version=6208006f&lang=zh_CN&exportkey=AQFkC39NhSkTnb6SD70SAfY%3D&pass_ticket=iG9ywRBijCrb47ifDs6%2B%2Fgz8gQXaPnoVEkBXC0Kvb1%2BAmKJ3ZR3f48KpJcp2%2BWKI**  参考 https://blog.csdn.net/kongtiao5/article/details/82771694*/
public class RedisHackTest extends ClusterTest {private static final String STAFF_PREFIX = "sso:staff:";/*** 缓存穿透测试*        缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,*        如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。*/@Testpublic void cacheThroughTest(){//假设缓存中就只有1000个keyfor (int i  = 1 ;i<1000;i++){String staffId = STAFF_PREFIX + i;cluster.set(staffId,"樊春帅"+i,"NX","EX",30);}Thread [] threads = new Thread[1000];//使用1000个线程访问一个不存在的keyfor (int i  = 0 ;i<1000;i++){Thread pop = new Thread(()->{for (int k = 0;k < 10000;k++){//访问一个不存在的keyString notExitKey = STAFF_PREFIX +  1001;String x = cluster.get(notExitKey);System.out.println("x = "+x);if(x == null  || "".equals(x)){//db.get();}}},"pop-"+i);threads[i] = pop;}for (int i  = 0 ;i<1000;i++){threads[i].start();try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}}/*** 缓存击穿测试*       缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),*       这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力* 我这边理解的具体场景有两种* 1.在高并发下某个key被突然访问,但是缓存中数据还没有建立起来,而数据库中可能有,此时会有大量请求走到DB* 2.在高并发下某个key失效后被突然访问,但是缓存中数据还没有建立起来,而数据库可能有,此时会有大量请求走到DB** 突然成为热点key存在缓存击穿情况*/@Testpublic void cacheBreakDownTest(){for (int i  = 1 ;i < 1000;i++){String staffId = STAFF_PREFIX + i;cluster.set(staffId,"樊春帅"+i,"NX","EX",30);}String key = STAFF_PREFIX + 1000;//设计1000个线程,突然在某一刻访问第1000个key,之前缓存中一直没有也没有建立起来,这里来演示这种情况Thread [] threads = new Thread[1000];for (int i  = 0 ;i<1000;i++){Thread pop = new Thread(()->{for (int k = 0;k < 10000;k++){//访问一个缓存中不存在的keyString x = cluster.get(key);System.out.println("x = "+x);if(x == null  || "".equals(x)){//很多请求查询db//db.get();//这里是数据库里有,所以会很快重建缓存cluster.set(key,"冲冲冲","NX","EX",30);//这里涉及到缓存失效后如何重建缓存,后面大家可以自行百度}}},"pop-"+i);threads[i] = pop;}for (int i  = 0 ;i<1000;i++){threads[i].start();try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}}/*** 缓存雪崩* 参考 https://www.jianshu.com/p/b880570a1545*/@Testpublic void CacheAvalancheTest(){for (int i  = 1 ;i < 1000;i++){String staffId = STAFF_PREFIX + i;cluster.set(staffId,"樊春帅"+i,"NX","EX",30);}try {//休息30秒,让缓存过期Thread.sleep(30 * 1000);} catch (InterruptedException e) {e.printStackTrace();}//所有缓存key都很快失效Thread [] threads = new Thread[1000];for (int i  = 0 ;i<1000;i++){Thread pop = new Thread(()->{for (int k = 1;k < 1000;k++){String staffId = STAFF_PREFIX + k;String x = cluster.get(staffId);System.out.println("x = "+x);if(x == null  || "".equals(x)){//很多请求查询db//db.get();}}},"pop-"+i);threads[i] = pop;}for (int i  = 0 ;i<1000;i++){threads[i].start();try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}}}

使用jedis连接redis-cluster模拟缓存击穿,穿透,雪崩场景相关推荐

  1. Redis数据读取(缓存击穿,穿透,雪崩)

    内容文件参考"付费专栏"可领取.专栏购买者提供本内容"永久答疑和远程协助"服务.一诺千金! N.1 缓存处理流程 1)前台请求,后台先从缓存中取数据,取到直接返 ...

  2. 你需要知道的缓存击穿/穿透/雪崩

    目录 缓存击穿/穿透/雪崩 Intro 缓存击穿 缓存穿透 缓存雪崩 Reference Contact 缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩 ...

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

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题. 缓 ...

  4. redis——缓存击穿/穿透/雪崩

    缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB). 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力.这就叫 ...

  5. 面试常问:redis缓存击穿/穿透/雪崩

    1. 讲个故事 一个人去门店买联想电脑,线下门店没有货了,于是店员给厂家打电话问问有没有货,厂家发现也没货了,这个人就走了.过了一会另一个人也要来买联想电脑,然后店员又打电话问了一次厂家,如此反复.这 ...

  6. python连接redis集群如何释放内存_python 连接 redis cluster 集群

    一. redis集群模式有多种, cluster模式只是其中的一种实现方式, 其原理请自行谷歌或者百度, 这里只举例如何使用Python操作 redis cluster 集群 二. python 连接 ...

  7. 【redis】redis缓存穿透及解决方案|缓存穿透,缓存击穿,雪崩的理解

    |目录 缓存穿透 解决方案 布隆过滤 缓存空对象 缓存雪崩 解决方案 1.保证缓存层服务高可用性 2.依赖隔离组件为后端限流并降级 3.数据预热 4.做二级缓存,或者双缓存策略. 5.缓存永远不过期 ...

  8. Java中使用Jedis连接Redis对SortedSet进行排序操作

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

  9. Java中使用Jedis连接Redis对Hash进行操作的常用命令

    场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...

最新文章

  1. yolo-mask的损失函数l包含三部分_损失函数总结-应用和trick
  2. python以读写方式打开文件_python读写文件操作详细介绍【传智播客】
  3. 《java语法实例2~15章》
  4. spring事物不起作用
  5. wxWidgets:wxTimePickerCtrl类用法
  6. HTML-CSS背景渐进色
  7. Android TextView setGravity不起作用
  8. 根据银行卡账号获取所属银行php代码
  9. Mimics 21安装
  10. 如何把map的value转为list_Java 8 将Map转换为List
  11. 恒生电子 招聘FPGA开发/验证工程师
  12. linux用ping命令测试网速,如何用ping 命令简单测试网速
  13. 拍照时光圈与景深控制
  14. xp系统开机自检很久_windows XP系统开机总自检怎么取消
  15. 【图形学】布林冯BlinnPhong
  16. Android自定义半圆进度条 半圆渐变色进度条带指示 半圆开口大小可自由修改
  17. linux协议栈学习 第七节 GRO的实现
  18. php两个手机号正则表达式_最新手机号码正则表达式(php版)
  19. ios设备使用socks代理_iOS使用socks5代理服务器
  20. 网络安全基础知识笔记-1

热门文章

  1. mysql提示Got timeout reading communication packets、Got an error reading communication packets
  2. ubuntu 安装 Clang/LLVM 15.0.4
  3. java将货币转换为大写形式
  4. 求伯君20年跌宕起伏:最牛程序员华丽转身
  5. 图文并茂 —— 插入排序,希尔排序
  6. Python数据分析绘图库,pyecharts绘制各类地图
  7. 已知男程序员穿格子衫,那么女程序员会穿格子裙吗?
  8. web渗透测试流程(学生笔记,欢迎补充改正)
  9. 计算机专业春考难不难,【过来人经验】春考之路接下来怎么走?听过来人讲讲填报志愿有哪些注意事项!...
  10. RXVega64属于什么档次的显卡 RXVega64显卡怎么样