一、缓存穿透(数据库没有,缓存没有)

1、概念

当查询Redis中没有数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当出现大量这种查询(或被恶意攻击)时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据,我们称这种现象为“缓存穿透”。

缓存穿透会穿透Redis的保护,让底层数据库的负载压力变大,同时这类穿透查询没有数据返回也造成了网络和计算资源的浪费。

2、解决方案

  • 在业务服务访问层对请求进行校验,比如:请求参数、登录状态、N秒内访问接口的次数、随机数、时间戳等。判断是不是来自恶意用户的请求,可避免进一步访问缓存和数据库。
  • 对于查询为空的数据,可以将这个空结果(或者设置一个默认值)进行Redis缓存(将key-value对写为key-null或者key-default),这样后续请求就可以从缓存中读取到空值或者默认值返回给应用,而不会继续查询数据库。但是需设置很短的过期时间,比如30s(设置太长可能会导致正常情况也无法使用),也可根据实际业务需求设定。注意一定不要影响正常的业务。
  • 利用布隆过滤器将数据库层有关数据的键存储到布隆过滤器中,以判断访问的键是否在底层的数据库中。如果在布隆过滤器中则查询缓存,如果缓存没有则再次查询数据库;如果布隆过滤器中没有,则直接返回预先规定的结果即可。

因为哈希冲突的存在,布隆过滤器有误判率,查询布隆过滤器说数据存在,并不一定证明数据库中存在这个数据,但是查询到数据不存在,数据库中一定就不存在这个数据。

虽然布隆过滤器不能完全避免数据穿透的现象,但已经可以将99.99%的穿透查询屏蔽在Redis层,极大的降低了底层数据库的压力,减少了资源浪费。

二、缓存击穿(数据库有,缓存没有)

1、概念

当某个热点数据(被频繁访问的数据)的键从缓存中淘汰出去后,大量访问同时请求这个数据就会将查询下沉到数据库层,此时数据库层的负载压力增大,我们称这种现象为“缓存击穿”。

2、解决方案

  • 不给热点数据设置过期时间,由后台异步更新缓存。或者在热点数据准备要过期前,提前通知后台线程(或者是定时任务)去更新缓存以及重新设置过期时间。
  • 利用互斥锁保证同一时刻只有一个客户端可以查询底层数据库的数据。在根据key获取value值为空时,先锁上,然后从数据库加载,一旦查到数据就缓存至Redis内,然后释放锁。若其他线程也在请求该key时发现获取锁失败,则休眠一段时间(比如100ms)后再重试,以避免其他大量请求同时穿过Redis去访问底层数据库。

三、缓存雪崩

1、概念

Redis中大量的键几乎同时过期或者Redis发生故障宕机,大量并发的查询穿过Redis冲击到底层数据库上,此时数据库层的负载压力会增大,我们称这种现象为“缓存雪崩”。

2、解决方案

  • 在可接受的时间范围内随机设置键的过期时间,分散键的过期时间,以防止大量的键在同一时刻过期
  • 使用多级缓存机制
  • 对于一定要在固定时间让key失效的场景(例如每日12点准时更新所有最新排名),可以在固定的失效时间时在接口服务端设置随机延时,将请求的时间打散,让一部分查询先将数据缓存起来;

-------------------------------本篇文章到此结束-------------------------------------

Redis面试必问题(一)缓存穿透、缓存击穿、缓存雪崩的更多相关文章

  1. 【干货!!】三句话搞懂 Redis 缓存穿透、击穿、雪崩

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

  2. redis的缓存穿透、击穿、雪崩以及实用解决方案

    今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣, ...

  3. Redis高级应用解析:缓存穿透、击穿、雪崩

    1 背景 像我们去面试一些大公司的时候,就会遇到一些关于缓存的问题.可能很多同学都是接触过,多多少少了解一些,但是如果没有好好记录这些内容,不熟练精通的话,在真正面试的时候,就很难答出来了. 在我们的 ...

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

    缓存穿透: 大量查询 redis 中不存在的key(用随救数进行查询),导致每次都会去查询数据库,造成数据库压力过大(甚至宕机). 解决办法: 1.对我们的 api 接口 进行限流处理.用户授权.黑名 ...

  5. Redis缓存穿透、击穿、雪崩,数据库与缓存一致性

    Redis作为高性能非关系型(NoSQL)的键值对数据库,受到了广大用户的喜爱和使用,大家在项目中都用到了Redis来做数据缓存,但有些问题我们在使用中不得不考虑,其中典型的问题就是:缓存穿透.缓存雪 ...

  6. 穿透、击穿、雪崩…Redis这么多问题,如何解决?

    摘要:什么是缓存穿透?什么是缓存击穿,又什么是缓存雪崩呢?它们是如何造成的?又该如何解决呢?今天,我们就一起来探讨这些问题. 本文分享自华为云社区<[高并发]什么是缓存穿透?击穿?雪崩?如何解决 ...

  7. 【Redis场景3】缓存穿透、击穿问题

    场景问题及原因 缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常. 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存 ...

  8. redis面试必问

    1.项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试题剖析 为什么要用缓存? 用缓存,主要有两个用途:高性能.高并发. 高性能 假设这么个场景,你有个操作,一个请求过来,吭哧 ...

  9. Redsi缓存问题(穿透,击穿,雪崩)以及解决办法(分布式锁)【高并发问题】

    Redsi常见问题 缓存在高平发和安全压力下的一些问题 缓存击穿 是某一个热点key在高并发访问的情况下,突然失效,导致大量的并发大金mysql数据库的情况 缓存穿透 是利用redis和mysql的机 ...

  10. NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩

    1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...

随机推荐

  1. 关于DELL服务器风扇远程控制失效

    关于DELL服务器风扇远程ipmitool控制失效 去年12月,公司突然断电,公司有一台DELL 720XD服务器,自从断电之后,使用ipmitool命令行控制风扇速度就失效了,因为之前忙其他的项目, ...

  2. algorithm learning for Leetcode (1)

    Leetcode 算法学习(一) 前言:最近学校要求必须学习C++,着重提升技能板块.为了快速升级,我在GitHub上发现了一个开源的学习号召: https://labuladong.github.i ...

  3. HTML基础知识学习

    一.HTML概述 1.系统结构: ①.B/S架构 Browser Server(浏览器/服务器的交互形式.) Browser支持哪些语言:HTML CSS Javascript S是服务器端Serve ...

  4. 【jupyter notebook】设置jupyter notebook自动补全功能

    安装插件 pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user 重启jupyter,在 ...

  5. K8s+Docker 学习笔记系列

    学前知识 你需要掌握 Linux 的常用命令.你可以通过Linux 教程 来学习相关命令. Docker应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环境中部署和调 ...

  6. 狂神的学习笔记demo11(包机制)

    无法生成子包的问题:设置图标里的Compact Middle Packages勾去掉 //定义包 package package com.panda.base1; //导入包import import ...

  7. Python subnet 操作物件

    subnetcalc.py class SubnetCalc(object): def __init__(self, network, mask): self.network = network.sp ...

  8. habse与Hadoop兼容性问题

    今天大数据实验课被血坑,在第一步hbase的安装时就卡住了,之后处理了一整节实验课,也未能解决,回到宿舍后才解决(这里不得不说"度娘"不行了,出现的问题完全找不到,最好还是在chr ...

  9. 2019.11.14 typeScript环境搭建

    当前环境为windows系统,在VSCode下搭建typeScript环境.在mac系统下同window系统一样,只是安装好ts环境后可能会报tsc命令不能使用的错误,这个时候需要找到tsc命令所在的 ...

  10. 通过Dnsmasq自建干净的DNS服务

    不晓得为撒,用网上的一些公共DNS服务的时候,总是莫名其妙的有些网站无法解析,有时候114能解析,阿里DNS不行或者腾讯DNS不行,导致总是来回切换DNS,很是烦心. 于是就想着自己搭建一个DNS服务 ...