什么是缓存服务器:

缓存服务器用来存储网络上的其他用户需要的网页,文件等等。这种服务器不仅可以使用户得到他们想要得信息,而且可以减少网络的交换量。缓存服务器往往也是代理服务器。对于网络的用户,缓存服务器和代理是不可见的,在用户看来所有的信息都来自访问的网站。
比如市场常用的redis服务器
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
nginx: 3-5万/秒
redis: 读: 11.2万/秒 写: 8.6万/秒 平均10万/秒
吞吐量: 50万/秒

当今的许多后台架构都使用了缓存服务器,如图

缓存作用:

1)提高后台服务器查询数据库的效率
2)有效降低后台数据库服务器的压力

下面三个问题的共同点:

都是由于缓存失效,导致大量的用户的请求,直接访问数据库服务器,导致负载过高,从而引发的整体宕机的风险。

缓存穿透

用户频繁访问数据库中不存在的数据时,可能出现缓存穿透的现象,如果该操作是高并发操作,则可能直接威胁数据库服务器。
现象分析:
一般情况下,用户向服务器发送查询请求后,后台服务器会先向缓存服务器查询数据,如果缓存服务器没有则查询数据库服务器,查询到之后将数据写入缓存,以此方便后续再次查询该数据。
而缓存穿透则是查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,高并发的情况下会导致服务器负荷过大。

解决方案

1.采用IP限流的方式,降低用户访问服务器次数。
(弊端:可采用IP动态代理的方式破解此方式)
2.微服务的处理方式:利用断路器返回执行的业务数据即不执行数据库操作,从而保护了数据库。
比如:当用户频繁访问一个不存在的数据时,断路器侦测到后即拦截,直接返回给用户错误信息提示,不再让此请求查询数据库。
3.微服务处理方式:API网关设计:不允许做非法操作
只要不是通过程序内部跳转的请求(比如直接再url上加参数的行为),后台服务器直接过滤。

缓存击穿

由于缓存服务器中某个被频繁访问的数据因为超时或删除等操作造成数据失效,同时用户高并发访问该数据,则可能导致数据库宕机。
比如A数据为一热点新闻数据,用户大量访问,而某一次操作导致缓存服务器清空,缓存中A数据也没有了,而用户此时高并发访问,众多访问请求会一瞬间涌如数据库服务器(此时数据还未来得及再次写入缓存),从而导致数据库宕机。

解决方案

可采用多级缓存的设计,同时数据的超时时间随机数设置。
当缓存服务器A中热点数据被清空或超时后,后台服务器仍能从缓存服务器B中得到该数据。

缓存雪崩

由于缓存服务器中的数据大量失效(如执行了flushall操作 ),导致用户的访问命中率太低,大量的用户直接访问数据库,从而导致服务器存在宕机的风险。

解决方案

1.多级缓存,如上。
2.设定不同的超时时间
3.禁止执行flushAll等敏感操作。

缓存穿透,缓存击穿,缓存雪崩相关推荐

  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完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)

    1. 数据类型 五大基本类型 String hash -> 类似map list set -> zset -> 基于set的有序集合 新增 bitmaps:其实就是string,主要 ...

  10. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

最新文章

  1. python登录网页账号密码_Python 通过爬虫实现GitHub网页的模拟登录的示例代码
  2. python代码壁纸-一个爬取壁纸的python代码
  3. python八:列表(list)
  4. php call_user_func和,php – call_user_func()和$var()之间有区别吗?
  5. MATLAB中:左右除法、逆inv、广义逆pinv的区别
  6. 区块链BaaS云服务(21)腾讯CCGP”跨链事务“
  7. verilog 8位流水灯_用单片机控制的LED流水灯设计
  8. 推荐一位零基础转 Python 的大佬
  9. 也可以改为while(input[0])或while(cininput[0])
  10. STM32F4 串口DMA
  11. 学妹惊呼:使用Java8改造后的模板方法模式真的是yyds
  12. python serial_python_serial
  13. 选择JSF不选Struts的十大理由
  14. paip.提升性能----数据库连接池以及线程池以及对象池
  15. 基于Arduino的双向交通灯系统
  16. 火狐浏览器安装有道翻译插件
  17. 电脑如何安装android系统版本,电脑如何安装Android系统 电脑安装安卓系统教程
  18. SQL Server 数据查询
  19. 基于WPS开放平台 WPS文件转PDF开发指南
  20. ActiveMQ 镜像队列Mirrored Queues

热门文章

  1. SCM工具-Git的相关指令
  2. 转载:Java语言学习
  3. U1C2 文本预处理
  4. 对于DFA、NFA理解
  5. vtkOBBTree——包围盒
  6. scanf函数、冒泡排序和不定长度数组的使用 —— malloc
  7. fwrite函数的用法
  8. pin assignment
  9. Ng机器学习 Week8 Unsupervised Learning
  10. Winform + Devexpress 实现看板效果