Redis面试题全套整理,想刷题的朋友看这篇就差不多了
- 问答
- 2025-12-30 15:19:28
- 3
(引用来源:知乎专栏)
Redis是什么? Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的Key-Value数据库,它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等类型。
Redis的数据类型 这个是面试必问的,上面提到了,Redis支持多种数据类型,不仅仅是简单的Key-Value存储。
- String(字符串):这是最基础的类型,一个Key对应一个Value,可以是字符串、整数或者浮点数,可以做简单的加减操作,比如用来存缓存、计数器啥的。
- Hash(哈希):类似于Java里的Map,是一组键值对的集合,特别适合用来存储对象,比如把一个用户的信息(姓名、年龄、城市)存成一个Hash,而不是把每个字段都拆成单独的String,这样管理起来更方便。
- List(列表):就是一个简单的字符串列表,按插入顺序排序,你可以从左边(头部)或者右边(尾部)添加元素,常用作消息队列,或者最新消息排行这种场景。
- Set(集合):是String类型的无序集合,里面的元素是唯一的,不能重复,可以用来存共同好友、标签系统等,支持交集、并集、差集操作。
- Sorted Set(有序集合):和Set类似,也是String类型元素的集合,且不允许重复,但每个元素都会关联一个double类型的分数(score),Redis正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数可以重复,常用作排行榜,比如根据用户分数排序。
Redis的持久化机制 为了防止数据丢失,Redis提供了两种持久化方式,把内存中的数据存到硬盘上。
- RDB(快照):在指定的时间间隔内,将内存中的数据集快照写入磁盘,恢复的时候直接读取快照文件,优点是文件紧凑,恢复速度快,缺点是可能会丢失最后一次快照之后的数据。
- AOF(追加文件):记录每次写的操作命令,以日志的形式追加到一个文件里,当Redis重启时,会重新执行AOF文件中的命令来恢复数据,优点是数据安全性高,最多丢失一秒的数据,缺点是AOF文件通常比RDB文件大,恢复速度慢。
Redis的过期键删除策略 就是设置了过期时间的Key,Redis是怎么把它们删掉的。
- 惰性删除:当访问一个Key的时候,Redis会检查它是否过期,如果过期就删除,这样对CPU友好,但可能会留下很多已经过期但再也没被访问的Key,浪费内存。
- 定期删除:Redis会每隔一段时间(默认100ms)随机抽取一些设置了过期时间的Key,检查并删除其中已过期的,通过限制删除操作的时长和频率来减少对CPU的影响。
缓存穿透、缓存击穿、缓存雪崩 这是处理缓存时常见的三个问题,也是面试高频题。
- 缓存穿透:指查询一个根本不存在的数据,缓存和数据库都不会命中,如果大量这样的请求过来,会给数据库造成巨大压力,解决方案:对不存在的Key也缓存一个空值(设置短一点的过期时间);或者使用布隆过滤器提前拦截。
- 缓存击穿:指一个非常热点的Key在失效的瞬间,大量请求同时涌向数据库,就像在屏障上击穿了一个洞,解决方案:设置热点数据永不过期;或者使用互斥锁,只让一个请求去查数据库,其他请求等待。
- 缓存雪崩:指缓存中大量的Key在同一时间过期,或者Redis服务器宕机,导致所有请求都落到数据库上,造成数据库压力过大甚至崩溃,解决方案:给不同的Key设置随机的过期时间,避免同时失效;或者搭建Redis集群,实现高可用。
Redis为什么这么快?
- 基于内存操作:数据都存在内存里,读写速度非常快。
- 单线程模型:避免了不必要的上下文切换和竞争条件,也不用去考虑各种锁的问题。
- 高效的数据结构:Redis自己实现了一套高效的数据结构,比如简单动态字符串、跳跃表等。
- I/O多路复用:使用epoll等机制,让单个线程能高效处理多个网络连接请求。
Redis的线程模型 Redis是单线程的,主要是指它的网络I/O和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程,像持久化、异步删除、集群数据同步等操作是由额外的线程执行的。
Redis事务 Redis的事务不像关系型数据库那样有ACID属性,它通过MULTI、EXEC、DISCARD、WATCH等命令来实现,事务可以一次执行多个命令,但有以下特点:
- 事务中的所有命令都会按顺序串行化执行,执行过程中不会被其他客户端命令打断。
- 事务不具有原子性,即事务中如果有一条命令执行失败,后面的命令仍然会被执行,没有回滚机制。
如何保证缓存和数据库的双写一致性? 当修改数据时,既要更新数据库,也要更新缓存,这个过程中就可能出现数据不一致的情况。 常见的策略有:
- 先更新数据库,再删除缓存:这是一种常用的策略,被称为Cache Aside Pattern,虽然理论上仍有极小的可能出现不一致,但在实践中被认为是可以接受的。
- 先删除缓存,再更新数据库:这种策略在并发情况下容易出现脏数据,不太推荐。
Redis的集群模式 为了应对高并发和海量数据,Redis提供了几种集群方案。
- 主从复制:一个主节点(Master)负责写,多个从节点(Slave)负责读,主节点将数据同步给从节点,实现读写分离和数据备份。
- 哨兵(Sentinel):在主从复制的基础上,增加了哨兵机制,哨兵负责监控主节点的健康状态,当主节点宕机时,能自动将一个从节点升级为新的主节点,实现高可用。
- 集群(Cluster):Redis官方提供的分布式解决方案,采用无中心结构,数据被分片(sharding)存储在多个节点上,每个节点存储一部分数据,通过 gossip 协议进行通信,可线性扩展。
(引用结束)

本文由寇乐童于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/71337.html
