作者处于学习阶段,刚刚完成redis的学习,作为学生,我会用更通俗的说法,来叙述自己对redis的了解。愿各位大佬看到有见解错误的地方和叙述不好的地方,能够帮忙纠正。来帮助大家更加深入的了解redis。
一、
1 何为缓存穿透?
我们平时的访问顺序是,先查询缓存是否存有数据。如果有,则展示。如果没有则查询数据库,查询到数据后展示,并储存到缓存当中。
当访问缓存时,会携带一个key值。当key值不存在时,就会访问数据库。但是本身数据库就不会存放该key值,就会无限访问数据库。可能会导致数据库崩塌。比如:根据用户id查询用户信息,但是该id值不存在,黑客就会根据这一点,直接穿透你的缓存,无限制的访问数据库,大量的查询数据库,导致数据库崩塌。
2 缓存穿透图解
3 解决方案
实际情况下,我们发现有不合法的url多次访问后,我们首页要做的解决方法,肯定是报警。但是万一发现的晚了,也可能会造成不可挽回的后果。所以我们一定要有自己的解决方案,做一定的处理方案。
3.1 对空值缓存
就是当在数据库查不到数据时,也会对其进行缓存。一般设置过期时间会比较短。但是这种一般都是临时处理。
3.2 设置白名单
将可以存在的key存到bitmap中。当访问时,若key在bitmap中,则存在。不在bitmap中,则不存在。
3.3 实时监控
就是当服务器出现多次不合法的url访问后,运维人员直接将对应用户加入到黑名单中,让其不再能够发送请求。
二、缓存击穿
1 何为缓存击穿?
当缓存中某个数据到达了过期时间,并且该Key值成为了这段时间非常热门的话题。当大量的请求高并发的查询该key值时,都会查询不到该数据。都会查询到数据库当中,原本数据库很清闲,突然的压力和高并发,就会导致数据库的崩溃,但是redis缓存没有出现异常。
举例:在EDG夺冠时,就会有大量的词条。如EDG夺冠,如果此时缓存过期,就会导致无法查询到数据,反而去大量访问数据库,导致数据库崩坏。
2 缓存击穿图解
3 缓存击穿的解决方案
①预先设置热门数据
在redis高访问前,预判到会出现的热门数据,增加其过期时长。如提前观看LOL全球总感觉赛、偷偷跟踪明星发现其八卦事件、提前为自己服务器的数据库算一卦,当然上述是开玩笑所说,只是给大家的学习增加乐趣。
②实时监测
检测热门的数据,将其过期时间设长。
③使用锁
使用锁的话,需要图片解释才能够解释全面。该图片为高并发情况下排它锁的使用方式。
三、缓存雪崩
1 何为缓存雪崩
当缓存中出现大量数据过期,而此时,访问过来的请求全部访问这些过期数据。就会有大量的请求到达数据库,导致数据库压力瞬间增大,导致数据库被压垮,甚至压垮整台服务器。可能有人会有疑惑,为何数据库压垮会影响到整个服务器,其实数据库的操作就是I/O操作,也会涉及到整台服务器。
2 缓存雪崩图解
3 缓存雪崩的解决方案
①设置多层缓存,就是不仅仅放jedis一层缓存,多放,就能起到缓冲和保护的作用。
②用锁,但是众所周知,只要用锁,就会降低效率。可能会使大量操作无法进行,无法应对高并发的场景。
③设置过期更新缓存,就是过期后实时的更新。有人可能会说,那直接设置永久不就可以了吗?首先这是一个很危险的过程。要考虑到内存问题,而且永久后,不再像数据库要数据,数据库更新后,缓存中还是曾经的数据。
④缓存失效时间分散开,将其设置的过期时间不同,就不会出现同时过期大量数据的现象。