logo头像

生而无畏,战至终章

分布式缓存

分布式会话是如何实现

缓存穿透、缓存并发、缓存失效

缓存机制,这里的机制指的是缓存加载、缓存击穿、缓存雪崩这些机制及其相关应对方案,用过Redis、MemCache的最好理解一下它们的原理或者缓存提供的一些高级功能,集群如何实现

  • 缓存穿透
    一般在项目中使用缓存通常都是先检查缓存中是否存在数据,若存在直接返回,不存在在查询数据库,这时如果查询的某一数据一直不存在,就会造成每一次请求都会去查询DB,这样就失去了缓存的意义,在高并发阶段,DB可能会直接挂掉,那如何解决这个问题?
    解决方案:可以将整个不存在的key预先指定一个值(”&&”),在返回这个&&值的时候,我们的应用就可以认为这是不存在的key,那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作,如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中

缓存并发
有时候在高并发情况下,如果一个缓存失效了,可能会出现多个进程查询DB,同时设置缓存的情况,这可能造成DB压力过大,还有缓存频繁更新的情况
这个时候可以对缓存查询加锁,如果key不存在,就加锁,然后查询DB入缓存,在解锁;其他进程发现有锁就等待解锁

缓存失效
并发很高时可能会出在某一个时间同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重
那如何解决这些问题呢?
其中的一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。