1.常见数据类型以及使用场景
-
String类型可以缓存短信验证码 并设置过期时间
-
Hash类型可以存储一些对象
-
list存储队列
-
Set 缓存点赞功能, 用户关注, 以及查看好友共同关注
-
ZSet 实现缓存点赞排行榜
2.缓存穿透
缓存穿透雪崩,击穿都是在大量并发请求的情况下发生的 缓存穿透 是指我们通过去查询一个不存在的数据的时候,从redis查不到,进而去数据库也查不到,然后每次请求都打到了数据库,缓存就是去了意义。
解决方案一般有两种, 一种是当查询到不存在的数据情况下,我们给它返回一个null值进行缓存, 并且设置过期时间, 这种方案可以预防缓存穿透。 但是比如在某些情况下 用户去redis 中查询, 但是查询的是null,此时数据库已经添加新数据了, 就会造成数据不一致。
还有另一种解决方案是布隆过滤器
它主要是二进制,存储的是0和1 ,还有一些下标表示位置
我们将数据存入到布隆过滤器中,才能判断是否存在。存入的时候要通过哈希算法计算数据的哈希值,通过哈希值
确定存储到哪个位置。通过哈希运算 是有哈希冲突的, 所以我们进行三次哈希运算。 增加一个存在的可能性。
布隆过滤器能够一定判断数据不存在,但是不能够用来判断数据一定存在。
3.缓存击穿
缓存击穿就是某个热点数据的key突然过期,导致一瞬间大量的请求打在数据库上,就会造成一个类似于单点击穿的效果,对数据库造成很大的压力,甚至会压垮数据库
解决方案一般有两种
给这个热点数据设置一个永不过期的key
使用互斥锁,可以使用 redisson 实现的分布式锁, 当redis中查不到数据的时候i,不会立刻去查询数据库,而是先获取到锁之后再 查询数据库,这样其他线程就会进入到阻塞的情况下。 可以防止缓存击穿
4.缓存雪崩
有两种情况,一种是大量的key 集体过期, 一种是redis 服务器宕机了。
缓存雪崩就是大量不同的 key 设置了相同的过期时间, 一旦到达过期时间点。这些key集体失效,造成访问这些 key 的请求全部进入到数据库当中。
解决方案是给key设置过期时间的时候加上一个随机时间。
redis服务器宕机可以通过 搭建高可用的集群来避免。 或者通过熔断降级来进行处理。
5.Key的命名规范
我一般会遵循一个
基本格式 业务名称:数据名:id
例如 登陆业务保存用户信息的key login:user:10
好处:
可读性强
避免key冲突
方便管理
不要包含特殊字符
6.Redisson锁
redsison分布式锁: redisson分布式锁是redis推出解决分布式问题的锁方案,他可以实现锁重入,锁重试,超时释放,主从一致 可重入: 采取hash结构,v存放线程id和锁重入次数,获取锁时,先判断锁是否存在,不存在则创建锁,填入线程id和锁标识为1,当在下一个方法内再次获取锁,判断锁已经存在,再判断线程标识是否为自己的,是自己的则锁计数器+1;不是自己的则获取锁失败。 释放锁时,先判断线程id是否为自己的,是再判断锁计数器是否为0,不为0则证明还有其他线程在使用,把计数器-1,重置锁过期时间。然后等下一个方法执行完,判断锁线程标识是否为自己的,是则判断锁计数器是否为0,是则可以删除锁。这时其他线程才可以获取锁。 锁重试: redisson源码分析: 调用尝试获取锁时,传入三个参数(锁重试时间,锁超时时间(不设置才会开启看门狗机制),时间单位) 线程获取锁,成功返回null,获取锁失败返回锁的剩余有效期;讨论获取失败情况:返回锁剩余有效期后,拿当前时间-获取锁之前的时间,得到获取锁所用掉的时间。再使用最大等待时间(锁重试时间)-获取锁用掉的时间等于剩余的等待时间, 如果剩余等待时间<0,证明已经过去锁重试时间了,就获取锁失败; 如果剩余等待时间>0,就还可以再次去尝试获取锁,但不是立即执行, 而是先去订阅拿到锁的线程id,当该线程释放锁时会收到通知;然后等待订阅结果,等待时长为锁的剩余的等待时间, 若在等待时长过了还没收到订阅结果,则取消订阅,不再重试,获取锁失败 如果在等待时长内收到了订阅结果,就可以去尝试再次获取锁,还先再去计算一遍剩余等待时间,>0则去获取 锁超时: 在锁重试过程中,如果持有锁的线程在执行任务时锁到期释放了,则会被其他线程获取到锁,造成线程不安全问题,因此需要引入看门狗机制,看门狗默认的锁过期时间为30s,当执行业务时间超过10s,则会触发一个延时任务,给锁重新赋值30s有效期;当锁释放时,取消更新时间任务,发送锁释放信号,再删除锁。
7.Redis的数据过期策略
惰性删除,在设置key过期时间后,不去管他,当需要key 的时候,检查是否过期,如果过期就删除
定期删除,每个一段时间对一些key进行检查,将过期的删除
Redis是两种策略配合使用的
8.Redis的数据淘汰策略
redis默认是不删除数据,内存不足直接报错
一种是最近没有使用的时间较长的key会被淘汰
一种使用频率较低的key会被淘汰
我们用的是没有使用的时间较长的key会被淘汰