memcache问题

缓存刷新时间集中问题

  1. 某个缓存失效了,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,会造成数据库服务器崩溃
  2. 需要将缓存失效时间离散分布在访问量比较低的时间段

multiget-hole问题

  • 以用户为例: user-133-age, user-133-name,user-133-height .....N 个 key, 当服务器增多,133 号用户的信息,也被散落在更多的节点, 所以,同样是访问个人主页,得到相同的个人信息, 节点越多,要连接的节点也越多. 对于 memcached 的连接数,并没有随着节点的增多,而降低
  • 把某一组 key,按其共同前缀,来分布.
    比如 user-133-age, user-133-name,user-133-height 这 3 个 key, 在用分布式算法求其节点时,应该以 ‘user-133’来计算,而不是以 user-133-age/name/height 来 计算.
    这样,3 个关于个人信息的 key,都落在同 1 个节点上,访问个人主页时,只需要连接 1 个节点.

永久数据被踢出

  • 引起原因:惰性删除和LRU算法最近最少使用记录删除
  1. 如果 slab 里的很多 chunk,已经过期,但过期后没有被 get 过, 系统不知他们已经过期.
  2. 永久数据很久没 get 了,不活跃,如果新增 item,则永久数据被踢了.
  3. 当然,如果那些非永久数据被 get,也会被标识为 expire,从而不会再踢掉永久数据
  • 解决方案:永久数据和非永久数据分开放

宕机或停服,缓存恢复问题

  • 由于memcached不支持缓存的持久化,所以解决不了停服上线或者大面积宕机时,恢复缓存将是一个痛苦而长久的问题
  • 解决方案:可以采用redis来替代

     

     什么是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

posted on 2018-09-06 17:05  myworldworld  阅读(182)  评论(0)    收藏  举报

导航