redis浅入学习
- redis穿透
- redis击穿
- redis雪崩
redis穿透
用户想要查询一个数据,发现一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询,发现也没有,于是本次查询失败。当用户很多的时候,缓存没有命中于是都去请求持久层,这会给持久层数据库造成了很大的压力,这时候造成了很大的压力,这时候就相当于出现了缓存穿透。这里有两种处理方式:
缓存空对象:
当储存层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中回去,保护了后端数据源
布隆过滤:
布隆过滤器是一种数据结构,对所有可能查询的参数以参数以hash形式储存,在控制层先进行校验,不符合那么将丢弃
解决方案:可以用缓存空值的方法对无数据的值进行赋空处理。这样使得该数据再一次查询时,我们可以将数据为空返回出去,避免个别用户大量对这个本来没有的数据进行请求,使得数据库崩溃。
redis击穿
缓存击穿问题也叫热点key问题,就是一个被高并发并且缓存重建业务较复杂的key突然失效了,无数的请求访问会瞬间给数据库带来巨大的冲击,可以使用一下两种形式来处理:
互斥锁
用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考考验很大。
当数据查询时,redis缓存存在时直接返回,不存在时先去判断获取锁,当该线程获取成功时,可以执行数据查询操作,并重新构建到redis中,当当前线程获取不到锁时,会再一次去请求这个方法。
逻辑过期
逻辑过期相对于互斥锁少了线程的等待,性能相对而言更加好一点。但是它也有缺点,就是这个不确保数据一致性,当这个数据重新构建时间很长时,数据就会存在数据要经过一段时间才能同步。
大致思路是在数据存入redis时,会跟着塞一个逻辑时间值,当我们去获取这个数据时,会去查询这个数据的逻辑时间是否过期,如果未过期会直接返回参数,过期的话,就开启另外一个线程去查询并跟新这个数据到redis中。
redis雪崩
缓存雪崩是指在同一时间段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案:
给不同的key的TTL添加随机值
利用Redis集群提高服务的可用性
给缓存业务添加将降级限流策略
给业务添加多级缓存