主要有用途:高性能、高并发、保护数据库
缓存穿透、缓存击穿、缓存雪崩区别
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
缓存穿透
缓存穿透指缓存和数据库中都没有的数据,一般常见黑客攻击,请求用没有的数据直接穿透缓存,打到数据库上,导致数据库挂掉
用户请求数据,例如ID为负数,不存在缓存里,也不存在数据库里,会造成缓存穿透。
解决方案
1、无意义数据放入缓存,下一次相同请求就会命中缓存;
2、IP过滤;
3、参数校验;
4、布隆过滤器(也叫布谷鸟过滤器)
缓存击穿(也叫缓存失效)(单个热点key)
突然该key失效,一瞬间大量该key的请求打到数据库上导致数据库挂掉
指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案
1、用久缓存;
2、分布式锁
a.单体应用—>互斥锁—>zookeeper ,redis实现。
缓存雪崩(多个热点key)
redis缓存key同一时间大量失效,导致大量的请求全部打到数据库,造成数据库挂掉
大量缓存数据同时间失效,导致用户直接发起大量请求到数据库,产生瓶颈。
解决方案
1、生成随机失效的缓存时间数据,让他们不在同一时间失效
2、让缓存节点分布在不同的物理节点上,redis都是集群部署,还可以把热点的key放到不同的节点上去,让这些热点的key平均的分布在不同的节点上
3、不设置缓存失效时间,生成不失效的缓存数据;
4、定时任务更新缓存数据;