memcached常见问题之血崩、穿透

来源:互联网 发布:ssh连接不上linux主机 编辑:程序博客网 时间:2024/05/05 00:16

> 什么是memcached?

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。Memcache服务分为客户端服务端两部分,C/S架构
Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。


>什么是缓存穿透?

 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

或者这种解释更好理解:指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。从而导致对数据库不必要的压力。

 如何避免?

1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

> 什么是缓存血崩?

当缓存服务器重启或数据未加载到缓冲中或者大量缓存集中在某一个时间段大面积失效,这样在失效的时候,导致所有的请求都直接去数据库中查找数据,从而导致数据库cpu和内存负载过高,给后端系统(比如DB)带来很大压力。严重的情况下会出现数据库服务器宕机。大并发的缓存穿透会导致缓存血崩!!

  如何避免?

1、分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。

2、如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。

3、采用一致性哈希算法,这也是目前主流的解决方案。具体详情见:http://blog.csdn.net/czz1141979570/article/details/78259617 










原创粉丝点击