EN
/video/87291999.html

9、Redis高频面试题

2025-06-24 12:12:33 来源: 新华社
字号:默认 超大 | 打印 |

1、为什么在项目中使用Redis?

操作速度快:Redis的数据保存在内存中,与其他硬盘类相比,存储,速度要快得多。
丰富的数据类型#xff1a;支持Redis string,list,set,Zset,hash 等数据类型�基本满足我们开发中的各种使用场景。

2、Redis的数据类型是什么?
Redis最常见的数据类型有5种,分别是String、List、Hash、Set、ZSet,下面给大家详细介绍一下:

String:简单的 key-value 类型,最大可以存储512MB数据。场景:计数、缓存文章标题、微博内容等。

List:底层是链表,特点是༚容易添加和删除#xff00c;难以随机访问。场景:发布和订阅或消息队列。

Hash:Hashmap࿰类似于Javac;适用于存储对象。场景:存储系统中的对象数据。

Set:无序集合,求交、并、差集方便。 场景:共同关注、共同粉丝、共同偏好等功能。

ZSet:与set相比,,多了一个权重参数 score,根据score对元素进行排序。场景:各种排名,弹幕消息。

3、为什么Redis这么快?
Redis之所以运行速度快,主要原因如下:。

纯内存操作:Redis的大部分请求都是纯内存操作,非常快速。

单线程:Redis的核心部分是单线程运行,避免不必要的上下文切换,线程切换也不存在这种情况 消耗CPU。

使用 I/O 多路复用模型和非阻塞模型 IO。

什么是 I/O 多路复用。

 I/O多路复用是指使用单个线程监控多个Socketet ,并在Socket可读、可写时收到通知,避免无效等待,充分利用CPU资源。
当前I/O多路复用采用epoll模式实现,在通知用户Socket的过程中,它将,将已准备好的Socket写入用户空间,不需要一个接一个地通过Socket来判断是否就绪,提高了性能。
Redis的网络模型是使用I/O多路复用处理器来处理多个Socket请求,例如,提供连接应答处理器和命令回复处理器,命令要求处理器。
Redis6.0后,为了提高更好的性能,使用多线程处理命令回复处理器中的回复事件,在命令请求处理器中,使用多线程࿰转换命令c;增加命令转换速度,在执行命令时,还是单线程。

4、Redis的持久性方案。
两种数据持久化的方式,分别是RDB和AOF。

RDB全称Redissrdiss Database Backup file(Redis数据备份文件;,也叫Redis数据快照。简单地说,将内存中的所有数据记录在磁盘中。Redis实例故障重启后,快照文件从磁盘读取#xff0c;恢复数据。快照文件称为RDB文件,默认情况下,保存在当前运行目录中。

AOF全称Appendd Only File(追加文件)。在AOF文件࿰中记录Redis处理的每一个写作命令c;可视为命令日志文件。

两者的对比如下:

 。

 。

5、如何确保Redis数据与MySQL一致?
我们使用同步双写或双删 在程序更新并添加MySQL后,立即同步更新redis。

或者在mysql数据发生变化后,直接删除Redis中的数据,什么时候加入缓存?
 。

6、什么是缓存穿透࿰?c; 怎么解决。

缓存穿透是指要求一直在查询数据库中不存在的数据,没有这样的缓存,请求将到达数据库,数据库没有,也不能缓存。

因此,每个请求都会直接在数据库中查询󿀌这很有可能导致数据库被压垮。

有两种常用的解决方案:

1)查询返回的数据为空,这个空结果还在缓存,但是,过期时间应尽可能短。

2)使用布隆过滤器:哈希把所有可能的数据都放到足够大的位置 bitmap 中,一定存在的数据会被这个数据使用 bitmap 拦截,从而避免了对DB的查询。


 。
7、Redis的过期删除策略是什么?
Redis过期删除策略是指Rediskey过期后何时删除的处理方案,常用的删除策略有两种:

惰性删除:只会在取出 key 在过期检查数据࿰之前c;过期后删除。
定期删除:每隔一段时间抽取一批 key删除过期 key 操作。
与#xfff0相比c;定期删除内存更友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 定期删除+惰性/懒汉删除。

8、Redis的内存淘汰策略有哪些?
Redis内存淘汰策略是指当Redis内存已满࿰时c;当需要保存新数据时,还有处理方案,官方提供了8种淘汰策略:no-eviction:禁止驱逐数据󿀌也就是说,当内存不足以容纳新写入数据时,󿀌新写入操作会报错。
volatile-lru:最近最少使用的数据从设定过期时间的数据集中淘汰。
volatile-ttl:淘汰已设定过期时间的数据。
volatile-random:淘汰已设定过期时间的数据集中。
volatile-lfu:从设定过期时间的数据中选择最不常用的数据进行淘汰。
allkeys-lru:最近最少使用的数据在所有数据集中被淘汰。
allkeys-random:选择淘汰所有数据集中的任何数据。
allkeys-lfu:在所有数据集中选择最不常用的数据淘汰。

事实上,我主要记住:最近最少使用的࿰可以删除c;或者提前删除即将到期的。

9、Redis集群有哪些方案?
Redis提供的集群主要有三种,分别是。主从。、。哨兵。和。分片。集群。

主要用于解决Redis并发问题,一般来说,主节点负责数据写入,多个人负责从节点阅读数据,从节点实时同步主节点的数据。

哨兵集群主要用于解决Redis的高可用性问题,哨兵会监控集群中节点的状态,并在主节点出现问题时重新选择主节点。

分片集群主要用于解决Redis海量数据存储问题,它需要多个主节点,然后计算数据中写入的数据会落在其中一个上。

在这个计算过程中,Redis引入了哈希槽的概念,Redis集群有16384个哈希槽,每个 在CRC16验证后,key决定将16384取模放置哪个槽。

分片集群的每个节点都负责一部分 hash 槽,这样就可以计算出哪个节点会出现一个key󿀌查询时也可以同时定位。


10、缓存预热是什么?
缓存预热是指系统启动后󿀌将相关缓存数据提前加载到缓存系统。

避免在用户请求时,首先查询数据库󿀌然后是数据缓存问题,用户可以直接查询预热的缓存数据。

如果没有预热,那么 Redis 初始状态数据为空,系统启动初期󿀌高并发流量,都会访问数据库,对数据库造成流量压力。

缓存预热解决方案主要有以下几个:

当数据量不大时,工程启动时进行加载缓存动作。
当数据量大时,设置定时任务脚本,刷新缓存。
当数据量过大时,优先保证热点数据提前加载到缓存。

 。

11、什么是缓存击穿࿰?c;怎么解决。
在我们的项目中,将缓存放在数据库前,查询时首先检查缓存,如果有缓存,就不用查数据库,这样可以大大减轻数据库的访问压力。

缓存击穿是指设置过期时间的key,在其缓存失效的瞬间,有很多访问这个的请求,如果在缓存中找不到这些请求,将直接访问数据,导致数据库被压垮。

有两种常用的解决方案:

使用互斥锁:当缓存失效时,xff00c;不要立即到数据库查询,取而代之的是获得一个全局锁󿀌该线程获得,去数据库查询,如果拿不到,就等重试查询缓存。

修改设置key有效期的逻辑,一般如下:

设置key时,不要设定过期时间,相反,在缓存中单独设置一个过期字段。

查询时,从redis中取出数据后,判断时间是否过期c;如果过期,打开另一个线程进行数据同步,当前线程正常返回数据。

 。

12、什么是缓存雪崩,怎么解决。
缓存将存储在我们项目的数据库前࿰中c;查询时首先检查缓存,如果有缓存,就不用查数据库,这样可以大大降低数据库的访问压力。

缓存雪崩是指大量key在某一时刻同时失效,所有这样大量的请求都转发到DB,DB 雪崩瞬间压力过大。

解决方案也很简单󿀌设置key过期时间,尽量添加一些随机值,这样,缓存过期时间的重复率就会降低。

13、你用过Redis事务吗?
Redis本身就没有事务的概念,但是他有几个命令可以结合起来实现类似事务的效果。也就是说󿀌Redis事务的本质是一组命令的集合。

这里使用的命令主要有5个,分别是:

MULTI:用于组装事务。
EXEC:执行一件事。
DISCARD:取消一项事务。
WATCH:用来监视一些key,一旦这些key在事务执行前发生变化󿀌事务的执行将被取消。
UNWATCH:取消 WATCH 监控所有key的命令。
总结:Redis事务是一次性、顺序性、排他性地执行一个队列中的一系列命令。Reids,单命令原子性执行,但事务不保证原子性󿀌而且没有回滚。

【我要纠错】责任编辑:新华社