一、缓存穿透

1. 什么是缓存穿透?

为了缓解持久层数据库的压力,在服务器和存储层之间添加了一层缓存;

一个简单的正常请求:当客户端发起请求时,服务器响应处理,会先从redis缓存层查询客户端需要的请求数据,如果缓存层有缓存的数据,会将数据返回给服务器,服务器再返回给客户端;如果缓存层中没有客户端需要的数据,则会去底层存储层查找,再返回给服务器;

缓存穿透就是:当客户端想要查询一个数据,发现redis缓存层中没有(即缓存没有命中),于是向持久层数据库查询,发现也没有,于是本次查询失败;当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库,此时会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

2. 解决办法

在缓存层加布隆过滤器,通俗简述一下其作用:将数据库中的 id ,通过某方式映射到布隆过滤器,当处理不存在的 id 时,布隆过滤器会将该请求过直接过滤出去,不会到数据库做操作。

3. 布隆过滤器

1)概述:布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,实际上是一个很长的二进制向量和一系列随机映射函数,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

2)返回结果的不确切性:布隆过滤器是一个 bit 向量或者说 bit 数组:假设有8位

映射数据1:使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置为 1,比如三次hash完后,data1 将1、3、6位,置为1;

映射数据2:data2 将2、3、6位,置为1,此时由于hash为随机性,所以6位和 data1 有重复的,便会覆盖 data1 的第6位的1;

问题来了!!

6 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了,当我们如果想查询 data3这个值是否存在,假设哈希函数返回了 1、5、6三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 data3 这个值不存在。而当我们需要查询 data1 这个值是否存在的话,那么哈希函数必然会返回 1、3、6,然后我们检查发现这三个 bit 位上的值均为 1,那么我们是否可以说 data1 存在了么?答案是不可以,只能是 data1 这个值可能存在!因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 data4 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他位置位了 1 ,那么程序还是会判断 data4 这个值存在。

所以:布隆过滤器的长度会直接影响误报率,布隆过滤器越长且误报率越小。

3)简单剖析布隆过滤器源码

导入guava的包:

com.google.guava     guava     23.0

源码:BloomFilter一共四个create方法,最终都是走向第四个方法;

public static  BloomFilter create(Funnel super T> funnel, int expectedInsertions) {        return create(funnel, (long) expectedInsertions);    }      public static  BloomFilter create(Funnel super T> funnel, long expectedInsertions) {        return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions    }    public static  BloomFilter create(          Funnel super T> funnel, long expectedInsertions, double fpp) {        return create(funnel, expectedInsertions, fpp, BloomFilterStrategies.MURMUR128_MITZ_64);    }    static  BloomFilter create(      Funnel super T> funnel, long expectedInsertions, double fpp, Strategy strategy) {     ......    }

参数类型:funnel:数据类型;expectedInsertions:期望插入的值的个数;fpp:错误率(默认值为0.03);strategy:哈希算法。

总结:错误率越大,所需空间和时间越小;反之错误率越小,所需空间和时间越大!

二、缓存击穿

1. 什么是缓存击穿?

缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,造成击穿,就像在一堵墙上凿开了一个洞;比如微博热搜…

2. 解决办法

  1. 设置热点数据缓存没有过期时间,但当热点平稳一阵后,会造成一些空间浪费;
  2. 加互斥锁:使用分布式锁,保证每一个key只有一条线程访问,其他线程等待,但对分布锁考验很大。

三、缓存雪崩

1. 什么是缓存雪崩?

缓存雪崩是指:某一时间段,缓存集中过期失效,即缓存层出现了错误,不能正常工作了;于是所有的请求都会达到存储层,存储层的调用量会暴增,造成 “雪崩”;

比如:双十二临近12点,抢购商品,此时会设置商品在缓存区,设置过期时间为1小时,当到了1点时,缓存过期,所有的请求会落到存储层,此时数据库可能扛不住压力,自然 “挂掉”。

2. 解决办法

redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群

限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

数据预热

数据预热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

转载于:https://blog.csdn.net/weixin_45677119/article/details/106320983

作者:ME&

guava 缓存查询_阿里Java二面难点:Redis缓存穿透、击穿、缓存雪崩方案相关推荐

  1. mysql 左连接b表的一条数据_阿里java架构师教你怎么用mysql怒怼面试官

    转载地址: 阿里java架构教你怎么用mysql怒怼面试官​www.jianshu.com 说一下mysql比较宏观的面试,具体咋写sql的这里就不过多举例了.后面我还会给出一个关于mysql面试优化 ...

  2. 阿里Java社招面试真题200+:缓存+分布式+JVM+高并发+NIO+框架

    前言: 阿里可以说是互联网java公司的标杆了,这份面试题包含了Java基础(JavaSE基础)常考知识点 这些基础知识题的答案也都还不错.除了这个还有集合Hashtable/HashMap等集合常考 ...

  3. redis 什么是冷数据_阿里Java三面凉凉:微服务,Redis,JVM一个都搞不懂

    前言: 金九银十刚刚过去了,不知道很多小伙伴都拿到自己心仪的offer没有,我这边也收到了一个粉丝投来的消息,说看到阿里的面试真题之后人都是懵的,发现自己一窍不通,下面给大家分享我这个粉丝的经历,以及 ...

  4. java 获取文件大小_阿里Java后端开发面经,面试官都替我感到绝望

    点关注,不迷路:持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次阿里Java后端开发面经,分享给大家,感谢支持! 前言 秋招面试的第一家公司,也是第一次面试,真的超级紧张,从自我介绍到 ...

  5. java系统缓存应用_著名java开源缓存系统 【zz】

    目前在学习缓存的一些开源代码,查询到 一些资料分享给大家 以下是几个著名java开源缓存系统的介绍: OSCacheOSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何J ...

  6. 面试java回答优缺点_阿里Java开发面经分享,面试题(附回答)

    下面要给大家分享一个阿里Java开发面经,里面包含了具体的问题,以及相关回答,主要包括了数据库.操作系统.项目相关.java基础.数据结构.计算机网络等内容. 一.数据库 1.为什么在项目中用Mong ...

  7. 阿里java规范_阿里Java规范

    上个月在知乎上看到了关于阿里Java规范的文章,于是去网上找了一份下载,但不是最新的,文档也只是扫了一眼,没具体看.今天刚好关注的微信公众号发了一篇关于<阿里Java规范>文章,于是去下载 ...

  8. 阿里java工程师要求_阿里Java P系列技术要求(P5-P7)

    阿里p系列薪资(最新数据比这个高1倍左右) 阿里P5(高级研发工程师) 工作要求: 能独立完成日常工作,并能够对一些方案提出自己的建议. 基本考核就是能上手独立完成工作,熟练掌握. 技能要求(熟练): ...

  9. mybatis 三级缓存查询循序_MyBatis手把手跟我做系列(五) --- 一级缓存与二级缓存

    一.什么是缓存 要理解MyBatis的一级缓存,至少,你需要先直接什么是缓存的这个概念,其实我们一直都在用 直接来看下面的图: 对于我们之前的JDBC操作,如果需要连续请求id=1的用户数据,那么就需 ...

最新文章

  1. 远控软件VNC***案例研究
  2. 正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能
  3. linux文件历史,Linux文件系统的历史透视
  4. VTK修炼之道33:边缘检测_Sobel算子
  5. Prometheus 序章/第一/二讲
  6. java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?
  7. access ole 对象 最大长度_Redis 数据结构和对象系统,有这 12 张图就够了!
  8. 使用vue实现自定义搜索功能
  9. 简约易收录的导航网站源码
  10. Mybatis中的updateByPrimaryKeySelective()和updateByPrimaryKey()
  11. 俺的房子内有空调冬暖夏凉,房间宽敞气派非凡
  12. LeetCode 36. Valid Sudoku
  13. Java 算法 - 递归算法思想
  14. Apache安装教程
  15. 集成显卡和独立显卡的区别
  16. 【愚公系列】2022年10月 .Net Core使用cpolar内网穿透功能实现钉钉回调事件的监听
  17. Android自定义Scrollbar样式
  18. 虚拟机安装和优盘启动盘制作
  19. 欧几里得  拓展欧几里得算法 讲解 (Euclid Extend- Euclid Algorithm)
  20. 汇编中的test和cmp指令[Z]

热门文章

  1. java string补空格_Java String字符串补0或空格详解
  2. linux减小根目录空间_Linux目录结构及文件基本操作详解
  3. mysql导入报编码错误问题解决
  4. ibmt42装Android,IBM T42系统升级初步体会,爽!
  5. python面向对象代码_两百行代码搞定!使用Python面向对象做个小游戏
  6. 边缘设备上的实时AI人员检测:入门
  7. Dapper的动态查询生成器
  8. python快速排序最简单写法_面试官:来,这位精神小伙,简简单单写个快速排序吧...
  9. alt+x+b没反应_Alt键的这几种用法,你一定要知道
  10. python绘制直方图plt_Python:matplotlib绘制直方图