Redis面试题

1. Redis 回收使用的是什么算法?

Redis 使用的是 **LRU(Least Recently Used 最近最少使用)**算法或者可配置的多种淘汰策略进行内存回收,包括但不限于:volatile-lru、allkeys-lru、volatile-random、allkeys-random、volatile-ttl 和 noeviction。

2. 什么是 Redis?

Redis 是一种开源、高性能、基于内存且支持持久化的键值对(key-value)数据库,同时也是一种数据结构服务器,它提供了丰富的数据结构如字符串、哈希、列表、集合、有序集合等,并支持事务、发布/订阅、Lua脚本、LPOP/RPOP 消费队列等功能。

3. Redis 有哪些数据类型?

Redis 提供了多种数据类型,包括但不限于:

  • 字符串(Strings)
  • 列表(Lists)
  • 集合(Sets)
  • 有序集合(Sorted Sets)
  • 哈希表(Hashes)
  • Bitmaps
  • HyperLogLogs
  • 地理位置(Geo)索引半径查询
4. Redis 有哪些优缺点?

优点:

  • 快速:基于内存操作,读写速度非常快。
  • 数据结构丰富:支持多种数据结构,满足不同场景需求。
  • 支持持久化:可通过RDB和AOF两种方式进行数据持久化。
  • 支持主从复制:可用于构建高可用集群。
  • 支持事务:虽然不完全遵循ACID原则,但可以确保一组命令的原子执行。
  • 支持发布/订阅功能:方便构建消息系统。

缺点:

  • 内存限制:若数据量超过内存大小,需要合理配置淘汰策略或增加硬件资源。
  • 不适合大规模数据存储:因为全内存操作,不适合大数据场景,除非结合硬盘存储或外部存储引擎。
  • 单线程模型:虽然简化了数据安全问题,但也意味着无法充分利用多核CPU的计算能力(可以通过多实例部署来缓解)。
5. Redis 回收进程如何工作的?

当Redis的内存达到最大限制时,根据用户配置的内存淘汰策略,会自动删除一些不常用或即将过期的数据来释放内存空间。

6. 使用 Redis 有哪些好处?
  • 提高应用程序性能:通过缓存减少对后端数据库的访问压力。
  • 实现快速的数据共享和交换。
  • 支持复杂的数据结构操作,简化编程逻辑。
  • 用于实时数据处理,例如排行榜、计数器等。
  • 构建高效的消息队列系统。
7. 为什么要用 Redis / 为什么要用缓存?

使用Redis或缓存的主要目的是为了提升系统的响应速度和吞吐量,减轻数据库的压力,以及降低整体系统的延迟。缓存经常访问的数据在内存中,可以大幅减少磁盘I/O开销,尤其适用于那些读多写少的场景。

8. 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?

Redis 提供了 KEYS 命令,但是由于其在大范围搜索时效率低下且可能会阻塞服务器,实际生产环境中应避免使用。对于这种特定场景,建议使用 SCAN 命令配合匹配模式(MATCH 参数)来查找指定前缀的 key。

9. Redis 为什么这么快?

Redis 之所以速度快,是因为以下几个方面:

  • 全内存操作:数据直接存储在内存中,内存的读写速度远超硬盘。
  • 单线程模型:避免了多线程上下文切换带来的开销,但也因此受限于单核性能。
  • 数据结构紧凑:Redis内对数据结构进行了优化,占用较少的内存。
  • 网络IO模型:采用非阻塞IO多路复用技术,能够同时监听多个连接请求。
10. Redis 的应用场景

Redis 的应用场景广泛,包括但不限于:

  • 缓存系统:作为高速缓存层存储热点数据。
  • 计数器系统:比如网页点击数统计、点赞数统计等。
  • 排行榜系统:游戏得分排名、商品销量排行等。
  • 会话存储:保存用户会话信息,替代传统的Session存储。
  • 消息队列:利用List或Stream实现可靠的消息传递。
  • 社交网络:关注/粉丝关系、共同好友等关系数据存储。
11. 为什么要用 Redis 而不用 map/guava 做缓存?

Redis 作为独立的服务进程,相比Java内置的Map或Guava Cache具有以下优势:

  • 分布式支持:Redis可以在多台机器间搭建集群,而本地缓存不具备分布式特性。
  • 容灾恢复:Redis支持持久化和主从复制,即使服务器宕机也能迅速恢复缓存数据。
  • 容量扩展:随着业务增长,Redis可以根据需求横向扩展。
  • 功能丰富:支持更复杂的缓存策略,如过期时间、LRU淘汰等。

(续)

12. 如何选择合适的持久化方式?

在Redis中,有两种主要的持久化方式:RDB (Redis Database) 和 AOF (Append Only File)。

  • RDB持久化:在指定的时间间隔内,Redis会生成数据集的快照(snapshot),该文件是一个经过压缩的二进制文件,适合用于备份和灾难恢复。优点在于恢复速度快,占用空间小;缺点是在两次持久化之间可能有数据丢失风险,且频繁持久化会对系统性能产生一定影响。

  • AOF持久化:每次写操作都会被追加到AOF日志文件中,重启时Redis会重放AOF日志以恢复数据。优点是数据安全性更高,几乎可以做到零数据丢失;缺点是AOF文件通常比RDB文件更大,且在恢复时可能较慢,尤其是AOF开启always同步策略时。

选择哪种持久化方式取决于具体的应用场景和对数据安全性的要求。一般情况下,可以选择混合使用这两种持久化方法,即同时开启RDB和AOF,以兼顾数据安全性与恢复速度。

13. 使用 Redis 做过异步队列吗,是如何实现的?

可以使用Redis的List类型来实现异步队列。基本原理是生产者将任务以LPUSH或RPUSH命令添加到队列的一端,消费者则使用BRPOP或BLPOP命令从队列的另一端取出任务。这样可以实现FIFO(先进先出)或LIFO(后进先出)的队列效果。如果希望实现多消费者公平消费,可以结合Redis的发布/订阅功能或使用Stream数据类型。

14. Redis key 的过期时间和永久有效分别怎么设置?
  • 设置Key的过期时间,使用EXPIREPEXPIRE命令,单位分别为秒和毫秒。

    EXPIRE key seconds
    PEXPIRE key milliseconds
    
  • 若要设置Key永久有效,无需特别设置,因为Redis中Key默认就是永久有效的。但如果之前设置了过期时间,可以通过PERSIST命令移除Key的过期时间,使其变为永久有效。

    PERSIST key
    
15. 过期的数据怎么处理?

Redis会在后台定期检测并清理过期的Key。此外,在每次访问Key时也会检查是否已过期,如果已过期,则立即删除Key,并返回空值给客户端。

16. Redis 如何实现延时队列?

Redis本身并不直接支持延时队列,但可以通过 Sorted Set 结合时间戳作为score来模拟延时队列。也可以使用SET命令结合PEXPIRE命令创建一个带有未来过期时间的Key,到期时会被自动删除,从而实现简单的延时任务。

另外,社区有一些封装好的基于Redis实现延时队列的方案,如使用Redisson库中的DelayedQueue,或自己编写代码逻辑,定时轮询Redis的过期Key。

(续)

17. 持久化

Redis 提供了两种持久化机制,分别是 RDB(Redis DataBase)和 AOF(Append Only File),它们各有优缺点:

  • RDB持久化:Redis会定期保存数据集的快照至磁盘,这种方式在保存时对内存进行序列化操作,然后写入磁盘,适合做周期性备份和快速恢复整个数据集。

  • AOF持久化:将所有的写命令记录到一个日志文件中,重启时重新执行这些命令来恢复数据。AOF持久化可以配置不同的fsync策略以平衡数据安全性和写入性能。

18. Redis 的持久化机制优缺点
  • RDB优点:占用空间相对较小,恢复速度快,适合做冷备。

  • RDB缺点:在两次持久化之间如果有数据更新,则这部分数据在故障时可能会丢失。

  • AOF优点:数据安全性较高,丢失数据概率小,通过配置不同的fsync策略可以调整数据安全性和性能之间的平衡。

  • AOF缺点:AOF文件大小通常大于RDB文件,且在重启恢复时需要加载并执行所有AOF日志命令,这可能耗时较长。

19. Redis 主要消耗什么物理资源?

Redis 主要消耗的是内存资源,因为它是一个以内存为基础的数据库。除此之外,持久化相关的磁盘资源也是重要的考量因素,还有CPU资源,尤其是在进行大量计算型操作或网络通信时。

20. Redis 的内存淘汰策略有哪些?

Redis 提供了多种内存淘汰策略,包括:

  • volatile-lru:仅针对设置了过期时间的键,按最近最少使用原则淘汰。
  • allkeys-lru:不论是否设置了过期时间,都按照LRU原则淘汰。
  • volatile-random:随机删除即将过期的键。
  • allkeys-random:随机删除任意键。
  • volatile-ttl:优先删除即将过期并且TTL较小的键。
  • noeviction:禁止驱逐,当内存不足时拒绝所有写入请求。
21、Redis 持久化数据和缓存怎么做扩容?

redis的持久化数据和缓存扩容主要涉及增加Redis实例的内存容量或者在集群环境下增加节点数量。对于单实例Redis,可以通过增加服务器内存或更换更大内存的服务器来扩容。而对于Redis集群,可以通过以下步骤扩容:

  • 添加新的Redis节点到集群中。

  • 通过Redis Cluster的resharding功能,将原有节点的部分哈希槽(slots)迁移到新节点,从而实现数据在新旧节点之间的重新分布。

  • 如果需要在保持服务在线的情况下进行扩容,可以采用渐进式的迁移策略,逐步将部分数据迁移到新节点。

22、Redis 的过期键的删除策略
  1. 惰性删除(Lazy Expiration)
  • 当客户端尝试访问一个键时,Redis 会先检查这个键是否已过期。
  • 如果键已经过期,Redis 不会返回键值,而是在访问时立即删除这个过期键。
  • 这种方式的优点在于它减少了 CPU 使用率,因为在没有客户端请求的情况下不会主动去扫描和删除过期键。
  1. 定期删除(Periodic Sampling / Active Expire)
  • Redis 默认以一定的频率(并非严格意义上的定时)随机检查一定数量的数据库中的键,看看是否有键已经过期。
  • Redis 服务器内部有一个名为 expire 的定时任务,默认每秒运行10次,每次都会从各个数据库中随机抽取并检查一定数量的键。
  • 这样可以分摊删除过期键的压力,并尽可能确保过期键最终会被删除,防止过期键占用过多内存。
23、Redis 的内存用完了会发生什么?

当Redis内存用完时,根据配置的内存淘汰策略进行数据淘汰。如果没有设置淘汰策略或设置为noeviction,Redis将拒绝执行任何会导致内存超出上限的操作,并返回错误。如果设置了内存淘汰策略(如LRU、LFU等),Redis将根据策略选择并删除部分数据以腾出空间。

24. 什么是事务?

在Redis中,事务是指一系列命令的原子性执行,即这一系列命令要么全部执行成功,要么全部不执行。Redis使用MULTI、EXEC、WATCH等命令来实现事务功能。

25. MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
  • 可以通过监控和分析MySQL访问频率,筛选出访问最频繁的热点数据,将其缓存到Redis中。
  • 设定合理的缓存失效策略,如基于访问频次的LRU淘汰策略。
  • 结合业务特点,对数据进行分层缓存,例如仅缓存近期热门数据或高频查询结果。
  • 使用主动或被动的缓存更新策略,确保Redis中数据的时效性。
26. 事务管理(ACID)概述

ACID是传统数据库管理系统中事务所追求的四个关键性质:

  • Atomicity(原子性):事务作为一个整体不可分割,事务中的所有操作要么全部成功,要么全部失败。
  • Consistency(一致性):事务执行前后,数据保持一致状态,符合应用定义的完整性约束。
  • Isolation(隔离性):多个事务并发执行时,互不影响,如同串行执行。
  • Durability(持久性):一旦事务提交,其结果即使在系统崩溃后也能得到保留。

Redis事务并不能严格遵循ACID中的所有属性,它的原子性体现在EXEC命令下所有操作一次性执行,但不支持回滚,隔离级别也相对较弱,仅提供简单的一致性保证。

27. Redis 如何做内存优化?
  • 选择合适的数据结构,避免浪费内存空间。
  • 使用适当的编码优化内存使用,例如对整数和短字符串类型的优化存储。
  • 合理设置过期时间,及时清除无用数据。
  • 根据业务需求设置合适的内存淘汰策略。
  • 对于大型数据,考虑使用hash、set等集合类型代替多个key存储,减少键的数量。
28. Redis 事务保证原子性吗,支持回滚吗?

Redis事务确实保证原子性,即在EXEC命令执行前的所有命令都被放入队列中,EXEC执行时一起执行或全部不执行。但Redis不支持事务的回滚操作,如果事务中有一个命令执行失败,整个事务将会停止执行,但已经执行成功的命令不会撤销。

29. 哨兵模式

哨兵(Sentinel)模式是Redis高可用性解决方案的一部分,它为Redis集群提供监控、故障转移和配置更新等功能,保证在主节点出现故障时,能自动选举新的主节点并通知客户端,实现Redis服务的高可用。

30. 基于客户端分配

这个问题可能指的是Redis的客户端连接分配策略。在Redis单线程模型下,所有客户端请求都在同一个线程中按顺序执行,客户端连接的分配是自动进行的,不存在显式的分配过程。

31. Redis 线程模型

Redis采用单线程模型处理客户端请求,主线程负责接收请求、解析指令、执行命令、返回结果等操作。尽管是单线程,但由于Redis使用了I/O多路复用技术(如epoll/kqueue),能够在一个线程内同时监听多个socket连接上的事件,使得Redis能够在无锁的情况下高效地处理并发请求。

32. Redis 事务支持隔离性吗

Redis事务并不像传统关系型数据库那样提供强隔离性,它在执行过程中对其他客户端可见,并发环境下可能导致脏读、不可重复读等问题。Redis事务更多的是保证命令执行的原子性,而非严格的ACID中的隔离性。

33. Redis 事务的概念

Redis事务是一组命令的集合,通过MULTI命令开始一个事务,随后将一系列命令放入队列中,最后由EXEC命令触发事务的执行。如果在事务执行前调用了DISCARD,则取消事务,队列中的命令不会被执行。

34. Redis 集群之间是如何复制的?

在Redis集群中,每个节点都有自己的数据分区,复制是基于主从模式进行的。主节点会将数据变更传播给关联的从节点,从而实现数据的备份和冗余。复制过程通过RDB快照和AOF日志增量传输来完成。

35. Redis 事务的三个阶段
  • 开始事务:使用MULTI命令启动一个事务。
  • 命令入队:将一系列Redis命令发送给服务器,此时命令并不会立即执行,而是暂存在服务器内部的事务队列中。
  • 执行事务:使用EXEC命令执行事务队列中的所有命令,若在执行前发送了DISCARD命令,则会放弃执行事务。
36. Redis 事务相关命令
  • MULTI:开始一个事务。
  • EXEC:执行事务队列中的所有命令。
  • DISCARD:取消当前事务,丢弃事务队列中的所有命令。
  • WATCH:监视一个或多个键,当这些键在EXEC执行前被修改,则整个事务会被取消。

(续)

38. Redis 集群最大节点个数是多少?

Redis 集群支持的最大节点数理论上并没有硬性限制,但在实践中,Redis Cluster的总slot数固定为16384个,每个节点至少托管一部分slot,因此节点数不能低于这个值的倍数减一。例如,常见的集群配置可能是将slot均匀分配到6个节点(每个节点约2730个slot)、或16个节点(每个节点约1024个slot)。这意味着你最多可以配置数千个节点,但这样的集群配置并无实用价值,实际部署时通常保持节点数在几十到几百个之间。

39. 官方 Redis Cluster 方案(服务端路由查询)

Redis Cluster采用客户端分片的方式,客户端负责维护集群拓扑结构,发送命令时自动根据Key计算哈希槽(slot),并将命令发送到对应的节点。这意味着服务端并不提供智能路由功能,客户端必须具备发现和路由的能力。

40. 为什么要做 Redis 分区?

Redis分区是为了水平扩展Redis服务的存储能力和处理能力,通过将数据分布到多个节点上,可以突破单个Redis实例的内存和处理能力限制,适应更大的数据量和更高的并发访问需求。

41. 基于代理服务器分片

基于代理服务器的Redis分片是指使用中间件(如Codis、Twemproxy)来进行分片管理和路由,客户端只需要连接到代理服务器,由代理服务器根据分片规则将命令转发到正确的Redis实例上。

42. 说说 Redis 哈希槽的概念?

在Redis Cluster中,使用了哈希槽(Slot)的概念,一共16384个槽位,每个键根据其哈希值被映射到一个唯一的槽位上,集群内的各个节点各自负责一部分槽位。客户端通过计算Key的哈希值确定键所在的槽位进而定位到具体的节点,实现数据在集群中的分布。

43. Redis 集群会有写操作丢失吗?为什么?

在正常情况下,Redis Cluster通过主从复制确保数据的持久性和可靠性,主节点写操作完成后,会将数据同步到对应的从节点。但在发生故障转移期间,如果主节点在向从节点完全复制数据之前就挂掉,且新的主节点被选举出来接受写操作,这种情况可能导致极短暂的写操作丢失。

44. 生产环境中的 redis 是怎么部署的?

在生产环境中,Redis常常以集群形式部署,采用主从复制提供高可用性,有时还会搭配Sentinel(哨兵)进行自动故障检测和切换,或是使用Redis Cluster进行分片以承载大规模数据。同时,为了防止数据丢失,会启用持久化机制如RDB和AOF,并结合合理的内存淘汰策略和安全措施确保服务稳定运行。

45. Redis 集群的主从复制模型是怎样的?

在Redis集群中,每个主节点拥有若干从节点,主节点负责处理客户端的写请求并将数据同步给从节点。主从复制的过程如下:

  1. 主节点在其数据发生变化时,将操作记录在AOF日志或使用RDB快照的形式持久化到磁盘。
  2. 从节点连接到主节点并请求同步数据。
  3. 主节点可以选择全量同步(发送RDB文件)或增量同步(发送AOF日志)给从节点。
  4. 从节点接收到数据后,在本地重建主节点的数据副本,并开始持续监听主节点的写命令流,随时更新自身数据。

在集群中,主从复制主要用于数据备份和故障转移。当主节点出现问题时,Sentinel或者其他集群管理工具可以将从节点晋升为主节点,确保服务的连续性。

46. Redis 是单线程的,如何提高多核 CPU 的利用率?

虽然Redis本身是单线程模型,但可以通过在多台服务器上部署多个Redis实例或在一个服务器上部署多个Redis实例,并通过客户端分片或代理服务器分片的方式将负载分散到多个实例上,从而利用多核CPU资源。另外,Redis Cluster天然支持多实例并行处理,通过分散数据到不同的节点,可以自然地利用多核CPU。

47. Redis 主从架构

Redis主从架构是一种高可用解决方案,它包含一个主节点负责处理写请求,多个从节点负责复制主节点的数据并与主节点保持同步。主节点发生故障时,可以手动或通过Sentinel自动将从节点提升为主节点,以实现故障转移和数据服务的连续性。

48. Redis 实现分布式锁

Redis实现分布式锁通常使用SETNX(Set if Not Exists)命令或者SET命令结合NXPX选项,当多个客户端试图同时获取锁时,只有第一个成功获取锁的客户端能够继续执行,其他客户端则需要等待锁的释放。同时,为了避免死锁,还需要设定锁的超时时间。

49. Redis 官方为什么不提供 Windows 版本?

Redis的开发团队主要面向类Unix操作系统(如Linux、macOS)进行开发和维护,因为Redis的设计和实现依赖于Linux环境下的一些特性,如内存管理、I/O多路复用技术epoll等。虽然Redis可以在Windows上通过Cygwin等环境编译运行,但官方不提供原生Windows支持,主要是考虑到性能、稳定性以及跨平台兼容性问题。

50. Redis 集群如何选择数据库?

Redis集群并不支持选择数据库,因为Redis Cluster的每个节点只有一个数据库,默认数据库编号为0。在Redis Cluster中,数据通过哈希槽进行分布,而不是通过数据库编号,所以集群模式下不提供切换数据库的功能。

51. Redis 如何做大量数据插入?

Redis提供批量插入数据的接口,例如MSETpipeline机制。MSET可以同时设置多个键值对,减少网络交互次数。而pipeline则允许客户端一次性发送多个命令,Redis服务器将在接收到所有命令后再依次执行,进一步提高插入性能。

示例:

  • 使用MSET批量插入:

    MSET key1 value1 key2 value2 ...
    
  • 使用pipeline

    Pipeline pipelined = jedis.pipelined();
    pipelined.set("key1", "value1");
    pipelined.set("key2", "value2");
    // 发送多个命令...
    pipelined.sync();  // 执行管道中的所有命令
    
52. Redis 分区有什么缺点?

Redis分区的缺点主要包括:

  1. 数据迁移困难:在调整分区策略或增加新节点时,需要迁移部分数据,这是一个复杂且耗时的过程。
  2. 复杂的客户端逻辑:客户端需要了解分区规则并负责将请求路由到正确的节点,增加了客户端实现的复杂度。
  3. 分区间数据一致性问题:在处理跨越多个分区的事务或操作时,难以保证全局一致性。
  4. 数据局部性问题:有可能导致热点数据分散在不同节点,造成网络延迟增加和性能下降。
  5. 查询范围操作受限:对需要跨多个分区的大范围查询操作支持不佳,需要客户端合并多个节点的结果。
53. 一个字符串类型的值能存储最大容量是多少?

Redis字符串类型的值最大容量约为512MB(具体数值取决于Redis服务器配置的maxmemory参数和使用的编码格式)。不过,出于性能和资源管理考虑,通常不建议存储如此大的单一值。

54 & 55. 什么是 redis 穿透?

Redis穿透(Cache Miss)是指查询一个不存在于缓存中的Key时,不仅Redis中找不到,连底层数据库也找不到的情况。大量的此类请求会导致缓存无法发挥应有的作用,并可能导致数据库承受额外的负担。解决方法之一是对不命中缓存的请求设置默认值或进行一定的空值缓存策略。

56. 如何解决 Redis 的并发竞争 Key 问题?

解决Redis并发竞争Key问题的方法包括:

  1. 使用乐观锁:通过WATCH命令监视Key,然后执行MULTI/EXEC事务块,如果事务执行期间Key被其他客户端修改,事务将被取消。
  2. 使用分布式锁:例如Redisson提供的RedissonRedLock实现分布式锁,可以确保在多客户端环境下对同一资源的互斥访问。
  3. 幂等设计:确保即使多次执行同一操作,也不会影响最终结果。
57. Redis 和 Redisson 有什么关系?

Redisson 是一个基于 Redis 的高级 Java 客户端,它提供了丰富的数据结构和分布式服务,如分布式锁、信号量、闭锁、队列、map、set等,同时还实现了Cluster、Sentinel、Master-Slave等多种Redis连接模式的支持。Redisson 提供了易于使用的API,使得开发者在处理Redis相关的并发控制、分布式数据结构和分布式服务时更为便捷,极大地简化了Redis在Java项目中的集成和使用。

58. 你知道有哪些 Redis 分区实现方案?

Redis 分区实现方案主要有以下几种:

  1. 客户端分区:客户端负责决定将数据存储到哪个Redis实例。客户端需要维护一份关于分区规则的信息,根据Key计算哈希值来确定存储节点。
  2. 代理分区:通过一个代理服务器(如Twemproxy、Codis)来实现分片,客户端只需连接到代理服务器,由代理服务器根据分片规则透明地将请求转发到相应的Redis实例。
  3. Redis Cluster:Redis 自带的一种分布式解决方案,通过哈希槽(Slot)实现数据分区,并且支持自动发现和故障转移功能,客户端可以直接连接集群中的任何一个节点进行读写操作。
59. 什么是 RedLock?

RedLock 是一种分布式锁的实现方案,由Redis作者Salvatore Sanfilippo提出,旨在提供一种在分布式环境中高度可靠的锁机制。RedLock算法要求客户端在同一时间内尝试在多个独立运行的Redis实例上获取锁,只有当客户端在大多数(例如多数派)Redis实例上成功获取锁并在限定时间内获取所有锁时,才认为锁获取成功。这种方案提高了锁服务的容错性和安全性,即使部分Redis实例发生故障,仍然能保证锁的有效性。

60. 缓存热点 key

热点Key是指在一段时间内被频繁访问的Key,这类Key往往是缓存系统中的核心对象。缓存热点Key的目的在于尽可能减少对后端数据库的访问压力,提高系统的响应速度和吞吐量。

61. Redis 与 Memcached 的区别
  • 数据类型:Redis支持丰富的数据类型,如字符串、哈希、列表、集合、有序集合等,而Memcached仅支持简单的键值对存储。
  • 持久化:Redis支持数据持久化,可以通过RDB或AOF将数据保存到磁盘,而Memcached不支持数据持久化,一旦服务重启,缓存数据就会丢失。
  • 分布式:Redis通过Redis Cluster实现原生的分布式功能,而Memcached需要借助于客户端或其他中间件实现分布式存储。
62. 什么是 redis 雪崩?

Redis雪崩是指在短时间内大量Redis缓存失效或Redis实例宕机,导致所有请求落到了后端数据库,使数据库瞬间承受巨大的压力,可能会引发服务瘫痪。为了避免雪崩,通常需要采取缓存失效的随机化、设置二级缓存、限流、熔断等策略。

63. Redis 常见性能问题和解决方案?
  • 内存碎片:Redis可能出现内存碎片导致内存利用率不高,可通过优化数据结构、执行MEMORY PURGE或重启Redis实例来改善。
  • 过期键集中删除:大量过期键在同一时间被删除可能导致CPU瞬时飙升,可以使用懒惰删除策略或定期删除策略来分散删除操作。
  • 网络延迟:通过合理配置多线程IO模型、调整TCP参数、优化网络架构等方式减少网络延迟对性能的影响。
  • 并发控制:使用Pipeline批量处理命令、正确使用事务和分布式锁以避免并发冲突。
64. 缓存预热

缓存预热是指在系统启动之初或缓存数据失效后,预先将预期会频繁访问的数据加载到缓存中,以减少用户首次请求时的数据库压力。可以通过定时任务、程序启动时主动加载、流量入口处探测加载等方式实现。

65. 缓存降级

缓存降级是在系统遇到极端情况(如缓存服务异常、后端数据库压力过大等)时,暂时牺牲部分功能或性能,以保证核心业务的稳定运行。在Redis中,可以通过设置合理的缓存失效策略、在服务降级时暂时禁用或放宽缓存更新策略、提前准备好兜底数据等方式实现缓存降级。

66. 分布式 Redis 是前期做还是后期规模上来了再做好?为什么?

分布式Redis应在系统设计初期就纳入考虑范畴,这是因为Redis集群的搭建和数据分片策略会影响整个系统的架构设计和开发流程。尽早规划分布式Redis有助于:

  1. 在设计阶段就考虑数据分片、数据分布和一致性问题。
  2. 便于在系统规模逐渐增大时平滑升级,避免大规模迁移数据的风险。
  3. 减少后期改造的成本和风险,保证系统的稳定性和扩展性。
67. 如何保证缓存与数据库双写时的数据一致性?

保证缓存与数据库双写一致性通常采用以下策略:

  1. 先更新数据库,再更新缓存:在写操作时,先将数据持久化到数据库,然后再更新缓存,确保数据最终一致性。同时,需处理好并发写的问题,例如使用分布式锁或乐观锁。
  2. 使用缓存失效策略:在更新数据库的同时,让缓存失效(如设置过期时间),下次读取时重新从数据库加载。
  3. 读写分离:对于读密集型业务,可以引入专门的只读实例,同时保持主从同步,确保缓存和数据库数据最终一致。
68. Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?

Redis支持的Java客户端包括但不限于:

  • Jedis:Redis官方曾经推荐过的Java客户端,轻量级且功能齐全。
  • Lettuce:由Spring团队推荐和支持的Redis客户端,基于Netty,支持连接池和异步操作。
  • Redisson:提供了一系列分布式数据结构和分布式服务的高级Java客户端,适用于复杂的企业级应用。

官方并未明确推荐某一款客户端,开发者可根据项目需求和团队熟悉程度选择合适的客户端。

69. Jedis 与 Redisson 对比有什么优缺点?

Jedis:

  • 优点:轻量级,API简洁明了,社区活跃,支持Redis的大部分功能。
  • 缺点:不支持异步操作,对于长连接的管理较为原始,需要自行管理连接池。

Redisson:

  • 优点:提供了丰富的分布式数据结构和分布式服务,如分布式锁、集合等,支持异步和同步操作,内置连接池管理,对于企业级应用友好。
  • 缺点:相比于Jedis更为重量级,对于只需要简单操作Redis的场景可能存在过度包装的问题。
70. 热点数据和冷数据
  • 热点数据:指访问频率很高的数据,通常会存放在缓存中以提高访问速度和减轻数据库压力。
  • 冷数据:指访问频率较低的数据,通常不需要或者很少存放在缓存中,而是直接从数据库中读取。对于冷数据的管理,重点在于合理归档和清理,避免占用过多存储资源。

相关推荐

  1. Redis面试

    2024-04-11 16:36:07       39 阅读
  2. Redis面试5

    2024-04-11 16:36:07       30 阅读
  3. Redis面试4

    2024-04-11 16:36:07       30 阅读
  4. Redis面试8

    2024-04-11 16:36:07       36 阅读
  5. Redis面试7

    2024-04-11 16:36:07       32 阅读
  6. Redis面试9

    2024-04-11 16:36:07       28 阅读
  7. redis 面试(二)

    2024-04-11 16:36:07       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 16:36:07       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 16:36:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 16:36:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 16:36:07       20 阅读

热门阅读

  1. 2024认证杯数学建模B题思路模型代码

    2024-04-11 16:36:07       14 阅读
  2. web蓝桥杯真题:新鲜的蔬菜

    2024-04-11 16:36:07       14 阅读
  3. Linux系统中安装 RPM 包

    2024-04-11 16:36:07       15 阅读
  4. 服务器的云备份和快照有哪些区别?

    2024-04-11 16:36:07       12 阅读
  5. Web | CSS选择器

    2024-04-11 16:36:07       14 阅读
  6. 头歌-机器学习 第3次实验 DBScan密度聚类方法

    2024-04-11 16:36:07       14 阅读
  7. 数据结构DAY3--栈与队列

    2024-04-11 16:36:07       15 阅读
  8. Objective-C学习笔记(@property,id,instancetype)4.9

    2024-04-11 16:36:07       14 阅读
  9. Unity 安卓将数据保存为json并读取

    2024-04-11 16:36:07       17 阅读
  10. 【代码随想录】day41

    2024-04-11 16:36:07       16 阅读
  11. 蓝桥杯day21刷题日记--接龙序列 动态规划

    2024-04-11 16:36:07       13 阅读