1:什么是redis穿透?
个人的理解:就是用户请求透过redis去请求mysql服务器,导致mysql压力过载。但一个web服务里,
极容易出现瓶颈的就是mysql(所以才让redis/memcache等去分担mysql 的压力),所以这种问题是万
万要避免的
2:什么是redis血崩?
个人的理解:就是redis服务由于负载过大而宕机,导致mysql的负载过大也宕机,最终整个系统瘫痪
3:什么是redis惊群?
个人的理解:高并发下,由于一个key失效,而导致多个线程去mysql查同一业务数据并存到redis(并发下,
存了多份数据),而一段时间后,多份数据同时失效。导致压力骤增
4:redis穿透如何产生?如何解决?
产生原因:
用户一直请求一个mysql中不存在的数据,由于数据不存在,所以redis一直无法命中。所有的请求就
集中在了mysql。导致压力骤增,最终崩溃
解决方法:
请求一个mysql中不存在的值,往redis中存一个null,并返回空。往后的请求都走redis,不会给
mysql施压
5:redis血崩如何产生?如何解决?
产生原因:
1:高并发下,读写过于频繁
2:同一时间设置的key过多
3:同一时间过期的key过多
解决方法:
1:redis集群,将原来一个人干的工作,分发给多个人干
2:缓存预热
(关闭外网访问,先开启mysql,通过预热脚本将热点数据写入缓存中,启动缓存。开启外网服务)
3:数据不要设置相同的生存时间,不然过期时,redis压力会大
6:redis惊群如何产生?如何解决?
产生原因:
高并发情况下,由与一个缓存数据的失效,导致多个进程去请求同一个数据。一段时间后,多个
数据有在同一时间过期
解决方法:
1:分级缓存(缓存两份数据,第二份数据生存时间长一点作为备份,第一份数据用于被请求命中
,如果第二份数据被命中说明第一份数据已经过期,要去mysql请求数据重新缓存两份数据)
2:计划任务(假如数据生存时间为30分钟,计划任务就20分钟执行一次更新缓存数据)