Redis面试题

文章详细阐述了Redis在缓存管理中的应用场景,包括缓存穿透、缓存击穿、缓存雪崩问题及其解决方案。同时,讨论了Redis的数据持久化方法(RDB和AOF),以及数据过期策略,包括惰性删除和定期删除。此外,还介绍了Redis的数据淘汰策略,建议根据业务需求选择合适的策略。最后,提到了Redis在分布式锁场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Redis的使用场景有哪些?

1)缓存

2)分布式锁

3).......

2、什么是缓存穿透?怎么解决?

缓存穿透是指查询一个不存的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查询数据库,容易导致数据宕机

解决方案:

1)缓存空数据,优点是简单,缺点是消耗内存,可能会发生数据不一致的问题

2)布隆过滤器

3、什么是缓存击穿?怎么解决?

缓存击穿是指给某一个key设置了过期时间,当key过期的时候,恰好这时候对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

解决方案:

1)互斥锁,优点是强一致,缺点是性能差

2)逻辑过期,优点是高可用,性能优,缺点是不能保证数据绝对一致

4、什么是缓存雪崩?怎么解决?

缓存雪崩指的是在同一时段内有大量的缓存key同时失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力

解决方案:

1)给不同的key的ttl添加随机值

2)利用Redis集群提高服务的可用性,例如哨兵模式,集群模式

3)给缓存业务添加降级限流策略,作为系统保底策略,例如Nginx、getaway等

4)给业务添加多级缓存


5、Redis作为缓存,数据的持久化是怎么做的?

在Redis中提供了两种数据持久化的方式:1、RDB  2、AOF

 这两种方式,哪种恢复的比较快呢?

RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢失数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令。


6、Redis的数据过期策略

惰性删除:访问key的时候判断是否过期,如果过期则删除

优点:对CPU友好,只会在使用该key的时候才会进行过期检查,对于很多用不到的key不用浪费时间进行检查。

缺点:对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放。

定期删除:定期检查一定量的key是否过期(SLOW模式 + FAST模式)

  • SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,已通过修改配置文件redis.conf的hz选项来调整这个次数
  • FAST模式执行规律不固定,但两次间隔不低于2ms,每次耗时不超过1ms。

优点:可以通过限制删除操作执行的市场和频率来减少删除操作对CPU的影响,另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用!


7、数据淘汰策略-使用建议

数据淘汰策略:当Redis中的内存不够用时,此时向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

Redis支持8种不同策略来选择要删除的key:

  • noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略
  • volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰
  • allkeys-random:对全体key,随机进行淘汰
  • volatile-random:对设置了TTL的key,随机进行淘汰
  • allkeys-lru:对全体key,基于LRU算法进行淘汰
  • volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
  • allkeys-lfy:对全体key,基于LFU算法进行淘汰
  • volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰

1)优先使用 allkeys-LRU策略,充分利用LRU算法的优势,把最近最常访问的数据留在缓存中,如果业务有明显的冷热数据区分,建议使用。

2)如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用 allkeys-random,随机选择淘汰。

3)如果业务中有置顶的需求,可以使用volatile-LRU策略,同时置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据。

4)如果业务中有短时高频访问的数据,可以使用 allkeys-LFU或volatile-LFU策略

8、如何保证Redis中的数据都是热点数据?

可以使用allkeys-LRU(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据。

9、Redis的内存用完了会发生什么?

主要看数据淘汰策略是什么?如果是默认的配置,会直接报错!

10、Redis提供了哪几种数据淘汰策略?

 1.Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错。

2.LRU:最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

3.LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高

平时开发过程中使用的比较多的就是 allkeys-LRU(结合自己的业务场景)

11、哪些场景中使用了redis分布式锁呢?

需要结合项目中的业务进行回答,通常情况下,分布式锁使用的场景是:

集群情况下的定时任务,抢单,幂等性场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开心懒羊羊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值