Redis面试题

1.常见数据类型以及使用场景

  1. String类型可以缓存短信验证码 并设置过期时间

  2. Hash类型可以存储一些对象

  3. list存储队列

  4. Set 缓存点赞功能, 用户关注, 以及查看好友共同关注

  5. 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会被淘汰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingZhe1008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值