redis的缓存击穿,雪崩,穿透&mybaits的一级二级缓存

redis的缓存击穿,雪崩,穿透

穿透:利用不存在的key去攻击,mysql数据库
解决方案:最常见的则是采用布隆过滤器,将所有可能存在的数据hash到一个足够大的bitmap,一个一定不存在的数据会被这个bitmap拦截掉。从减轻数据库的压力。
雪崩:缓存中的很多key失效,导致sql负载过重宕机。就是指采用了相同的过期时间,导致了缓存在某一时刻同时失效,请求转发到db。
解决方案:将缓存的失效时间分散开,比如我们可以在原有的实效时间上增加一个随机值,这样每个缓存的过期时间重复的可能性就会很小。也可以通过加锁或者队列的方式保证缓存的单线程(进程)的写。
击穿:对于设置了过期时间的key,如果这些key可能会在某些时间被高并发访问。是一种非常的“热点”的数据。
解决方案:通过分布式锁来限流。 redis自带的set ex nx 和redission框架既有jedis的功能,又有了juc锁的功能。
常用的是mutex,在缓存失效的时候判断拿出来的值为空,不是立即去load DB 而是先使用缓存工具的某些带成功操作返回值的操作去set一个mutex key当操作返回成功时,再进行load db 的操作并回设缓存;否则就重试整个get缓存的方法。
分布式:第一种分布式锁:redis自带,se ex nx 第二种分布式锁:redission框架,redis的juc实现

问题一:如果在redis中的锁已经过期了,然后锁过期的那个请求又执行完毕,回来删锁,会删了其他线程的锁。
jedis.set(value:“”),为当前线程设置删锁。用uuid给value个值。删锁时,get key拿到lock token然后可以确认删的是自己的锁。。
问题二:如果碰巧在查询redis锁 还没删除锁,在网络传输时锁过期了怎么办?(时间临界时锁被删怎么办)
这个锁一拿到就删。

mybaits的一级二级缓存:

一级缓存作用于sqlsession默认开启,但在spring环境中需要开启事务,
开启spring事务后,当对于相同的查询,会从缓存中返回结果而不是查询数据库。
当进行增删改的时候sqlsession会关闭缓存也会清空。因此对于多次请求,肯定不存在一级缓存。

二级缓存作用于namespace和mapper,默认是关闭的,只要相同的查询sql对优先从缓存区域查找,所以多次请求二级缓存无影响。不同的sqlsession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句。则第一次执行完毕会将数据库中查询的数据写到缓存。第二次查询会从缓存中获取数据,不在去底层数据库查询,从而提高效率。
在这里插入图片描述

spring 事务:就是用来确保数据的完整性和一致性

四个特性ACID:
Atomicity原子性:事务是一个原子操作,由一系列动作组成,事务的原子性确保动作要么全部执行要么完全不起作用。
Consistency一致性:一旦事务完成(不管成功还是失败)系统必须确保它所建模的业务处于一致的状态,而不是部分完成或失败。
lsolation隔离性:由于许多事务会同时处理相同的数据,因此
每个事务度应该与其他事务隔离开
来,防止数据损坏。
Durability持久性:一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中

猜你喜欢

转载自blog.csdn.net/peopleware1/article/details/105776542