常见的缓存问题:缓存穿透、缓存雪崩、热点key

1、缓存穿透

简介

  1. 当咱们在缓存中查询不到数据的时候,会去数据库中进行查询,将数据库中查到的数据写入到缓存中,数据库中查询到的数据不写入缓存中,
  2. 这就致使了,一旦咱们一直去查询一个必定不存在的数据(不管是缓存仍是数据库),它就会一直不断的去请求查询数据库,形成数据库请求压力过大,缓存失效
  3. 这种现象被称为“缓存穿透”。

解决办法

  • 举例:当用户去查询“key=dcl”时,数据库中没有此条数据,那么就在缓存中缓存“key=dcl,value=空”,当用户下次再去查询“key=dcl”时,先在缓存中进行exists(key)判断,若是存在就返回“空结果”,若是不存在再到数据库中进行查询。
  • 注意事项:当咱们在数据库中插入“key=dcl”的相关数据时,要对缓存中的相同key进行删除,不然即使数据库中有具体的value值也查询不到;固然咱们也能够设置“空结果”缓存的过时时间

2、缓存雪崩

简介

当咱们的缓存集中在一段时间大量失效的时候,用户查询时会引起大量直接查询数据库的现象,被称为“缓存雪崩”,例如服务器迁移缓存清空或者大量的key在同一时间段过时。算法

解决办法

  1. 将缓存失效/过时的时间分布均匀
  2. 缓存预热:缓存功能上线时,可经过缓存reload机制,预先去更新缓存,在即将放生大并发前手动触发加载缓存不一样的key。好比:开发人员在上线时,本身手动点击一下,对相关数据进行缓存
  3. 考虑加互斥锁进行排队的方式保证缓存的单线程/进程写,从而避免雪崩时大量的并发请求落到数据库上。

3、热点key

简介

当缓存中的某个key访问很是频繁时,是的全部的流量都涌向同一台机器,成为系统的瓶颈,而且一旦该key失效的时,在高并发状况下会有大量的线程来构建缓存,致使负载增长系统崩溃数据库

解决方案

  1. 锁机制:单机状况下用synchronized,lock等,分布式状况下用分布式锁。
  2. 不设置真正的缓存过时时间,在该key的value中去记录过时时间,若是检测到value中的过时时间到了,就去查询该key是否仍是热点key,若是不是对该key进行删除;若是是就更新value中的记录的过时时间。
  3. 设置标签缓存:重点问题重点关注,相似于在value中存储缓存,给热点key设置标签缓存,一旦标签缓存到期就去查询对应的热点key是否仍是热点,并执行相应的操做。
  4. 将热点key分散为多个子key,而后存储到缓存集群的不一样机器上,这些子key对应的value都和热点key是同样的。当经过热点key去查询数据时,经过某种hash算法随机选择一个子key,而后再去访问缓存机器,将热点分散到了多个子key上。

PS:缓存

  1. 文章来自各类资源的整理,若有侵权请告知删除。
  2. 转载本文请注明出处
相关文章
相关标签/搜索