缓存常见问题处理

缓存使用过过程中常见问题基本是以下几个问题:

  • 缓存穿透问题
  • 缓存并发问题
  • 热点数据问题
  • 数据一致问题

这些问题不是独立的,一般都会存在因果关系或者同时存在

下面列举一下问题原因及基本解决思路

缓存穿透/过期

缓存穿透问题是指请求数据在缓存中没有找到,导致请求直接打到数据库的情况

这种场景下,大致有两类原因可以导致这类问题:

  • 1.缓存中没有命中,查询数据库,数据库无此数据,不会去更新缓存,这样导致下次同样的请求都会重复这样的请求,每次都会请求数据库
  • 2.由于缓存过期时间设置不合理,导致瞬时大量缓存过期,大量请求直接打到数据库

原因 1 的解决方案:
为数据设置默认值,即使从数据库没有查询到,也设置缓存,之后数据有值了去主动更新缓存

这样虽然可以避免查询一直不存在的数据而导致的缓存穿透问题,但是也容易引起恶意攻击,攻击方式:构造大量无效的条件去查询,这样导致缓存中大量的存在默认缓存,导致缓存占用量急剧增大而引起缓存驱逐,针对这种方式,可以为默认缓存设置一些比较短的过期时间来稍微缓解这一问题,只是缓解,无法完全解决这个攻击

原因 2 的解决方案:

不要设置统一的过期时间,为过期时间添加随机数,让数据过期时间分散开,不要集中在同一时间过期

缓存并发

缓存并发问题是指多个请求请求同一个数据,而且都没有从缓存中获取到数据,并从数据库查询后都去更新缓存,导致缓存重复更新问题
大多数场景下,这个问题影响并不大,只是会产生一些重复的数据库查询和重复更新缓存
但是如果有些缓存不能重复更新,比如一些自动设置的时间、计数器等,那么重复更新会带来问题

这个问题的解决方案:

使用CAS方案,即设置缓存之前先检查是否已经设置了,如果设置过,则不作任何操作
如果是使用redis,则可以直接使用其SETNX命令

热点数据

绝大多数系统中,频繁访问的数据只是一小部分,而受硬件、成本等因素,把所有的数据都放在缓存中也不太现实

这个问题,可以使用日志分析、访问计数等方式统计热点数据,基于历史访问情况刷新TOP-N数据到缓存中,并且不定时的去更新这个TOP-N列表

数据一致问题

这个问题一般比较难弄,只要使用缓存,则必然可能出现缓存不一致的问题,这个问题和使用缓存更新策略有很大的关系,具体问题需要根据不同的缓存更新方式来定制化解决,不能一概而论

这个问题基本思路是使用补偿机制,即使用定时、不定时巡检的方式,刷新缓存数据,保证数据一致性

0%