缓存的使用场景
- 需要经过复杂运算后得出的数据,存储系统无能为力
- 读多写少的数据,存储系统有心无力
缓存穿透,指缓存没有发挥作用,业务系统虽然去缓存中查询数据,但是缓存中没有数据,业务系统需要再次去存储系统查询数据,通常情况下有两种情况,存储数据不存在,以及生成缓存数据需要大量的时间或资源
缓存雪崩,缓存雪崩指当缓存失效(过期)后引起的系统性能急剧下降的情况,当缓存过期被清除后,业务系统需要重新生成缓存,因此需要再次访问存储系统,再次进行运算,这个处理步骤耗时几十毫秒甚至上百毫秒,对于一个高并发业务来说特别不利,缓存雪崩的的常见解决方案有两种:更新锁机制和后台更新机制
- 更新锁
对缓存更新操作进行加锁保护,保证只有一个线程能进行缓存更新,未能获取到更新锁的线程要么等待锁释放后重新读取缓存,要么返回空值或默认值,对于采用分布式集群的业务系统,由于存在几十上百台服务器,即使单台服务器只有一个线程更新缓存,但是几十上百台服务器一起算下来也会有几十上百个线程同时来更新缓存,同样存在雪崩问题,因此分布式集群的业务系统要完美实现更新锁机制,需要用到分布式锁,如Zookeeper.
- 后台更新
由后台更新线程来更新缓存,而不是由业务线程来更新缓存,缓存本身的有效期设置为永久,后台线程定时更新缓存。后台定时更新机制需要考虑一种特殊场景,当缓存系统内存不够时,会踢掉一些缓存数据,从缓存被踢掉到下一次定时更新缓存这段时间内,业务线程读取缓存返回空值,而业务线程本身又不会去更新缓存,一次业务上看到的现象就是数据丢了,解决的方式有两种:
- 定时读取
- 消息队列通知
缓存热点,虽然缓存系统本身的性能比较高,但是对于一些特别热的数据,如果大部分甚至所有的业务请求都命中同一份缓存数据,则这份数据所在的缓存服务器压力会很大,缓存热点的解决方案就是复制多份缓存,将请求分散到多个缓存服务器上,减轻缓存热点导致的单台缓存服务器的压力