一个线上问题引起对缓存MemCache假大空的思考

 

使用MemCache时如何面对假大空的问题。...



线上出现详情页响应速度比正常慢的情况,分析原因,并制定事前、事中、事后的改进方案有n项。

花开n朵,独表一枝:其中有一个老生常谈的问题,在这里再次分享一下:使用MemCache时如何面对假大空的问题:

1)假

难道把数据放在MemCache的内存里还能有假?太不可思议吧?

我这里说的假,是指假象的假,而不是数据本身变假了。

MemCache通过Key/Value来保存数据,Value默认最大的存放数据大小是1MB。如果应用代码试图将大于1MB的数据放在MemCache中,MemCache会大叫太大塞不进呀。最终的结果是没有保存到缓存中,导致缓存没有起到作用。这就是所说的使用缓存的假象:以为使用缓存了,实际没使用,导致最终会从数据库读取数据,增大数据库的并发与压力

从下图和文字说明中,可以看出MemCache存放数据的模型:

 


 
  • MemCache将内存空间分为一组slab
  • 每个slab下又有若干个page,每个page默认是1M,如果一个slab占用100M内存的话,那么这个slab下应该有100个page
  • 应该可以理解为什么MemCache存放的value大小是限制的,因为一个新数据过来,slab会先以page为单位申请一块内存,申请的内存默认最多就只有1M,所以value大小自然不能大于1M


2)大

这里说的大是指将大批量数据作为一个数据块整体放入MemCache中,也就是说将一组数据通过一个Key放入MecCache中。虽然数据大小本身没有超过1MB的,但数据的条目多(几百条、几千条或上万条数据),这时候容易引起的问题包括:

  1. 当这个Key的数据达到缓存设置的过期时间时,整块数据都失效。如果这个数据本身有几千条上万条,这些数据缓存同时失效,那线上读取这些明细数据的请求都会同时到达数据库,增大数据库的并发与压力。
  2. 这个大数据块中的某一项数据被修改或删除时,若更新缓存机制不合理,也会导致整个大数据块被清理,同样也出现数据缓存同时失效的问题,那线上读取这些明细数据的请求都会同时到达数据库,增大数据库的并发与压力。
 

3)空

应用代码在预热或加载缓存时,容易出现的一个问题:当Key对应的Value数据有值时,都能将这个Key/Value正常放入缓存中。但Key对应的Value数据为空时,往往忽视了,该Key没有放入缓存。这时候容易引起的问题包括:

  1. 当正常用户访问请求这个没有Value的Key时,因为这个Key不在缓存中,应用代码会访问数据库,增大数据库的并发与压力。
  2. 当非正常用户(比如攻击者的大量请求)访问请求这个没有Value的Key时,因为这个Key不在缓存中,应用代码会访问数据库,并且因为是攻击流量,会显著增大数据库的并发与压力,甚至会引起整个数据库的稳定。


总结

总之,通过使用缓存中假大空的分析,大家在设计、开发和运维过程中,都需要对缓存的数据内容和缓存形式做严谨的分析,采用合适的策略,保证线上系统的高可用性与高性能

关注微信公众号:


    关注 能成事儿


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册