Advertisement

Redis面经汇总(持续更新ing... ...)

阅读量:

2021.12.04

一、Redis 有哪些特性?

读写性能优异, 读的速度是100000次/s,写的速度是80000次/s

数据持久化,支持RDB 、AOF两种持久化方式

支持事务。通过MULTIEXEC指令包起来

支持多种数据结构类型

主从复制

其他特性:发布/订阅、通知、key过期等

二、Redis 为什么这么快?

完全基于内存,没有磁盘IO上的开销,异步持久化除外

单线程,避免多个线程切换的性能损耗

非阻塞的IO多路复用机制

底层的数据存储结构优化,使用原生的数据结构提升性能

三、Redis 底层的基础数据结构有哪些?

字符串。没有采用C语言的传统字符串,而是自己实现的一个简单动态字符串SDS的抽象类型,并保存了长度信息。

链表(linkedlist)。双向无环链表结构,每个链表的节点由一个listNode结构来表示,每个节点都有前置和后置节点的指针

字典(hashtable)。保存键值对的抽象数据结构,底层使用hash表,每个字典带有两个hash表,供平时使用和rehash时使用。

跳跃表(skiplist)。跳跃表是有序集合的底层实现之一。redis跳跃表由zskiplist和zskiplistNode组成,zskiplist用于保存跳跃表 信息(表头、表尾节点、⻓度等),zskiplistNode用于表示表跳跃节点,每个跳跃表的层高都是1- 32的随机数,在同一个跳跃表中,多个节点可以包含相同的分值,但是每个节点的成员对象必须是唯一的,节点按照分值大小排序,如果分值相同,则按照成员对象的大小排序。

整数集合(intset)。用于保存整数值的集合抽象数据结构,不会出现重复元素,底层实现为数组。

压缩列表(ziplist)。为节约内存而开发的顺序性数据结构,可以包含多个节点,每个节点可以保存一个字节数组或者整数值。

四、Redis 支持哪些数据类型?

答案:五种常用数据类型:StringHashSetListSortedSet。三种特殊的数据类型:BitmapHyperLogLogGeospatial,其中Bitmap 、HyperLogLog的底层都是 String 数据类型,Geospatial 底层是 Sorted Set 数据类型。

字符串对象string:int整数、embstr编码的简单动态字符串、raw简单动态字符串

列表对象list:ziplist、linkedlist

哈希对象hash:ziplist、hashtable

集合对象set:intset、hashtable

有序集合对象zset:ziplist、skiplist

五、Redis 常用的 5 种数据结构和应用场景?

答案:

String:缓存、计数器、分布式锁等

List:链表、队列、微博关注人时间轴列表等

Hash:用户信息、Hash 表等

Set:去重、赞、踩、共同好友等

Zset:访问量排行榜、点击量排行榜等

六、为什么采用单线程?

答案:官方回复,CPU不会成为Redis的制约瓶颈,Redis主要受内存、网络限制。例如,在一个普通的 Linux 系统上,使用pipelining 可以每秒传递 100 万个请求,所以如果您的应用程序主要使用 O(N) 或 O(log(N)) 命令,则几乎不会使用太多 CPU,属于IO密集型系统。

七、Redis 6.0 之后又改用多线程呢?

答案:Redis的多线程主要是处理数据的读写、协议解析。执行命令还是采用单线程顺序执行。

主要是因为redis的性能瓶颈在于网络IO而非CPU,使用多线程进行一些周边预处理,提升了IO的读写效率,从而提高了整体的吞吐量。antirez 在 RedisConf 2019 分享时提到,Redis 6 引入的多线程 IO 对性能提升至少一倍以上。

八、过期键Key 的删除策略有哪些?

答案:有3种过期删除策略。惰性删除、定期删除、定时删除

惰性删除。使用key时才进行检查,如果已经过期,则删除。缺点:过期的key如果没有被访问到,一直无法删除,一直占用内存,造成空间浪费。

定期删除。每隔一段时间做一次检查,删除过期的key,每次只是随机取一些key去检查。

定时删除。为每个key设置过期时间,同时创建一个定时器。一旦到期,立即执行删除。缺点:如果过期键比较多时,占用CPU较多,对服务的性能有很大影响。

九、如果Redis的内存空间不足,淘汰机制?

答案:

volatile-lru:从已设置过期时间的key中,移出最近最少使用的key进行淘汰

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

volatile-ttl:从已设置过期时间的key中,移出将要过期的key

volatile-random:从已设置过期时间的key中,随机选择key淘汰

allkeys-random:从key中随机选择key进行淘汰

no-eviction:禁止淘汰数据。当内存达到阈值的时候,新写入操作报错

volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰(LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到)

allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。

十、Redis 突然挂了怎么解决?

答案:1、从系统可用性角度思考,Redis Cluster引入主备机制,当主节点挂了后,自动切换到备用节点,继续提供服务。2、Client端引入本地缓存(即客户端进行请求的时候,现在本地缓存中查找看是否存在自己需要的数据,如果没有的话再去服务端上获取),通过开关切换,避免Redis突然挂掉,高并发流量把数据库打挂。

十一、Redis 持久化有哪些方式?

1、快照RDB。将某个时间点上的数据库状态保存到RDB文件中,RDB文件是一个压缩的二进制文件,保存在磁盘上。当Redis崩溃时,可用于恢复数据。通过SAVEBGSAVE来生成RDB文件。

SAVE:会阻塞redis进程,直到RDB文件创建完毕,在进程阻塞期间,redis不能处理任何命令请求。

BGSAVE:会fork出一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。

2、只追加文件AOF。以日志的形式记录每个写操作(非读操作)。当不同节点同步数据时,读取日志文件的内容将写指令从前到后执行一次,即可完成数据恢复。

十二、Redis 常用场景

1、缓存,有句话说的好,「性能不够,缓存来凑」

2、分布式锁,利用Redis 的 setnx

3、分布式session

4、计数器,通过incr命令

5、排行榜,Redis 的 有序集合

6、其他

十三、Redis 缓存要注意的七大经典问题?

答案:列举了亿级系统,高访问量情况下Redis缓存可能会遇到哪些问题?以及对应的解决方案。

1、缓存集中失效

2、缓存穿透

3、缓存雪崩

4、缓存热点

5、缓存大Key

6、缓存数据的一致性

7、数据并发竞争预热

十四、Redis 集群方案有哪几种?

答案:

主从复制模式

Sentinel(哨兵)模式

Redis Cluster模式

十五、Redis 主从数据同步(主从复制)的过程?

答案:

1、slave启动后,向master发送sync命令

2、master收到sync之后,执行bgsave保存快照,生成RDB全量文件

3、master把slave的写命令记录到缓存

4、bgsave执行完毕之后,发送RDB文件到slave,slave执行

5、master发送缓冲区的写命令给slave,slave接收命令并执行,完成复制初始化。

6、此后,master每次执行一个写命令都会同步发送给slave,保持master与slave之间数据的一致性

十六、主从复制的优缺点?

答案:

1、优点:

master能自动将数据同步到slave,可以进行读写分离,分担master的读压力

master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求

缺点:

不具备自动容错与恢复功能,master 节点宕机后,需要手动指定新的 master

master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题

难以支持在线扩容,Redis的容量受限于单机配置

十七、Sentinel(哨兵)模式的优缺点?

答案:哨兵模式基于主从复制模式,增加了哨兵来监控自动处理故障

1、优点:

哨兵模式基于主从复制模式,所以主从复制模式有的优点,哨兵模式也有

master 挂掉可以自动进行切换,系统可用性更高

2、缺点:

Redis的容量受限于单机配置

需要额外的资源来启动sentinel进程

十八、Redis Cluster 模式的优缺点?

答案:实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

1、优点:

无中心架构,数据按照slot分布在多个节点

集群中的每个节点都是平等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

可线性扩展到1000多个节点,节点可动态添加或删除

能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换

缺点:

数据通过异步复制,不保证数据的强一致性

slave充当 “冷备”,不对外提供读、写服务,只作为故障转移使用。

批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好

key事务操作支持有限,只支持多key在同一节点的事务操作,多key分布在不同节点时无法使用事务功能

不支持多数据库空间,一台redis可以支持16个db,集群模式下只能使用一个,即db 0。Redis Cluster模式不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

十九、Redis 如何做扩容?

答案:为了避免数据迁移失效,通常使用一致性哈希实现动态扩容缩容,有效减少需要迁移的Key数量。

但是Cluster 模式,采用固定Slot槽位方式(16384个),对每个key计算CRC16值,然后对16384取模,然后根据slot值找到目标机器,扩容时,我们只需要迁移一部分的slot到新节点即可。

二十、Redis 的集群原理?

答案:一个redis集群由多个节点node组成,而多个node之间通过cluster meet命令来进行连接,组成一个集群。

数据存储通过分片的形式,整个集群分成了16384个slot,每个节点负责一部分槽位。整个槽位的信息会同步到所有节点中。

key与slot的映射关系:

健值对 key,进行 CRC16 计算,计算出一个 16 bit 的值

将 16 bit 的值对 16384 取模,得到 0 ~ 16383 的数表示 key 对应的哈希槽

二十一、Redis 如何做到高可用?

答案:哨兵机制。具有自动故障转移、集群监控、消息通知等功能。

哨兵可以同时监视所有的主、从服务器,当某个master下线时,自动提升对应的slave为master,然后由新master对外提供服务。

二十二、什么是 Redis 事务?

答案:Redis事务是一组命令的集合,将多个命令打包,然后把这些命令按顺序添加到队列中,并且按顺序执行这些命令。

Redis事务中没有像Mysql关系型数据库事务隔离级别的概念,没有像Mysql那样执行事务失败会进行回滚操作。

二十三、Redis 事务执行流程?

答案:通过MULTIEXECWATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。

具体过程:

服务端收到客户端请求,事务以MULTI开始

如果正处于事务状态时,则会把后续命令放入队列同时返回给客户端QUEUED,反之则直接执行这 个命令

当收到客户端的EXEC命令时,才会将队列里的命令取出、顺序执行,执行完将当前状态从事务状态改为非事务状态

如果收到 DISCARD 命令,放弃执行队列中的命令,可以理解为Mysql的回滚操作,并且将当前的状态从事务状态改为非事务状态

WATCH 监视某个key,该命令只能在MULTI命令之前执行。如果监视的key被其他客户端修改,EXEC将会放弃执行队列中的所有命令。UNWATCH 取消监视之前通过WATCH 命令监视的key。通过执行EXEC 、DISCARD 两个命令之前监视的key也会被取消监视。

二十四、Redis 与 本地缓存****有什么区别?

答案:缓存分为本地缓存和分布式缓存。

1、Caffeine、Guava,属于本地缓存,特点:

直接访问内存,速度快,受内存限制,无法进行大数据存储。

无网络通讯开销,性能更高。

只支持本地应用进程访问,同步更新所有节点的本地缓存数据成本较高。

应用进程重启,数据会丢失。

所以,本地缓存适合存储一些不易改变或者低频改变的高热点数据。

2、Redis属于分布式缓存,特点:

集群模式,支持大数据量存储

数据集中存储,保证数据的一致性

数据跨网络传输,性能低于本地缓存。但同一个机房,两台服务器之间请求跑一个来回也就需要500微秒,比起其优势,这点损耗完全可以忽略,这也是分布式缓存受欢迎的原因。

支持副本机制,有效的保证了高可用性。

二十五、如何实现一个分布式锁?

答案:

1、数据库表,性能比较差

2、使用Lua脚本 (包含 SETNX + EXPIRE 两条指令)

3、SET的扩展命令(SET key value [EX][PX] [NX|XX])

4、Redlock 框架

5、Zookeeper Curator框架提供了现成的分布式锁

2021.12.09

二十六、说说什么是Redis?

Redis 全称为:Remote Dictionary Server(远程数据服务),是一个基于内存且支持持久化的高性能 key-value 数据库。具备以下三个基本特征:

多数据类型

持久化机制

主从同步

二十七、Redis的缺点

数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis 适合的场景主要局限在较小数据量的高性能操作和运算上。

Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

二十八、Redis 和 Memcached 的区别有哪些?

Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存其他东西,例如图片、视频等等。

Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,hash等数据结构的存储。

虚拟内存– Redis 当物理内存用完时,可以将一些很久没用到的value 交换到磁盘

分布式–设定 Memcache 集群,利用 magent 做一主多从; Redis 可以做一主多从。都可以一主一从

存储数据安全– Memcache 挂掉后,数据没了;Redis 可以定期保存到磁盘(持久化)

Memcache 的单个value最大 1m , Redis 的单个value最大 512m 。

灾难恢复– Memcache 挂掉后,数据不可恢复; Redis 数据丢失后可以通过 aof 或 rdb恢复

Redis 原生就支持集群模式, Redis3.0 版本中,官方便能支持Cluster模式了, Memcached 没有原生的集群模式,需要依赖客户端来实现,然后往集群中分片写入数据。

Memcached 网络IO模型是多线程,非阻塞IO复用的网络模型,原型上接近于 nignx 。而 Redis使用单线程的IO复用模型,自己封装了一个简单的 AeEvent 事件处理框架,主要实现类epoll,kqueue 和 select ,更接近于Apache早期的模式。

二十九、redis的线程模型

Redis 内部使用文件事件处理器 file event handler ,这个文件事件处理器是单线程的,所以Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket ,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

多个 socket 。

IO 多路复用程序。

文件事件分派器。

事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)。

多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

来看客户端与 Redis 的一次通信过程:
图片

下面来大致说一下这个图:

客户端 Socket01 向 Redis 的 Server Socket 请求建立连接,此时 Server Socket 会产生一个 AE_READABLE 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列 中。文件事件分派器从队列中获取该事件,交给连接应答处理器。连接应答处理器会创建一个 能与客户端通信的 Socket01,并将该 Socket01 的 AE_READABLE 事件与命令请求处理器关 联。

假设此时客户端发送了一个 set key value 请求,此时 Redis 中的 Socket01 会产生 AE_READABLE 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事 件,由于前面 Socket01 的 AE_READABLE 事件已经与命令请求处理器关联,因此事件分派器 将事件交给命令请求处理器来处理。命令请求处理器读取 Socket01 的 set key value 并在自己 内存中完成 set key value 的设置。操作完成后,它会将 Socket01 的 AE_WRITABLE 事件与令 回复处理器关联。

如果此时客户端准备好接收返回结果了,那么 Redis 中的 Socket01 会产生一个AE_WRITABLE 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 Socket01 输入本次操作的一个结果,比如 ok ,之后解除 Socket01 的AE_WRITABLE 事件与命令回复处理器的关联。

三十、为什么 Redis 单线程模型也能效率这么高?

可以从下面5个方面来回答:

C语言实现,效率高

纯内存操作

基于非阻塞的IO复用模型机制

单线程的话就能避免多线程的频繁上下文切换问题

丰富的数据结构(全称采用hash结构,读取速度非常快,对数据存储进行了一些优化,比如亚 索表,跳表等)

三十一、Redis 是单线程的,如何提高多核 CPU 的利用率?

为了最大限度的使用CPU,可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的,所以,如果你想使用多个CPU,你可以考虑一下分片(shard) 。

三十二、RDB的优缺点

优点

灵活设置备份频率和周期。你可能打算每个小时归档一次最近 24 小时的数据,同时还要每天归档一次最近 30 天的数据。通过这样的备份策略,一旦系统出现灾难性故障,我们可以非常容易的进行恢复。

非常适合冷备份,对于灾难恢复而言,RDB 是非常不错的选择。因为我们可以非常轻松的将一个单独的文件压缩后再转移到其它存储介质上。推荐,可以将这种完整的数据文件发送到一些远程的安全存储上去,比如说 Amazon 的 S3 云服务上去,在国内可以是阿里云的 OSS 分布式存储上。

性能最大化。对于 Redis 的服务进程而言,在开始持久化时,它唯一需要做的只是 fork 出子进程,之后再由子进程完成这些持久化的工作,这样就可以极大的避免服务进程执行 IO 操作了。也就是说,RDB 对 Redis 对外提供的读写服务,影响非常小,可以让 Redis 保持高性能。

恢复更快。相比于 AOF 机制,RDB 的恢复速度更更快,更适合恢复数据,特别是在数据集非常大的情况。

缺点

如果你想保证数据的高可用性,即最大限度的避免数据丢失,那么 RDB 将不是一个很好的选择。因为系统一旦在定时持久化之前出现宕机现象,此前没有来得及写入磁盘的数据都将丢失。

所以,RDB 实际场景下,需要和 AOF 一起使用。

由于 RDB 是通过 fork 子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是 1 秒钟。

所以,RDB 建议在业务低估,例如在半夜执行。

三十三、AOF的优缺点

优点

1、该机制可以带来更高的数据安全性

,即数据持久性。Redis 中提供了 3 种同步策略,即每秒同步、每修改(执行一个命令)同步和不同步。

事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。

而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。可以预见,这种方式在效率上是最低的。

至于不同步,无需多言,我想大家都能正确的理解它。

2、由于该机制对日志文件的写入操作采用的是 append 模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。

因为以 append-only 模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。

另外,如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在 Redis 下一次启动之前,我们可以通过 redis-check-aof 工具来帮助我们解决数据一致性的问题。

3、如果 AOF 日志过大,Redis 可以自动启用 rewrite 机制。即使出现后台重写操作,也不会影响客户端的读写。因为在 rewrite log 的时候,会对其中的指令进行压缩,创建出一份需要恢复数据的最小日志出来。在创建新日志文件的时候,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。

4、AOF 包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作 。事实上,我们也可以通过该文件完成数据的重建。

缺点

1、对于相同数量的数据集而言,AOF 文件通常要大于 RDB 文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

2、根据同步策略的不同,AOF 在运行效率上往往会慢于 RDB 。总之,每秒同步策略的效率是比较高的,同步禁用策略的效率和 RDB 一样高效。

3、以前 AOF 发生过 bug ,就是通过 AOF 记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似 AOF 这种较为复杂的基于命令日志/merge/回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有 bug 。不过 AOF 就是为了避免 rewrite 过程导致的 bug ,因此每次 rewrite 并不是基于旧的指令日志进行 merge 的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。

三十四、两种持久化方式如何选择?

bgsave 做镜像全量持久化,AOF 做增量持久化。因为 bgsave 会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要 AOF 来配合使用。在 Redis 实例重启时,会使用 bgsave 持久化文件重新构建内存,再使用 AOF 重放近期的操作指令来实现完整恢复重启之前的状态。

一般来说, 如果想达到非常高的的数据安全性, 你应该同时使用两种持久化功能。如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外, 使用RDB还可以避免之前提到的AOF程序的问题。

三十五、一个字符串类型的值能存储最大容量是多少?

** 512M**

三十六、为什么Redis 事务不支持回滚?

Redis 事务不支持回滚,如果遇到问题,会继续执行余下的命令。这一点和关系型数据库不太一致。这样处理的原因有:

只有语法错误,Redis才会执行失败,例如错误类型的赋值, 这就是说从程序层面完全可以捕获以及解决这些问题

支持回滚需要增加很多工作,不支持的情况下,Redis 可以保持简单、速度快的特性

三十七、如何使用Redis实现分布式锁?

使用redis实现分布式锁的思路:

1、setnx(String key,String value)

若返回1,说明设置成功,获取到锁;

若返回0,说明设置失败,已经有了这个key,说明其它线程持有锁,重试。

2、expire(String key, int seconds)

获取到锁(返回1)后,还需要用设置生存期,如果在多少秒内没有完成,比如发生机器故障、网络故障等,键值对过期,释放锁,实现高可用。

3、del(String key)

完成业务后需要释放锁。释放锁有2种方式:del删除key,或者expire将有效期设置为0(马上过期)。

在执行业务过程中,如果发生异常,不能继续往下执行,也应该马上释放锁。

三十八、Redis和Zookeeper实现的分布式锁有什么区别?

实现方式的不同,Redis 实现为去插入一条占位数据,而 ZK 实现为去注册一个临时节点。

遇到宕机情况时,Redis 需要等到过期时间到了后自动释放锁,而 ZK 因为是临时节点,在宕机时候已经是删除了节点去释放锁。

Redis 在没抢占到锁的情况下一般会去自旋获取锁,比较浪费性能,而 ZK 是通过注册监听器的方式获取锁,性能而言优于 Redis。

没有谁是最好的

对于性能要求很高的建议使用Redis来实现,否则,建议使用Zookeeper来实现。

三十九、如何使用 Redis 实现消息队列?

Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。rpush 和 lpop 结合 或者lpush 和rpop 结合。
图片

客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息,再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。

四十、Redis 哨兵和集群的区别是什么?

Redis 的哨兵作用是管理多个 Redis 服务器,提供了监控、提醒以及自动的故障转移的功能。哨兵可以保证当主服务器挂了后,可以从从服务器选择一台当主服务器,把别的从服务器转移到读新的主机。Redis 哨兵的主要功能有:

集群监控:对 Redis 集群的主从进程进行监控,判断是否正常工作。

消息通知:如果存在 Redis 实例有故障,那么哨兵可以发送报警消息通知管理员。

故障转移:如果主机(master)节点挂了,那么可以自动转移到从(slave)节点上。

配置中心:当存在故障时,对故障进行转移后,配置中心会通知客户端新的主机(master)地址。

Redis 的集群的功能是为了解决单机 Redis 容量有限的问题,将数据按一定的规则分配到多台机器,对内存的每秒访问不受限于单台服务器,可受益于分布式集群高扩展性。

全部评论 (0)

还没有任何评论哟~