Redis,全称 Remote Dictionary Server,是一个基于内存的高性能 Key-Value 数据库。html
另外,Redis 已经成为互联网公司在缓存组件选择的惟一,更多的关注点是,如何使用好 Redis 。java
一、速度快node
由于数据存在内存中,相似于 HashMap ,HashMap 的优点就是查找和操做的时间复杂度都是O (1) 。git
Redis 本质上是一个 Key-Value 类型的内存数据库,很像Memcached ,整个数据库通通加载在内存当中进行操做,按期经过异步操做把数据库数据 flush 到硬盘上进行保存。github
由于是纯内存操做,Redis 的性能很是出色,每秒能够处理超过 10 万次读写操做,是已知性能最快的 Key-Value 数据库。面试
二、支持丰富数据类型redis
支持 String ,List,Set,Sorted Set,Hash 。算法
Redis 的出色之处不只仅是性能,Redis 最大的魅力是支持保存多种数据结构,此外单个 Value 的最大限制是1GB,不像 Memcached只能保存1MB的数据,所以Redis能够用来实现不少有用的功能。比方说:数据库
- 用他的 List 来作 FIFO 双向链表,实现一个轻量级的高性能消息队列服务。
- 用他的 Set 能够作高性能的 tag 系统等等。
三、丰富的特性缓存
而且在 Redis 5.0 增长了 Stream 功能,一个新的强大的支持多播的可持久化的消息队列,提供相似 Kafka 的功能。
四、持久化存储
Redis 提供 RDB 和 AOF 两种数据的持久化存储方案,解决内存数据库最担忧的万一 Redis 挂掉,数据会消失掉。
因为 Redis 是内存数据库,因此,单台机器,存储的数据量,跟机器自己的内存大小。虽然 Redis 自己有 Key 过时策略,可是仍是须要提早预估和节约内存。若是内存增加过快,须要按期删除数据。
另外,可以使用 Redis Cluster、Codis 等方案,对 Redis 进行分区,从单机 Redis 变成集群 Redis 。
若是进行完整重同步,因为须要生成 RDB 文件,并进行传输,会占用主机的 CPU ,并会消耗现网的带宽。不过 Redis2.8 版本,已经有部分重同步的功能,可是仍是有可能有完整重同步的。好比,新上线的备机。
修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个过程当中,Redis 不能提供服务。
一、Redis 支持复杂的数据结构
也由于 Redis 支持复杂的数据结构,Redis 即便往于 Memcached 推出,却得到更多开发者的青睐。
Redis 相比 Memcached 来讲,拥有更多的数据结构,能支持更丰富的数据操做。若是须要缓存可以支持更复杂的结构和操做,Redis 会是不错的选择。
二、Redis 原生支持集群模式
三、性能对比
更多关于性能的对比,能够看看 《Memcached 与 Redis 的关键性能指标比较》 。
四、内存使用效率对比
若是 Redis 采用 hash 结构来作 key-value 存储,因为其组合式的压缩, 其内存利用率会高于 Memcached 。
Redis 和 Memcached 的内存管理方法不一样,Redis 采用的是包装的 malloc/free , 相较于 Memcached 的内存管理方法 tcmalloc / jmalloc 来讲,要简单不少 。
五、网络 IO 模型
TODO 有点看不懂,找亚普表弟确认中。
六、持久化存储
也推荐阅读下 《脚踏两只船的困惑 - Memcached 与 Redis》 。
艿艿:这个是我从网络上找的资料,讲的灰常不错。
redis 内部使用文件事件处理器 file event handler
,这个文件事件处理器是单线程的,因此 redis 才叫作单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
多个 socket 可能会并发产生不一样的操做,每一个操做对应不一样的文件事件,可是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
来看客户端与 redis 的一次通讯过程:
AE_READABLE
事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给链接应答处理器。链接应答处理器会建立一个能与客户端通讯的 socket01,并将该 socket01 的 AE_READABLE
事件与命令请求处理器关联。set key value
请求,此时 redis 中的 socket01 会产生 AE_READABLE
事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,因为前面 socket01 的 AE_READABLE
事件已经与命令请求处理器关联,所以事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 key value
并在本身内存中完成 key value
的设置。操做完成后,它会将 socket01 的 AE_WRITABLE
事件与令回复处理器关联。AE_WRITABLE
事件,一样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操做的一个结果,好比 ok
,以后解除 socket01 的 AE_WRITABLE
事件与命令回复处理器的关联。这样便完成了一次通讯。😈 耐心理解一下,灰常重要。若是仍是不能理解,能够在网络上搜一些资料,在理解理解。
一、纯内存操做。
Redis 为了达到最快的读写速度,将数据都读到内存中,并经过异步的方式将数据写入磁盘。因此 Redis 具备快速和数据持久化的特征。
若是不将数据放在内存中,磁盘 I/O 速度为严重影响 Redis 的性能。
二、核心是基于非阻塞的 IO 多路复用机制。
三、单线程反而避免了多线程的频繁上下文切换问题。
Redis 利用队列技术,将并发访问变为串行访问,消除了传统数据库串行控制的开销
四、Redis 全程使用 hash 结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
Redis 提供了两种方式,实现数据的持久化到硬盘。
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操做过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换以前的文件,用二进制压缩存储。
AOF持久化以日志的形式记录服务器所处理的每个写、删除操做,查询操做不会记录,以文本的方式记录,能够打开文件看到详细的操做记录。
RDB存在哪些优点呢?
RDB又存在哪些劣势呢?
AOF的优点有哪些呢?
AOF的劣势有哪些呢?
两者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),仍是愿意写操做频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再作备份(rdb)。rdb这个就更有些 eventually consistent 的意思了。
RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,咱们也能够经过配置文件来修改Redis服务器dump快照的频率,在打开6379.conf文件以后,咱们搜索save,能够看到下面的配置信息:
1 2 3 |
save 900 1 # 在900秒(15分钟)以后,若是至少有1个key发生变化,则dump内存快照。 save 300 10 # 在300秒(5分钟)以后,若是至少有10个key发生变化,则dump内存快照。 save 60 10000 # 在60秒(1分钟)以后,若是至少有10000个key发生变化,则dump内存快照。 |
AOF持久化配置
在Redis的配置文件中存在三种同步方式,它们分别是:
1 2 3 |
appendfsync always # 每次有数据修改发生时都会写入AOF文件。 appendfsync everysec # 每秒钟同步一次,该策略为AOF的缺省策略。 appendfsync no # 从不一样步。高效可是数据不会被持久化。 |
不要仅仅使用 RDB,由于那样会致使你丢失不少数据
也不要仅仅使用 AOF,由于那样有两个问题,第一,你经过 AOF 作冷备,没有 RDB 作冷备,来的恢复速度更快; 第二,RDB 每次简单粗暴生成数据快照,更加健壮,能够避免 AOF 这种复杂的备份和恢复机制的 bug 。
Redis 支持同时开启开启两种持久化方式,咱们能够综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,做为数据恢复的第一选择; 用 RDB 来作不一样程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可使用 RDB 来进行快速的数据恢复。
若是同时使用 RDB 和 AOF 两种持久化机制,那么在 Redis 重启的时候,会使用 AOF 来从新构建数据,由于 AOF 中的数据更加完整。
通常来讲, 若是想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。若是你很是关心你的数据, 但仍然能够承受数分钟之内的数据丢失,那么你能够只使用 RDB 持久化。
有不少用户都只使用 AOF 持久化,但并不推荐这种方式:由于定时生成 RDB 快照(snapshot)很是便于进行数据库备份, 而且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此以外,使用 RDB 还能够避免以前提到的 AOF 程序的 bug。
在 Redis4.0 版本开始,容许你使用 RDB-AOF 混合持久化方式,详细可见 《Redis4.0 之 RDB-AOF 混合持久化》 。也所以,RDB 和 AOF 同时使用,是但愿达到安全的持久化的推荐方式。
BGSAVE 原理:
重要知识:
Redis 的过时策略,就是指当 Redis 中缓存的 key 过时了,Redis 如何处理。
Redis 提供了 3 种数据过时策略:
在 Redis 中,同时使用了上述 3 种策略,即它们非互斥的。
想要进一步了解,能够看看 《关于 Redis 数据过时策略》 文章。
Redis 内存数据集大小上升到必定大小的时候,就会进行数据淘汰策略。
Redis 提供了 6 种数据淘汰策略:
具体的 每种数据淘汰策略的定义,和 如何选择讨论策略,可见 《Redis实战(二) 内存淘汰机制》 。
Redis LRU 算法
另外,Redis 的 LRU 算法,并非一个严格的 LRU 实现。这意味着 Redis 不能选择最佳候选键来回收,也就是最久未被访问的那些键。相反,Redis 会尝试执行一个近似的 LRU 算法,经过采样一小部分键,而后在采样键中回收最适合(拥有最久未被访问时间)的那个。
具体的能够看看 《使用 Redis 做为一个 LRU 缓存》 文章。
MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?
艿艿:这个是从网络上找到的一个神奇的问题,而且看了答案以后,以为有点莫名的对不上。
因此,感受这个问题的目的是,如何保证热点数据不要被淘汰。
在 「Redis 有哪几种数据“淘汰”策略?」 问题中,咱们已经看到,“Redis 内存数据集大小上升到必定大小的时候,就会进行数据淘汰策略。” 。
那么,若是咱们此时要保证热点数据不被淘汰,那么须要选择 volatile-lru 或 allkeys-lru 这两个基于 LRU 算法的淘汰策略。
相比较来讲,最终会选择 allkeys-lru 淘汰策略。缘由是,若是咱们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者咱们不太清楚咱们应用的缓存访问分布情况,咱们能够选择 allkeys-lru 策略。
Redis 回收进程如何工做的?
理解回收进程如何工做是很是重要的:
因此咱们不断地穿越内存限制的边界,经过不断达到边界而后不断地回收回到边界如下(跌宕起伏)。
若是大量的 key 过时时间设置的过于集中,到过时的那个时间点,Redis可能会出现短暂的卡顿现象。
通常须要在时间上加一个随机值,使得过时时间分散一些。
若是你是 Redis 普通玩家,可能你的回答是以下五种数据结构:
若是你是 Redis 中级玩家,还须要加上下面几种数据结构:
若是你是 Redis 高端玩家,你可能玩过 Redis Module ,能够再加上下面几种数据结构:
另外,在 Redis 5.0 增长了 Stream 功能,一个新的强大的支持多播的可持久化的消息队列,提供相似 Kafka 的功能。😈 默默跟面试官在装一波。
Redis 可用的场景很是之多:
详细的介绍,能够看看以下文章:
请用 Redis 和任意语言实现一段恶意登陆保护的代码,限制 1 小时内每用户 Id 最多只能登陆 5 次。
用列表实现,列表中每一个元素表明登录时间,只要最后的第 5 次登录时间和如今时间差不超过 1 小时就禁止登录。
具体的代码实现,能够看看 《一道 Redis 面试题》 。
使用比较普遍的有三个 Java 客户端:
Redisson
Redisson ,是一个高级的分布式协调 Redis 客服端,能帮助用户在分布式环境中轻松实现一些 Java 的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。
Jedis
Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持。
Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,Jedis 功能较为简单,不支持字符串操做,不支持排序、事务、管道、分区等 Redis 特性。
Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者可以将精力更集中地放在处理业务逻辑上。
Lettuce
Lettuce 是一个可伸缩线程安全的 Redis 客户端。多个线程能够共享同一个 RedisConnection 。它利用优秀 Netty NIO 框架来高效地管理多个链接。
Redis 官方推荐使用 Redisson 或 Jedis 。
Spring Boot 2.x 内置使用 Lettuce 。
方案一:set 指令
先拿 setnx 来争抢锁,抢到以后,再用 expire 给锁加一个过时时间防止锁忘记了释放。
因此,咱们可使用 set 指令,实现分布式锁。指令以下:
1 |
SET key value [EX seconds] [PX milliseconds] [NX|XX] |
SET key value EX seconds NX
命令,尝试得到锁。方案二:redlock
set 指令的方案,适合用于在单机 Redis 节点的场景下,在多 Redis 节点的场景下,会存在分布式锁丢失的问题。因此,Redis 做者 Antirez 基于分布式环境下提出了一种更高级的分布式锁的实现方式:Redlock 。
具体的方案,胖友能够看看老友飞哥的两篇博客:
对比 Zookeeper 分布式锁
因此,没有绝对的好坏,能够根据本身的业务来具体选择。
通常使用 list 结构做为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。
到这里,面试官暗地里已经对你竖起了大拇指。可是他不知道的是此刻你却竖起了中指,在椅子背后。
固然,实际上 Redis 真的真的真的不推荐做为消息队列使用,它最多只是消息队列的存储层,上层的逻辑,还须要作大量的封装和支持。
另外,在 Redis 5.0 增长了 Stream 功能,一个新的强大的支持多播的可持久化的消息队列,提供相似 Kafka 的功能。
一次请求/响应服务器能实现处理新的请求即便旧的请求还未被响应。这样就能够将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来普遍使用的技术。例如许多 POP3 协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
Redis 很早就支持管道(pipelining)技术,所以不管你运行的是什么版本,你均可以使用管道(pipelining)操做 Redis。
Redis 如何作大量数据插入?
Redis2.6 开始,Redis-cli 支持一种新的被称之为 pipe mode 的新模式用于执行大量数据插入工做。
具体可见 《Redis 大量数据插入》 文章。
和众多其它数据库同样,Redis 做为 NoSQL 数据库也一样提供了事务机制。在Redis中,MULTI / EXEC / DISCARD / WATCH 这四个命令是咱们实现事务的基石。相信对有关系型数据库开发经验的开发者而言这一律念并不陌生,即使如此,咱们仍是会简要的列出 Redis 中事务的实现特征:
一、在事务中的全部命令都将会被串行化的顺序执行,事务执行期间,Redis 不会再为其它客户端的请求提供任何服务,从而保证了事物中的全部命令被原子的执行。
二、和关系型数据库中的事务相比,在 Redis 事务中若是有某一条命令执行失败,其后的命令仍然会被继续执行。
三、咱们能够经过 MULTI 命令开启一个事务,有关系型数据库开发经验的人能够将其理解为 "BEGIN TRANSACTION"
语句。在该语句以后执行的命令都,将被视为事务以内的操做,最后咱们能够经过执行 EXEC / DISCARD 命令来提交 / 回滚该事务内的全部操做。这两个 Redis 命令,可被视为等同于关系型数据库中的 COMMIT / ROLLBACK 语句。
四、在事务开启以前,若是客户端与服务器之间出现通信故障并致使网络断开,其后全部待执行的语句都将不会被服务器执行。然而若是网络中断事件是发生在客户端执行 EXEC 命令以后,那么该事务中的全部命令都会被服务器执行。
五、当使用 Append-Only 模式时,Redis 会经过调用系统函数 write 将该事务内的全部写操做在本次调用中所有写入磁盘。然而若是在写入的过程当中出现系统崩溃,如电源故障致使的宕机,那么此时也许只有部分数据被写入到磁盘,而另一部分数据却已经丢失。
Redis 服务器会在从新启动时执行一系列必要的一致性检测,一旦发现相似问题,就会当即退出并给出相应的错误提示。此时,咱们就要充分利用 Redis 工具包中提供的 redis-check-aof 工具,该工具能够帮助咱们定位到数据不一致的错误,并将已经写入的部分数据进行回滚。修复以后咱们就能够再次从新启动Redis服务器了。
如何实现 Redis CAS 操做?
在 Redis 的事务中,WATCH 命令可用于提供CAS(check-and-set)功能。
假设咱们经过 WATCH 命令在事务执行以前监控了多个 keys ,假若在 WATCH 以后有任何 Key 的值发生了变化,EXEC 命令执行的事务都将被放弃,同时返回 nil
应答以通知调用者事务执行失败。
具体的示例,能够看看 《Redis 事务锁 CAS 实现以及深刻误区》 。
Redis 集群方案以下:
关于前四种,能够看看 《Redis 实战(四)集群机制》 这篇文章。
关于最后一种,客户端分片,在 Redis Cluster 出现以前使用较多,目前已经使用比较少了。实现方式以下:
在业务代码层实现,起几个毫无关联的 Redis 实例,在代码层,对 Key 进行 hash 计算,而后去对应的 Redis 实例操做数据。
这种方式对 hash 层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。
选择
目前通常在选型上来讲:
体量较大时,选择 Redis Cluster ,经过分片,使用更多内存。
Redis 集群如何扩容?
这个问题,艿艿了解的也不是不少,建议在搜索有什么方案。
Redis 主从同步
Redis 的主从同步(replication)机制,容许 Slave 从 Master 那里,经过网络传输拷贝到完整的数据备份,从而达到主从机制。
好处
经过 Redis 的复制功,能能够很好的实现数据库的读写分离,提升服务器的负载能力。主数据库主要进行写操做,而从数据库负责读操做。
Redis 主从同步,是不少 Redis 集群方案的基础,例如 Redis Sentinel、Redis Cluster 等等。
更多详细,能够看看 《Redis 主从架构》 。
能够看看 《Redis 哨兵集群实现高可用》 。
能够看看
说说 Redis 哈希槽的概念?
Redis Cluster 没有使用一致性 hash ,而是引入了哈希槽的概念。
Redis 集群有 16384 个哈希槽,每一个 key 经过 CRC16 校验后对 16384 取模来决定放置哪一个槽,集群的每一个节点负责一部分 hash 槽。
由于最大是 16384 个哈希槽,因此考虑 Redis 集群中的每一个节点都能分配到一个哈希槽,因此最多支持 16384 个 Redis 节点。
Redis Cluster 的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点没法通讯的状况下集群仍然可用,因此集群使用了主从复制模型,每一个节点都会有 N-1 个复制节点。
因此,Redis Cluster 能够说是 Redis Sentinel 带分片的增强版。也能够说:
Redis Cluster 方案什么状况下会致使整个集群不可用?
有 A,B,C 三个节点的集群,在没有复制模型的状况下,若是节点 B 宕机了,那么整个集群就会觉得缺乏 5501-11000 这个范围的槽而不可用。
Redis Cluster 会有写操做丢失吗?为何?
Redis 并不能保证数据的强一致性,而是【异步复制】,这意味这在实际中集群在特定的条件下可能会丢失写操做。
Redis 集群如何选择数据库?
Redis 集群目前没法作数据库选择,默认在 0 数据库。
请说说生产环境中的 Redis 是怎么部署的?
重点问题,仔细理解。
这个问题,和 「Redis 集群都有哪些方案?」 是同类问题。
关于以下四个问题,直接看 《Redis 分区》 文章。
可能有胖友会懵逼,又是 Redis 主从复制,又是 Redis 分区,又是 Redis 集群。傻傻分不清啊!
你知道有哪些 Redis 分区实现方案?
Redis 分区方案,主要分红两种类型:
查询路由(Query routing)的意思,是客户端随机地请求任意一个 Redis 实例,而后由 Redis 将请求转发给正确的 Redis 节点。Redis Cluster 实现了一种混合形式的查询路由,但并非直接将请求从一个Redis 节点转发到另外一个 Redis 节点,而是在客户端的帮助下直接 redirect 到正确的 Redis 节点。
分布式 Redis 是前期作仍是后期规模上来了再作好?为何??
以下是网络上的一个大答案:
既然 Redis 是如此的轻量(单实例只使用1M内存),为防止之后的扩容,最好的办法就是一开始就启动较多实例。即使你只有一台服务器,你也能够一开始就让 Redis 以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。
一开始就多设置几个 Redis 实例,例如 32 或者 64 个实例,对大多数用户来讲这操做起来可能比较麻烦,可是从长久来看作这点牺牲是值得的。
这样的话,当你的数据不断增加,须要更多的 Redis 服务器时,你须要作的就是仅仅将 Redis 实例从一台服务迁移到另一台服务器而已(而不用考虑从新分区的问题)。一旦你添加了另外一台服务器,你须要将你一半的 Redis 实例从第一台机器迁移到第二台机器。
推荐阅读 《Redis 几个重要的健康指标》
如何提升 Redis 命中率?
推荐阅读 《如何提升缓存命中率(Redis)》 。
推荐阅读 《Redis 的内存优化》
控制 key 的数量
一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素?
一个 Redis 实例,最多能存放多少的 keys ,List、Set、Sorted Set 他们最多能存放多少元素。
理论上,Redis 能够处理多达 2^32 的 keys ,而且在实际中进行了测试,每一个实例至少存放了 2 亿 5 千万的 keys。
任何 list、set、和 sorted set 均可以放 2^32 个元素。
假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,若是将它们所有找出来?
使用 keys 指令能够扫出指定模式的 key 列表。
一、Master 最好不要作任何持久化工做,如 RDB 内存快照和 AOF 日志文件。
二、Master 调用 BGREWRITEAOF 重写 AOF 文件,AOF 在重写的时候会占大量的 CPU 和内存资源,致使服务 load 太高,出现短暂服务暂停现象。
三、尽可能避免在压力很大的主库上增长从库。
四、主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
。
五、Redis 主从复制的性能问题,为了主从复制的速度和链接的稳定性,Slave 和 Master 最好在同一个局域网内。
和飞哥沟经过后,他们主节点开启 AOF ,从节点开启 AOF + RDB 。
和晓峰沟通后,他们主节点开启 AOF ,从节点开启 RDB 居多,也有开启 AOF + RDB 的。
针对运行实例,有许多配置选项能够经过 CONFIG SET
命令进行修改,而无需执行任何形式的重启。
从 Redis 2.2 开始,能够从 AOF 切换到 RDB 的快照持久性或其余方式而不须要重启 Redis。检索 CONFIG GET *
命令获取更多信息。
但偶尔从新启动是必须的,如为升级 Redis 程序到新的版本,或者当你须要修改某些目前 CONFIG 命令还不支持的配置参数的时候。
有些比较凶残的面试官,可能会问咱们一些 Redis 数据结构的问题,例如:
Skiplist 插入和查询原理?
压缩列表的原理?
Redis 底层为何使用跳跃表而不是红黑树?
跳跃表在范围查找的时候性能比较高。