缓存穿透

缓存穿透是指查询缓存中没有,数据库中也没有的数据 。从系统层面来看,请求像是穿透了缓存,直接访问数据库。这种情况会给系统带来潜在的风险,如果有大量的请求访问系统数据库中不存在的数据,会直接请求到数据库层导致DB瘫痪从而引起系统故障,服务不可用。

解决这种问题的方法有两个:

1、缓存空对象

缓存空对象是在第一次查询到数据库中也不存在的数据后,将该key与对应的空对象也放入缓存中,只不过设定为较短的失效时间,例如几分钟,这样则可以应对短时间的大量的该key攻击,设置为较短的失效时间是因为该值可能业务无关,存在意义不大,且该次的查询也未必是攻击者发起,无过久存储的必要,故可以早点失效。

2、采用布隆过滤器

采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。

缓存击穿

缓存击穿是指缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

解决方案:

采用互斥锁。当大量的请求查询该已失效的key时,我们在第一个请求上用互斥锁锁住该key,其他请求就会锁等待。等第一个请求从DB中查询到了数据,并加入到缓存之后,后面的请求就可以直接从缓存中读取数据了

缓存雪崩

缓存雪崩是指在我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。

解决方案:

给每个key设置不同的过期时间即可。

最新文章

  1. Raspberry Pi(树莓派)上安装Raspbian(无路由器,无显示器)
  2. HDU5730 Shell Necklace(DP + CDQ分治 + FFT)
  3. HDU 4433 locker(SPFA+DP)
  4. Spring学习8-Spring事务管理(编程式事务管理)
  5. [HDOJ3911]Black And White(线段树,区间合并)
  6. (转载)全球唯一标识GUID
  7. EntityFramwork(2Database First) 源地址https://msdn.microsoft.com/zh-cn/data/jj193542
  8. 01.FastDFS的安装部署
  9. online learning
  10. 深入浅出 JavaScript 对象 v0.5
  11. js 转化类似这样的时间( /Date(1389060261000)/)问题
  12. linux 各种发行版及包管理器的关系
  13. C#并行编程--命令式数据并行(Parallel.Invoke)
  14. 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
  15. oracle数据库知识点
  16. 《大型网站技术架构:核心原理与案例分析》【PDF】下载
  17. Spark技术内幕:究竟什么是RDD
  18. 网页调启用qq对话聊天客服窗口的链接地址方法大全(包含移动端)
  19. IdentityServer4-MVC+Hybrid实现Claims授权验证(四)
  20. git 错误 fatal: Not a valid object name: 'master'

热门文章

  1. 本地python环境安装kylin项目依赖时报认证错误信息
  2. 主题样式选择效果代码及css样式
  3. 深度优先搜索算法-dfs讲解
  4. C++_bind用法
  5. STM32F4寄存器初始化系列:时钟开启
  6. 数据对接:从Notion Database到低代码平台
  7. TCP/IP协议(7): NAT(Network Address Translation) —— 解决 IPv4 地址短缺的问题
  8. Wpf Border圆角 设置不成功
  9. 如何创建一个浏览器版的`Window11`
  10. (unsigned)short溢出后隐式转换为int