随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立连接。

但是在使用Redis的时候,随之而来的问题也会越来越多,有些请求甚至会直接越过Redis直接请求数据库,今天我们来了解Redis数据库经常会谈及的问题缓存雪崩、缓存击穿、缓存穿透

缓存雪崩

在某一时刻,大量的key失效,用户大量请求直接请求数据库,导致数据库宕机。此时的Redis形同虚设,用户大量请求都命中不了,导致数据库服务器压力过大,Redis本身是用来减少数据库的压力,那么此时如何解决呢?

缓存雪崩解决方案

1.随机设置缓存的过期时间,以防同时过期大量缓存数据。

var time = Math.random()*10000;>setex name time mango

2.如果是在集群环境中,将热点数据均匀分布在不同的缓存数据库中。

3.也可以热点数据永不过期,如果有数据更新就直接更新redis即可。

>set name mango>set name zhangsan    #修改key的value值

缓存击穿

缓存里面的一个key非常的火爆,在某一时间这个key刚好过期,大并发数据量击穿了缓存直接请求数据库,导致数据库压力过大,严重情况会导致数据库崩溃,这就是缓存击穿。例如:微博热点新闻,某个明星又出绯闻了,然后大量的粉丝刷文章刷评论,一时间热火朝天,突然请求这条微博的缓存过期,那么大量的请求直接涌向数据库,建立大量连接,数据库还没反应过来就崩了。

缓存击穿解决方案

1.设置这个key永远不会过期

>hset 156486453215 title "mango上热搜" describe "mango太帅了"

2.程序控制请求数据库的次数,比如添加互斥锁、延时请求(1s后请求)

public static string GetData(string key){    //从redis查数据    string result = RedisHelper.GetDataByKey(key);    if(string.IsNull(result))    //获取到空数据    {        lock(obj)    //锁定资源        {            //从数据库获取数据            result = DB.GetDataByKey(key);            //校验            if(!string.IsNull(result))            {                RedisHelper.SetData(key,result);    //缓存且返回                return result;            }        }        Thread.sleep(1000);    //先睡一觉    }}

意思大概是这么个意思,代码的话,哈哈哈,明白意思最重要。

3.服务器熔断、降级,限制每个用户的访问次数,并且如果获取不到数据即返回一个固定的推荐页面。

缓存穿透

用户不断地请求一个缓存没有并且数据库也没有的数据,服务器疯狂的跟数据库建立连接从而压倒数据库。比如说:根据产品id获取产品详情的接口,那么我用一个id=-1去请求,那肯定是获取不到任何数据的。一般这样的情况有可能服务器遭到了恶意攻击。

缓存穿透解决方案

1.在用户请求的接口层增加一些校验,例如:用户鉴权校验、参数传值校验等不合法的参数请求即直接返回。开发者应该保持一个悲观的态度,不要相信任何客户端因为计算机本身不知道操作者是谁,任何参数都应该考虑到。

if(id < 0){    return("参数不合法");}

2.使用Redis高级数据结构布隆过滤器(Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)),他就是检测数据库中是否存在该key,不存在就直接返回即可。

>bf.mexists user(integer) 0    #如果不存在,则return

写到最后

缓存的雪崩、击穿、穿透其实都是客户端请求直接越过缓存直接请求数据库,但是他们从意义上来讲又有微妙的不同。大家一定要理解这三者是如何产生的,才能对症下药。

在用户请求的时候我们可以配置服务器的熔断+降级,保证服务器不会崩溃,用户请求频繁可以限制它的请求次数,或者可以牺牲部分用户的性能。

一般来讲数据到达一定量后,为了保证服务器的高可用,我们会对redis建立集群或者是主从+哨兵模式,避免redis直接挂掉没有任何的机器代替。也可以使用redis持久化,如果Redis崩溃,重启后且恢复数据

当然,我们也要保证数据库本身具有一定的抗压性,比如我们添加一主多从的数据库,保证数据库不会那么容易崩溃。

一名正在抢救的coder

笔名:mangolove

CSDN地址:https://blog.csdn.net/mango_love

GitHub地址:https://github.com/mangoloveYu

Redis缓存穿透、击穿、雪崩来解释个明白相关推荐

  1. Redis缓存穿透击穿雪崩

    目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...

  2. Redis缓存/穿透/击穿/雪崩

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

  3. 一文搞懂Redis缓存穿透/击穿/雪崩

    缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...

  4. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  5. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

  6. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  7. Redis缓存穿透击穿和雪崩(八)

    1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...

  8. 一篇吃透Redis缓存穿透、雪崩、击穿问题

    前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...

  9. Redis -- 缓存穿透和雪崩

    文章目录 一.缓存穿透 1.1 概念 1.2 解决方案 1.3 布隆过滤器的工作原理 二.缓存击穿 2.1 概念 2.2 解决方案 三.缓存雪崩 3.1 概念 3.2 解决方案 用户的数据一般是存储于 ...

  10. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)

    Redis NoSql简述 Nosql概念 Nosql的四大分类 Redis概述 Redis的安装 安装文件 Window下安装 Linux下安装 redis-benchmark 压力测试工具 五大数 ...

最新文章

  1. jQuery.append()、jQuery.html()存在的XSS漏洞
  2. Snackbar源码分析
  3. ExcelReport第三篇:扩展元素格式化器
  4. 怎么把数据存到MySQL_怎样将Arduino数据直接存储到MySQL
  5. 关于Ubuntu 安装tftp服务器的问题解决
  6. Linux内核源码分析方法
  7. JDK1.6官方下载_JDK6官方下载地址:http://www.java.net/download
  8. 项目Beta冲刺Day3
  9. gcc/g++ 如何支持c11/c++11标准编译
  10. 【虚拟机VMWare15使用】给虚拟机硬盘添加还原卡//使用物理磁盘做虚拟硬盘
  11. 共享图书横空出世一本书看十天只需一块钱
  12. 前端经典面试题(持续更新)
  13. 线性代数学习笔记——第五十七讲——特征子空间
  14. 笔记本开不了机怎么办?
  15. [Leetcode] 643. 子数组最大平均数 I java
  16. 海思3516DV300系列HiPQTools工具ISP图像调试_AWB校定
  17. 介绍计算机专业说明文,描述电脑说明文600字.doc
  18. 【PaperReading】AGCN: Attention-driven Graph Clustering Network
  19. 1、Neural Rendering
  20. python设计拼图小游戏_关于python:教你用Python自制拼图小游戏轻松搞定熊孩子

热门文章

  1. linux ipconfig和route 命令
  2. 1160. 拼写单词
  3. Golang make chan 第二个参数(size)
  4. 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP
  5. windows 播放MP3音乐
  6. [hihoCoder 1384]Genius ACM
  7. php生成随机验证码
  8. Java笔记第七篇 数据类型初了解(下,后含有循环输出a-z)
  9. Android热更新开源项目Tinker集成实践总结
  10. 【Qt开发】Qt标准对话框之QMessageBox