Redis面试题

本文深入探讨Redis面试重点,包括Redis的基本介绍、高性能原因、常见数据结构及其应用、使用场景、缓存问题及解决方案(如缓存雪崩、穿透、并发)以及数据淘汰策略。同时,讲解了Redis的缓存一致性处理、事物机制和持久化方法,为面试和实际操作提供了全面指导。

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

1、简单介绍下redis

NOSQL、基于内存操作、基于C语言编写、K-V结构、可以实现持久化

2、redis为什么那么快

1.C语言编写,C语言靠近机器语言,执行速度快
2.内存存储,内存操作,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
3.单线程,不用进行CPU竞争
4.基于I/O多复用模型,将请求转换成以事件通知形式,默认使用epoll模型

3、redis常用数据结构

1.string:最基本的数据类型,二进制安全的字符串,最大512M。
2.list:按照添加顺序保持顺序的字符串列表。
3.set:无序的字符串集合,不存在重复的元素。
4.sorted set:已排序的字符串集合。
5.hash:key-value对的一种集合。

4、redis使用场景

1.做分布式session使用
2.数据缓存
3.排行榜,计数器等
4.发布/订阅
5.消息队列
6.分布式锁

5、缓存雪崩

数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
解决方案:
1.缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,例如 Redis Sentinel 和 Redis Cluster 都实现了高可用
2.需要对源服务访问进行限流、资源隔离(熔断)、降级等。
3.Redis备份和快速预热
1)Redis数据备份和恢复
2)快速缓存预热
4.提前演练

6、缓存穿透

缓存穿透是指查询一个一不存在的数据。例如:从缓存redis没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:
如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。设置一个过期时间或者当有值的时候将缓存中的值替换掉即可。

7、缓存并发

多个redis的client同时set key引起的并发问题。其实redis自身就是单线程操作,多个client并发操作,按照先到先执行的原则,先到的先执行,其余的阻塞。当然,另外的解决方案是把redis.set操作放在队列中使其串行化,必须的一个一个执行。

8、缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。
这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。
解决思路:
1、直接写个缓存刷新页面,上线时手工操作下。
2、数据量不大,可以在项目启动的时候自动进行加载。

9、Redis的数据淘汰策略
1.定时删除

策略 : 在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。
优点 : 对内存友好,保证过期键会尽可能快地被删除,并释放过期键所占用的内存。
缺点 : 对CPU时间不友好,占用太多CPU时间,影响服务器的响应时间和吞吐量。

2.惰性删除

策略 : 放任过期键不管,每次从键空间读写操作时,都检查键是否过期,如果过期,删除该键,如果没有过期,返回该键。
优点 : 对CPU时间友好,读写操作键时才对键进行过期检查,删除过期键的操作只会在非做不可的情况下进行。
缺点 : 对内存不友好,只要键不删除,就不会释放内存,浪费太多内存,有内存泄漏风险。

3.定期删除

策略 :
对定时删除策略和惰性删除策略的一种整合和折中。每隔一段时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。通过定期删除过期键,有效减少了因为过期键而带来的内存浪费。
难点:确定删除操作执行的总时长和总频率。执行太频繁,执行时间过长,就会退化成定时删除策略,影响客户端请求效率;执行得太少,执行时间太短,会演变为惰性删除,存在内存浪费的情况。
Redis服务器使用惰性删除和定期删除两种策略,通过配合使用,很好地在合理使用CPU时间和避免浪费内存之间取得平衡。
举例:
1)从过期键中随机选取 20 个 key
2)遍历这 20 个 key,并对过期的 key进行删除操作
3)如果过期的 key 比率超过25%,则重复步骤 1
4)同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,增加了扫描时间的上限,默认不会超过 25ms以及频次上线10次。

4.主动清理

当前已用内存超过maxmemory限定时,触发主动清理策略。
清理时会根据用户配置的maxmemory-policy来做适当的清理。
主动清理策略主要有一下六种:
volatile-lru : 从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰。
volatile-ttl : 从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰。
volatile-random : 从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰。
allkeys-lru : 从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
allkeys-random : 从数据集(server.db[i].dict)中任意选择数据淘汰。
no-enviction : 禁止驱逐数据。

10、Redis缓存一致性问题

更新数据库,再删缓存

11、事物实现
  1. 事务开始(以MULTI为标志)
  2. 命令入队(命令一次进入队列)
  3. 事务执行(通过EXEC执行)
12、Redis持久化浅析

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照。
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值