Redis面试题是Java面试题经常考察的,下面就给大家总结了19道Redis常见面试题及答案@mikechen
1.概述你了解的Redis?
Redis,全称是Remote Dictionary Server,是一个开源的内存数据存储系统,它可以用作缓存、消息代理和数据存储。
Redis提供了以下功能和特点:
- 速度快: Redis将数据存储在内存中,因此读写速度非常快。
- 多种数据结构: Redis支持多种数据结构,如字符串、哈希、列表等。
- 持久性: 可以将数据持久化到磁盘上,以便在重启后恢复数据。
- 发布/订阅: 支持发布和订阅消息的模式。
- 事务: 支持事务操作,通过MULTI、EXEC、WATCH等命令实现。
- 集群: 支持分布式集群模式,提高了可用性和扩展性。
2.Redis的数据类型有哪些?
Redis支持多种数据类型,包括字符串、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。
如下图所示:
- 字符串(String): 最基本的数据类型,可以存储任意类型的数据,如文本、数字等。可以执行字符串拼接、递增递减操作等。
- 哈希(Hash): 用于存储键值对集合,类似于关联数组。哈希适用于存储对象的属性集,每个字段代表一个属性,可以单独获取、修改或删除。
- 列表(List): 有序的字符串列表,可以在列表的头部或尾部进行添加、删除操作。可以用于实现消息队列、任务队列等。
- 集合(Set): 无序的字符串集合,不允许重复的元素。可以执行交集、并集、差集等操作,适用于数据去重、关联关系等场景。
- 有序集合(Sorted Set): 与集合类似,但每个成员都关联一个分数,可以用于排序。有序集合常用于排行榜、按分数范围获取数据等。
- 位图(Bitmap): 用于存储位级别的数据,可以进行位操作,如计数、统计等。位图通常用于记录用户签到、在线状态等。
- HyperLogLog: 用于基数估算(集合中不重复元素的数量),可以估算大规模数据的基数,占用空间相对较小。
- 地理空间(Geo): 用于存储地理位置信息和坐标,支持根据距离或位置获取附近的元素。
3.Redis的持久化方式有哪些?
Redis提供两种主要的持久化方式,以确保数据在重启后不会丢失:
1.RDB(Redis Database)快照
RDB是一种将数据库的快照保存到磁盘上的持久化方式,在指定的时间间隔内,Redis将数据的快照保存到一个二进制文件中。
RDB优点:
- 相对于AOF持久化,RDB文件较小,恢复速度较快。
- 适用于数据的定期备份和迁移。
RDB缺点:
如果Redis崩溃,最后一次快照后的数据可能会丢失。
4.什么是Redis哨兵?
Redis Sentinel(哨兵)是Redis的高可用性解决方案,用于监控、管理和自动故障转移Redis主从复制环境中的节点。
如下图所示:
Redis哨兵提供了以下功能:
1.监控
负责监控redis master和slave进程是否正常工作。
2.通知
如果redis实例有故障,报警通知给管理员。
3.自动故障转移
当 主节点 不能正常工作时,Sentinel 会开始一次 自动的 故障转移操作。
4.配置提供者
如果故障转移发生了,通知client客户端新的master地址。
5.什么是Redis主从复制?
Redis主从复制是一种数据复制机制,通过该机制,Redis可以将一个节点的数据自动复制到其他节点。
如下图所示:
在Redis主从复制中,有两个关键角色:
- 主节点(Master): 主节点是数据的源头,负责处理写操作和更新数据。主节点将其数据发送给从节点,以便从节点保持与主节点数据的一致性。
- 从节点(Slave): 从节点复制主节点的数据,负责处理读操作。从节点通过复制主节点的数据,实现数据的备份和读取分担。
6.Redis主从复制的原理?
主从复制的工作流程如下:
- 从节点连接到主节点,并发送SYNC命令。
- 主节点将快照(RDB)或AOF文件中的数据发送给从节点,用于初始化从节点的数据。
- 主节点将写操作发送给从节点,从节点根据写操作来保持与主节点数据的一致性。
7.什么是Redis集群?
Redis集群是一个分布式的Redis环境,用于将数据分片存储在多个节点上,以提高数据处理能力、容量和可用性。
如下图所示:
当我们的存取的时候Redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽。
8.什么是Redis事务?如何实现事务操作?
Redis事务是一系列操作的集合,可以一次性执行并确保这些操作在执行期间不会被其他客户端中断。
事务通过MULTI、EXEC、WATCH等命令实现,如下所示:
MULTI SET key1 "value1" SET key2 "value2" GET key1 GET key2 EXEC
在这个示例中,MULTI开始了事务,然后通过SET命令将两个键的值设置为”value1″和”value2″,然后使用GET命令获取这两个键的值。
最后,EXEC执行事务,如果所有命令成功执行,那么GET命令将返回键的值。
9.Redis的数据淘汰策略有哪些?
Redis有以下几种数据淘汰策略:
- LRU(最近最少使用): 移除最近最少使用的键。
- LFU(最不经常使用): 移除使用频率最低的键。
- TTL(过期时间): 移除已过期的键。
- 随机: 随机选择要移除的键。
10.如何实现分布式锁?
Redis可以通过使用SETNX(SET if Not eXists)命令来实现简单的分布式锁。
// 尝试获取锁 SETNX lock_key 1 // 设置锁的过期时间,防止长时间持有锁 EXPIRE lock_key 10 // 执行业务逻辑 // ... // 释放锁 DEL lock_key
- 使用SETNX设置锁时,如果操作成功(返回1),表示成功获取锁。如果操作失败(返回0),表示锁已被其他客户端持有。
- 要避免锁过期时间设置过短,以防止业务逻辑未执行完就释放了锁。
- 使用DEL命令删除锁键时,要确保只有锁的持有者才能删除,以避免误删。
11.Redis的发布/订阅模式是什么?
发布/订阅模式是Redis的一种消息传递模式,允许多个客户端订阅一个或多个频道,同时可以向这些频道发布消息。订阅者将在有新消息发布到频道时收到通知。
12.什么是缓存雪崩和缓存击穿?如何防止它们?
缓存雪崩: 大量缓存同时失效,导致大量请求直接打到数据库上,引起数据库压力剧增。
缓存击穿: 单个缓存失效,而恰好此时有大量请求访问该键,导致大量请求直接打到数据库上。
防止缓存雪崩的方法包括设置随机的过期时间,使用多级缓存等。防止缓存击穿的方法包括设置互斥锁,使用布隆过滤器等。
13.Redis和Memcached有什么区别?
两者的区别主要分为如下4点:
1)数据结构支持的区别
Redis: Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它更适合处理复杂的数据操作。
Memcached: Memcached只支持简单的键值对结构,不支持复杂的数据类型。
2)持久性支持的区别
Redis: Redis支持数据的持久化,可以将数据保存到磁盘上,以便在重启后恢复数据。
Memcached: Memcached不支持数据的持久化,数据在内存中,重启后数据会丢失。
3)复制和分片的区别
Redis: Redis支持主从复制和分片,可以实现高可用性和扩展性。
Memcached: Memcached没有内置的复制和分片功能,需要通过第三方库或自己实现。
4)性能和功能的区别
Redis: Redis在某些情况下性能稍逊于Memcached,但它提供更多的功能,如事务、发布/订阅、持久性等。
Memcached: Memcached在性能方面相对更优,但功能相对较少。
14.什么是缓存击穿?如何防止缓存击穿?
缓存击穿是指一个非常热门的缓存键失效,导致大量请求直接访问数据库。
为了防止缓存击穿,可以使用布隆过滤器预先判断键是否存在,或者在缓存失效前更新缓存。
15.如何处理Redis中的并发访问问题?
可以使用事务、乐观锁、分布式锁等方法来处理并发访问问题。
16.如何将Redis应用于实时排行榜?
可以使用有序集合数据结构来存储分数和成员,根据分数进行排名。
17.如何使用Lua脚本在Redis中执行复杂操作?
可以使用EVAL命令来执行Lua脚本,这可以在一次通信中实现多个命令。
18.Redis的过期策略是什么?
在Redis中,有两种主要的过期策略:
- 定时删除: 在设置键的过期时间时,Redis会使用定时器来监视键的过期时间,并在键的过期时间到达时删除它。这种策略适用于需要精确控制键的生存时间的情况。
- 惰性删除: 在键被访问时,Redis会检查键是否过期,如果过期则将其删除。这种策略可以避免定时删除的性能开销,但也可能导致过期键在一段时间内仍然存在于数据库中。
19.Redis的性能瓶颈有哪些?
Redis的性能瓶颈通常有以下几个方面:
- 内存: Redis是基于内存的数据库,因此内存容量可能成为性能瓶颈。如果数据量超过可用内存,就会导致内存交换,从而影响性能。
- 单线程: Redis使用单线程模型来处理请求,这可能在高并发情况下成为瓶颈,尤其是在执行复杂计算或大量I/O操作时。
- 持久化: 在持久化过程中,RDB快照和AOF日志都可能导致性能下降,特别是在生成快照时。
- 网络延迟: 如果客户端与Redis之间的网络延迟较高,会影响请求响应时间。
- 键的数据类型和大小: 某些数据类型,特别是大型哈希或列表,可能会导致性能问题,尤其是在进行部分读写操作时。
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》