缓存击穿问题分析

标签: 缓存 问题 分析 | 发表时间:2017-12-26 14:54 | 作者:ludizhang
出处:http://www.iteye.com
缓存一般作为RDS的前置组件,将常用的资源缓存,用来减少RDS的读取压力,也是诸多系统常用的一种方案,如果允许访问缓存失败直接访问数据库,然后再将数据回写到缓存中,那么就会存在缓存击穿的问题,
缓存击穿:缓存中的数据未被命中,进而请求直接对数据库进行查询,当大量的类似查询瞬间出现,就会出现数据库的压力爆炸甚至引起数据库的雪崩,本质就是一种缓存失效引发的极端问题

如何应对这种情况?
在很多面试过程中碰到这样的问题,给出答案:不给缓存击穿的机会
首先不允许跨过缓存直接访问数据库,在缓存中及认为数据可以被访问,否则则认为访问的数据不存在,
接下来就是RDS和缓存的同步问题,保证数据最终会呈现给用户,但是有延迟,功能的延迟和系统雪崩的风险选择,个人比较倾向于后者,

这种方案将数据的查询完全依赖缓存,一旦缓存挂掉,基本系统也就over了,这就依赖缓存的高可用部署了,采用集群或者多集群的方式,提高系统的可用性,剩下的就是和RDS一样的问题,比如防攻击,数据切片等

另外还有一种方案,加锁的方式,对于同一个key进行枷锁,当key 不命中的时候,需要去数据库中去查询然后回写到缓存中,查询已经回写的操作进行加锁,粗暴一点 可以用synchronized直接加锁,最坏的情况,jvm中,某个key的请求的请求 全部block,另外可以用分布式锁的方案,当发现key不命中时向redis中添加一个lock_key,添加方式使用setnx指令,这样同一个key的请求只有一个成功,设置成功的请求,进行查询回写操作,设置失败的请求,建议直接进行返回,不要等待,比较一个服务器的连接数是有限制的,如果太多请求等待的话 会影响其他的正常业务



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [缓存 问题 分析] 推荐:

缓存击穿问题分析

- - 数据库 - ITeye博客
缓存一般作为RDS的前置组件,将常用的资源缓存,用来减少RDS的读取压力,也是诸多系统常用的一种方案,如果允许访问缓存失败直接访问数据库,然后再将数据回写到缓存中,那么就会存在缓存击穿的问题,. 缓存击穿:缓存中的数据未被命中,进而请求直接对数据库进行查询,当大量的类似查询瞬间出现,就会出现数据库的压力爆炸甚至引起数据库的雪崩,本质就是一种缓存失效引发的极端问题.

分布式缓存的一起问题

- - Tim[后端技术]
分布式缓存中为了可用性及高性能的考虑,可以使用如下一种master/slave设计模式. 图中的proxy是逻辑的概念,可以是基于client的包装实现,也可以是独立的proxy服务,但本文大部分是指独立的服务. 为什么cache要使用两个集群((master/slave)来存放. 主要出于可用性及高性能的考虑.

缓存级别与缓存更新问题

- - Float_Luuu的博客
缓存失效问题被认为是计算机科学中最难的两件事之一,这篇文章来自翻译,内容主要包括缓存级别与缓存更新常见的几种模式. 缓存常用来加快页面的加载速度,减少服务器或数据库服务的负载. 缓存应用的常见模式如上图所示:. 检索缓存,尝试查找之前相同请求的执行结果,如果找到了则返回,省去了重新执行的步骤;. 如果缓存未命中,则重新执行计算逻辑并将结果保存至缓存;.

redis超时问题分析

- - 搜索技术博客-淘宝
Redis在分布式应用中占据着越来越重要的地位,短短的几万行代码,实现了一个高性能的数据存储服务. 最近dump中心的cm8集群出现过几次redis超时的情况,但是查看redis机器的相关内存都没有发现内存不够,或者内存发生交换的情况,查看redis源码之后,发现在某些情况下redis会出现超时的状况,相关细节如下.

hibernate一二级缓存,查询缓存,n+1次查询问题

- - 行业应用 - ITeye博客
在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别)、二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题:.

Ajax解决浏览器的缓存问题

- - 博客园_首页
        今天做项目,几乎所有的提交都是通过ajax来提交,我测试的时候发现,每次提交后得到的数据都是一样的,调试可以排除后台. 代码的问题,所以问题肯定是出在前台. 每次清除缓存后,就会得到一个新的数据,所以归根到底就是浏览器缓存问题. 久,终于解决了,在这里总结一下.         我们都知道ajax能提高页面载入的速度主要的原因是通过ajax减少了重复数据的载入,也就是说在载入数据的同时将数据缓存到.

OSCache 缓存重建在 Race Condition 下的 NRE 问题

- - 博客园_旁观者
高并发情况下,使用 OSCache 作为本地缓存中间件的前端服务,日志文件中会出现大量如下错误信息:. 无论你使用哪一种本地缓存中间件,如果你缓存数据片段时设置了过期时间,都需要考虑缓存失效后的缓存重建(repopulate the cache)场景. 进一步必须考虑 Race Condition (同进程下多线程,或不同进程)下如何重建.

缓存系列文章–无底洞问题

- - 并发编程网 - ifeve.com
Facebook的工作人员反应2010年已达到3000个memcached节点,储存数千G的缓存. 他们发现一个问题–memcached的连接效率下降了,于是添加memcached节点,添加完之后,并没有好转. 键值数据库或者缓存系统,由于通常采用hash函数将key映射到对应的实例,造成key的分布与业务无关,但是由于数据量、访问量的需求,需要使用分布式后(无论是客户端一致性哈性、redis-cluster、codis),批量操作比如批量获取多个key(例如redis的mget操作),通常需要从不同实例获取key值,相比于单机批量操作只涉及到一次网络操作,分布式批量操作会涉及到多次网络io.

APP 缓存数据线程安全问题探讨

- - bang’s blog
一般一个 iOS APP 做的事就是:请求数据->保存数据->展示数据,一般用 Sqlite 作为持久存储层,保存从网络拉取的数据,下次读取可以直接从 Sqlite DB 读取. 我们先忽略从网络请求数据这一环节,假设数据已经保存在 DB 里,那我们要做的事就是,ViewController 从 DB 取数据,再传给 view 渲染:.

Redis时延问题分析及应对

- - 博客 - 伯乐在线
Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞;. 当redis的数据量达到一定级别后(比如20G),阻塞操作对性能的影响尤为严重;. 下面我们总结下在redis中有哪些耗时的场景及应对方法;. keys、sort等命令.