缓存穿透

什么是缓存穿透:
在redis中,查询某数据时:

  • 先查询缓存,不存在。
  • 然后查询数据库,也不存在。

这样对于一个不存在的数据,每次查找时,都会去进行一次数据库的查询操作。这就是缓存穿透。

解决缓存穿透

缓存空对象

代码简单,效果不好。
在查询数据时,无论该数据是否存在,都加入到缓存,value以null填充。

缺点:

  • 第一次查询一个不存在的数据时,也会查询数据库。
  • redis中可能会有大量空数据。

布隆过滤器

代码复杂,效果好。
复杂原因:(维护麻烦)

  • 添加数据,需要修改布隆过滤器,添加数据。
  • 删除数据时,需要重新构造布隆过滤器,因为布隆过滤器不能删除数据。

布隆过滤器应用

布隆过滤器可以简单理解为java中的List(new ArrayList())
但是,不能提取(get),不能修改(modify),只有添加数据,和查询数据是否存在的功能。
布隆过滤器使用:

  • put方法
  • 判断数据是否存在(可能会判断失误)

创建时需要:
设定误判率(误判率不能为0),误判率越高,耗能低,越低,耗能越高。
设定预估数据量

布隆过滤器原理

实现布隆过滤器依赖于bit数组。
对存入的数据进行若干次不同的哈希(hash),每次哈希之后使用哈希值对数组长度取余,得到下标,然后将bit数组中的相应下标改为1。
判断某数据是否存在时,也进行一遍相同操作,然后去相应下标查看,是否为1,有一个下标为0时,就绝对不存在,其余情况可能存在。

由于bit长度固定,在加入很多数据时,会有很多的下标值都变为了1。这样就有可能某个不存在的数据hash之后,它的下标都被其他存在的数据修改过,所以是可能存在。
容错率修改就会改变hash的次数,和bit数组长度

其他条件相同时,hash次数越多,过滤器出现误判的概率越高(自己判断的)

布隆过滤器自写(未完成)

google框架自带的布隆过滤器使用jvm来创建。(服务器宕机会导致数据消失)
自写的布隆过滤器存放在redis中,数据在持久化范围内,不会消失

redis中,存放string的数据时,使用的就是bit数组,而且在数组越界时,会进行扩容操作。
布隆过滤器使用redis生成
创建位数组:
setbit <数组名称> <长度> 0

缓存击穿

热点数据在数据库中,但是不在内存中 。
在高并发情况下(同时有很多个操作读取这个热点数据)
会出现每个读取操作都无法读取到缓存中的数据(并发情况下,缓存中数据还来不及更新),从而去读取数据库中的数据。这样就容易造成数据库崩溃。

解决方法:
在数据库操作部分添加分布锁。这样能保证依次读取。在第一个读取完成之后,缓存中就会有数据了。(虽然会导致堵塞,但是避免了多次读取数据库)

缓存雪崩

雪崩情况:

  • redis服务器挂了。
  • 缓存中大部分数据失效(个别热点数据失效属于缓存击穿)

规避方法:

  • 搭建redis高可用集群(cluster)
  • 错开数据失效时间

雪崩解决方法: 降级 熔断

数据一致性

暂无/(ㄒAㄒ)/~

学习来源

这篇笔记是在观看b站上的redis教程时记录的,视频链接:
https://www.bilibili.com/video/BV1aa4y1v7XF?t=5&p=1
侵删。

缓存穿透 缓存击穿 缓存雪崩 数据一致性相关推荐

  1. Redis 缓存穿透、击穿、雪崩现象及解决方案

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩 缓存穿透 关键词:穿过 Redis 和数据库 当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了.下面这段逻辑大家 ...

  2. Redis应用问题解决(缓存穿透、击穿、雪崩、分布式锁)

    Redis应用问题解决(缓存穿透.击穿.雪崩.分布式锁) 缓存穿透 问题描述 当系统中引入redis缓存后,一个请求进来后,会先从redis缓存中查询,缓存有就直接返回,缓存中没有就去db中查询,db ...

  3. 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了

    对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一.在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓存击穿.雪崩等严重异常情景, ...

  4. 缓存穿透、击穿、雪崩

    一.缓存穿透 缓存穿透是指缓存和数据库中均不存在目标数据,而用户不断发起请求,缓存也得不到更新,由此每次请求该数据都会到数据库.高并发量,就会对后端的 DB 系统造成很大压力.如查询 id 为&quo ...

  5. Redis缓存穿透、击穿、雪崩、概念及解决办法

    在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作用降低 一.缓存穿透 1.缓存穿透理解   缓 ...

  6. Redis 缓存穿透、击穿、雪崩 解决方法

    目录 引言 一.缓存穿透 1. 缓存穿透的原理 2. 解决方法 2.1 布隆过滤器 2.2 缓存空对象 二.缓存击穿 1. 缓存击穿原理 2. 解决方法 2.1 设置热点数据永不过期 2.2 加互斥锁 ...

  7. Redis_缓存穿透、击穿、雪崩

    查询步骤图解 1.缓存穿透 什么是缓存穿透:          查询请求一直向数据库查询,导致数据库压力过大,甚至奔溃         本质原因:查询的数据既不在缓存中,也不在数据库中 此时会出现:程 ...

  8. 牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩!

    前言 如何有效的理解并且区分 Reids 穿透.击穿和雪崩之间的区别,一直以来都挺困扰我的.特别是穿透和击穿,过一段时间就稀里糊涂的分不清了. 为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们区分这三 ...

  9. Redis缓存穿透、击穿、雪崩、预热、更新、降级

    Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透.缓存击穿.缓存雪崩.缓存预热.缓存更新.缓存降级.本篇分别介绍这些概念以及对应的 ...

  10. 图解Redis缓存穿透、击穿、雪崩(必须知道)

    目录 一.缓存是什么? 二.缓存的作用和成本 1.缓存的作用: 2.缓存的成本: 三.缓存作用模型 1.根据id查询数据缓存流程 四.缓存更新策略 1.内存淘汰 2.超时剔除 3.主动更新 五.缓存穿 ...

最新文章

  1. C#验证子网掩码的正确性
  2. python argvparser_Python命令行参数argv和argparse该如何使用
  3. ORACLE EXPDP命令使用详细
  4. mapreduce运行模式
  5. ubuntu下gcc的安装与使用
  6. oracle rac维护命令,2015年oracle rac日常基本维护命令.doc
  7. 10问10答:你真的了解线程池吗?
  8. idea项目application.properties文件注释显示unicode编码
  9. python数据库实现注册函数_10.注册和登录功能实现(3)—— 注册数据写入数据库...
  10. 一款超级实用的SuperLayout
  11. Linux运维之ntpdate同步网络时间
  12. 数据整理—dplyr包(filter系列)
  13. linux配置vsftp红帽子,linux红帽子VSFTPD的配置.doc
  14. 电子商务中与客户沟通宝典
  15. composer安装fxp/composer-asset-plugin
  16. sikuli实现百度云批量离线下载
  17. SketchUp 2019 建筑透视剖面图教程
  18. 基于OTSU算法和基本粒子群优化算法的双阈值图像分割
  19. 服务器硬件与 Linux 初体验
  20. 2万元起步 大四学生炒房资产达500万元

热门文章

  1. red hat 5安装序列号
  2. Slides中插入脚注
  3. 1.1.6 插入脚注后,正文空一行
  4. tomcat7和tomcat8的websocket区别
  5. 计算机主板的技术规格,电脑主板的主要参数有哪些?
  6. c++——一个萃取的实例
  7. swift语言特性,swift语法介绍,swift使用技巧
  8. 恶意软件与反病毒网关
  9. 无线网络与广域网技术
  10. Linux下添加HP5500打印机