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

·  阅读 307

一、缓存穿透

简介

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

解决办法

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

二、缓存雪崩

简介

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

解决办法

  1. 将缓存失效/过期的时间分布均匀
  2. 缓存预热:缓存功能上线时,可通过缓存reload机制,预先去更新缓存,在即将放生大并发前手动触发加载缓存不同的key。比如:开发人员在上线时,自己手动点击一下,对相关数据进行缓存
  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. 转载本文请注明出处
分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改