我所知道的缓存知识--缓存需要考虑的问题及解决办法

缓存中需要注意以下问题:

1. 热点数据

   热点数据的特点就是,请求量大,机器的负载高。缓存失效时造成缓存穿透从而可能出现雪崩

   解决的方法可以是:

   a.部署更多的从缓存,将请求负载到不同的从缓存中

   b.客户端/代理端存储一份热点数据。

   c.设置不过期缓存(可能造成数据不一致)

  补充:

   d.一个通用的解决思路是,就是在cache的client端做本地LocalCache,当发现热点数据时,直接Cache在Client里。

   e. 对于巨热数据:在Facebook有一招,就是通过多个key_index(key:xxx#N),来获取热点key的数据,其实质也就是把key分散。对于非高一致性要求的高并发读还是可以的。

   f. 把巨热数据的key发布到所有服务器上,每个服务器给对应的key一个别名,比如get key:xxx=>get key:xxx#N

2.大Value数据

  大Value数据的主要问题在于,单个数据大,来回存储时间需要更多的宽带,也更耗时,根据不同缓存组件处理速度也不一样。而且在业务处理中,单个数据大,也意味这解析或处理更耗时。遇到这种情况可以考虑使用多线程实现缓存(如Memcached)来缓存大Value,或者对Value进行压缩,或者将大Value拆分多个小value,客户端再进行查询,聚合

3.数据一致性问题

   对于数据一致问题,db和cache总会出现数据不一致的问题。所以才会出现 BASE理论(最终一致性),CAP理论这些理论。

  类似我在 “我所知道的缓存知识--Cache-Aside && Cache-As-SoR” 文章中说的,我们无法保证db和cache在业务中完成一个同步过程,整个流程是完整的(没有db或者cache的宕机或者更新失败)

 所以对于强一致性的。我可能需要通过canal订阅数据库二进制日志。实现缓存同步更新。或者在更新cache失败的时候,写入失败队列,后台多开几个线程处理,补偿等,或分布式锁

 对于一致不高的。可考虑定期全量更新或设置合理的过期时间

4.缓存命中率问题

  缓存命中率主要是体现缓存的有效性,命中率越高,说明这个key设置的就更合理,命中率低,则可以考虑删除这个key。

 当然分布式算法也会影响命中率,比如轮询和一致性哈希

       轮询的优点:应用Nginx的请求更加均匀,使得每个服务器的负载基本均衡,不会因为热点问题而导致其中一台服务器负载过重

      轮询的缺点:随着机器的增加,缓存的命中率会下降。

     一致性哈希的优点:相同的请求都会转发到同一台服务器,命中率不会因为机器增加而降低

     一致性哈希的缺点:相同的请求会转发到同一台服务器,因此可能造成某台服务器负载过重,

5.雪崩

  雪崩的出现,可能是因为本来工作正常的缓存服务器,突然宕机。而此时有大量的请求。因为缓存失去作用。导致所有的请求都回源查找数据库。数据库服务无法处理这么多请求,最终导致软件挂了,或者服务器宕机。

解决方法有

 (1). 预先测试:预先做好测试,可以防范未然

 (2). 水平切分/垂直切分:将要缓存的数据分布不同的服务器。防止一台服务宕机,所有缓存都失效

 (3). 高可用:在服务宕机之后,可以有备用服务器顶上

 (4). 后端限流并降级:(限制入的流量(类似nginx有这样的设置),同时可以让非核心业务暂停适用或者部分暂停适用 )

 (5). 多级缓存:通过多级缓存,将更多的流量让上层处理。只有小量流入DB

6.缓存穿透

  穿透是某个数据在DB不存在,或者曾经存在。请求无法生成对应的缓存。而有些恶意用户,一直请求本身不存在的数据,导致每次在缓存都找不到数据,都需要去查询DB。还有一种情况。就是缓存突然失效,导致请求指向了DB。而这个问题对于热点数据会非常致命,可能导致雪崩。

解决方法有:

  (1)可以将这个不存在的key预先设定一个值。比如“&&”,在返回&&时候,默认key不存在

  (2)访问量高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况。可以对缓存查询加锁,如果key不存在,就加锁,然后回源,将结果进行缓存,然后解锁。其他进程如果发现有锁就等待。但这个会造成部分请求等待

  (3)双key,主key生成一个附属key来标示数据修改到期时间,然后快到的时候去重新加载数据。缺点是会产生双份数据。而且需要同时控制附属key和key之间的关系。

7.热点发现

   我们无法一开始就知道那些是热点数据,如果知道,DBA的人员一定会先弄一份缓存。推向各个层级。所以我们需要自系统运行过程中,让系统自己去发现那些是访问频率非常高的数据。自动为这种数据生成缓存并推向各个层级(多级缓存)。

 

站在巨人的肩膀上成长,文章思想和经验来自各类大神 参考  《亿级流量网站架构核心技术》 《深入分布式缓存从原理到实践》

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值