2021SC@SDUSC
分布式缓存
缓存为什么快
缓存是将数据存储在访问速度较高的介质中 能减少数据访问时间,如果结果是运算出来的就可以减少计算时间
缓存的更新策略
缓存需要更新的原因就是,源数据发生了变化,更新策略就是,更新DB,然后设置缓存过期/删除缓存
除Redis系统自带的缓存失效策略,常见采用以下两种:
1:定时去清理过期的缓存;
2:当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
已过期的 key 如果处理?
设置了 expire 的 key 缓存过期了,但是服务器的内存还是会占用,这是因为 redis 所基于的两种删除策略
1:(主动)定时删除:定时随机的检查过期的 key,如果过期则清理删除(每秒检查次数在 redis.conf 中的 hz 配置)
2:(被动)惰性删除:当客户端请求一个已经过期的 key 的时候,那么 redis 会检查这个 key 是否过期,如果过期则删除,返回一个nil,这种策略对 CPU 比较友好,不会有太多的损耗,但是内存占用会比较高 所以,即使 key 过期了,但是只要没有被 redis所清理,那么内存还是占用着的。
缓存存的都是哪些数据
缓存主要存那种热点数据,经常被访问,但不经常被修改
二八定律:80%的访问集中在20%的数据中
缓存降级
暂时屏蔽掉非核心功能,等高峰过去后再打开
缓存预热
在缓存服务器提供服务之前,提前讲热点数据导入斤缓存服务器,这样就不用通过每一次的用户访问重建缓存,重建缓存对系统负载和数据库都会造成负担
缓存热备
缓存热备即当一台缓存服务器不可用时能实时切换到备用缓存服务器,不影响缓存使用。集群模式下,每个主节点都会有一个或多个从节点来当备用,一旦主节点挂点,从节点立即充当主节点使用。
基本原理
hash表
redis内存满了依然可以加入数据,但是会存到硬盘中,严重影响效率,所以redis有缓存淘汰策略,LRU LFU FIFO
缓存雪崩
缓存雪崩:大面积的缓存失效,用户都去数据库进行查询,导致数据库压力太大,服务器宕机
解决方案
1:缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2:如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3:设置热点数据永远不过期。
缓存击穿
缓存击穿:缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发访问同一缓存的用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案
1:热点数据永不过期
2:加互斥锁,排队,让其中一个线程去访问数据库,然后放到缓存里,释放锁,后面的线程就能直接从缓存里取了
缓存穿透
缓存穿透:是指缓存和数据库中都没有的数据,而用户不断发起请求,可能是攻击
解决方案
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击