20200321
redis学习:
redis一般会出现三种问题。雪崩,穿透,击穿。
雪崩(顾名思义,就是一下子崩盘了,就像你的五个队友装备都没起来,直接就让对面上高地把水晶推了):
定义:redis里的key大面积失效,导致用户请求直接访问db数据库,数据库承受不住大并发量而出现崩溃,从而对其他服务产生连带效应,比如用户系统崩溃了,那么其他依赖用户的一些服务也会随之收到影响。
解决办法:
key的失效时间加一个随机值,这样key就不会全部一起失效,从而减少数据库的压力。
设置key的失效时间为永久,如果需要更新,那么刷新一下缓存中的数据,猥琐发育才是王道。
使用分布式部署
穿透(顾名思义,就是穿过某个东西,直接到达目的地,突然想起王者荣耀里的破甲穿透,无视护甲(redis),直接对你进行伤害(db)):
定义:假设数据库的id是从1开始,自增长的,如果这时候有大量的请求使用的id是小于1的,那么这时候请求会略过redis缓存,直接请求到数据库,请求的并发量大的话就会导致数据库崩溃,这就是缓存的穿透。
解决办法:
a.加一些过滤条件,比如判断一下id是否大于0,实际场景根据自己需要去增加一些过滤,比如买个反甲。
b.使用布隆过滤器,他利用高效的数据结构算法计算出你要查的key是否存在数据库,不存在直接返回,存在返回key和value,并刷新缓存。
c.如果从缓存和数据库中都读取不到数据,那么就奖缓存中key对应的value置为null,并设一个短点的失效时间,时间长了也会有其他影响,这样就能防止id暴力攻击了。
击穿(就像敌方知道你是个妹纸,然后敌方的上中下带个辅助五个人同时去围剿你了,呸,游戏体验真不好)
定义:某个key是个热点,然后大并发一直去请求这个key,当这个key瞬间失效的时候,大量数据直接请求db,导致数据库崩溃。
解决办法:
a.设置缓存为永久失效时间。
b.加互斥锁。分布式的话得用分布式锁,然而我也没用过,等我看过了再补充吧。
抄袭别人一段互斥锁代码,意思是:缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。
最后这个我还没太明白,查不到的那个数据是怎么处理的,不用管了吗?如果有小伙伴给我解释一下,那我将感激不尽了。
相关文章: