1.缓存雪崩:是指当系统首次上线或者缓存服务不可用时,所有的请求都直接访问数据库,高并发的情况下会直接将数据库打死,这就是缓存雪崩。
解决方案:1.数据预热:对于系统首次上线,需要将高频访问的数据提前加载到缓存系统中,减少高并发情况下数据未命中缓存而直接打死数据库。2.线上缓存服务要采用集群的方式部署,这样不至于一台机器宕机后整个缓存服务不可用。
2.缓存穿透:是指当每秒5000的并发时,其中4000的请求是恶意的攻击,这4000的请求数据都无法命中缓存,同时也无法命中数据库(例如:查询的id为-1的数据),这样也会将数据库打死。
解决方案:1.对非法数据进行拦截过滤。2.当请求数据在缓存未找到,查询数据库,发现也不存在,这时在缓存中记录一个null或者unknown,并设置较为短暂有效期,这样能保证在下次查询时不会直接访问数据库。另外注意一点就是有效期不能统一,这样会造成在同一时刻所有缓存中数据所有数据失效,从而再次造成缓存穿透甚至缓存雪崩。
3.缓存击穿:是指热点数据瞬间失效后,大量并发请求,直接访问数据库,造成数据库压力。
解决方案:1.设置热点数据永不失效。2.加互斥锁:如果数据未命中缓存,对请求数据加锁,如果加锁成功,则访问数据库,并将数据回写到缓存中;如果该数据加锁失败,则表示已经有请求在查询数据库了,这时候可以sleep 100ms,再查询缓存。