目录
- Redis的常见面试题一(40+个)
-
- 1、什么是 Redis?Redis有什么优势?
- 2、Redis 的数据类型?
- 3、使用 Redis 有哪些好处?
- 4、Redis 相比 Memcached 有哪些优势?
- 5、Memcache 与 Redis 的区别都有哪些?
- 6、Redis 是单进程单线程的?
- 7、一个字符串类型的值能存储最大容量是多少?
- 8、Redis 的持久化机制是什么?各自的优缺点?
- 9、Redis 常见性能问题和解决方案:
- 10、redis 过期键的删除策略?
- 11、Redis 的回收策略(淘汰策略)?
- 12、为什么Redis 需要把所有数据放到内存中?
- 13、Redis 的同步机制了解么?
- 14、Pipeline 有什么好处,为什么要用 pipeline?
- 15、是否使用过 Redis 集群,集群的原理是什么?
- 16、Redis 集群方案什么情况下会导致整个集群不可用?
- 17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
- 18、Jedis 与 Redisson 对比有什么优缺点?
- 19、Redis 如何设置密码及验证密码?
- 20、说说 Redis 哈希槽的概念?
- 21、Redis 集群的主从复制模型是怎样的?
- 22、Redis 集群会有写操作丢失吗?为什么?
- 23、Redis 集群之间是如何复制的?
- 24、Redis 集群最大节点个数是多少?
- 25、Redis 集群如何选择数据库?
- 26、怎么测试 Redis 的连通性?
- 27、怎么理解 Redis 事务?
- Redis事务的生命周期?
- 28、Redis 事务相关的命令有哪几个?
- 29、Redis key 的过期时间和永久有效分别怎么设置?
- 30、Redis 如何做内存优化?
- 31、Redis 回收进程如何工作的?
- 32、都有哪些办法可以降低 Redis 的内存使用情况呢?
- 33、Redis 的内存用完了会发生什么?
- 34、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
- 35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?
- 36、Redis 最适合的场景?
- 37、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
- 38、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
- 39、使用过 Redis 做异步队列么,你是怎么用的?
- 40、使用过 Redis 分布式锁么,它是什么回事?
- Redis的其它提问
-
- 1、Redis的缓存雪崩、穿透、击穿了解么?有什么异同点?分别怎么解决?
- 2、Redis为什么那么快?
- 3、Redis是单线程的,现在使用的服务器都是多核的,那不是很浪费吗?
- 4、Redis单机是有瓶颈的,那你是怎么解决这个瓶颈问题的呢?
- 5、使用以上的集群部署方式,那主从节点之间怎么进行数据交互呢?Redis是怎么进行持久化的?Redis数据都在内存中,一断电或者重启不就什么东西都没有了吗?
- 6、说一下这两种持久化方式的优缺点是什么?
- 7、Redis中还有什么方式可以保证集群高可用?
- 8、主从同步,主从之间的数据是怎么进行同步的?
- 9、数据传输的时候断网了或者服务器挂了怎么办?
- 10、说一下Redis的过期策略。
- 11、为什么不扫描全部设置了过期时间的key呢?
- 同类提问方式
以下总结了关于Redis比较全面的知识笔记以及面试题,方便自己复习的同时希望对大家有所帮助。
Redis的常见面试题一(40+个)
1、什么是 Redis?Redis有什么优势?
Redis是一个高性能的key-value数据库,它是完全开源免费的,遵守BSD协议。
Redis与其它Key-Value缓存产品有以下三个特点:
-
Redis支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
-
Redis不仅仅支持简单的key-value类型的数据,同事还提供了list、set、zset、hash等数据结构的存储;
-
Redis支持数据的备份,即master-slave模式(主从模式)的数据备份。
Redis的优势:
-
性能极高:Redis读取的速度是110000次/s,写的速度是81000次/s;
-
丰富的数据类型:Redis支持二进制案例的String、List、Hash、Set以及zset等数据类型操作;
-
原子性:Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis和其它key-value存储有什么不同?
-
Redis有着更为复杂的数据结构并且提供对它们的原子性操作,这是一个不同于其它数据库的进化路径,Redis的数据类型都是基于数据结构的同时对程序员透明,无需进行额外的抽象。
-
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据进行高速读写时需要权衡内存,因为数据量不能大于硬件内存,在内存数据库方面的另一个优点时:相比在磁盘上相同的复杂的数据结构,在内存操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情,同时在磁盘格式方面它们时紧凑的以追加的方式产生的,因为它们并不需要进行随机访问。
2、Redis 的数据类型?
-
Redis支持五种数据类型:String(字符串)、hash(哈希)、list(列表)、set(集合)以及zsetsorted set(有序集合)。
-
我们实际项目中比较常用的是String和hash,如果你是Redis的中高级用户,还需要加上以下几种数据类型,分别是:HyperLogLog、Geo、Pub/Sub。
-
如果你玩过Redis Module,像BloomFilter、RedisSearch、Redis-ML,,等等,是加分项。
3、使用 Redis 有哪些好处?
-
速度快:因为数据存在内存当中的,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O1。
-
支持丰富的数据类型:String、list、set、hash、zset等。
-
支持事务:操作都是原子性,所谓原子性就是对数据的更改要么全部执行,要么全部不执行。
-
丰富的特性:Redis可用于缓存,消息,按key设置过期时间,过期后自动删除。
4、Redis 相比 Memcached 有哪些优势?
-
Memcached所有的值均是简单的字符串,Redis作为其替代者,支持更为丰富的数据类型;
-
Redis的速度比Memcached快很多;
-
Redis可以持久化其数据;
5、Memcache 与 Redis 的区别都有哪些?
-
存储方式:Memcached把所有数据全部存在内存当中,断电后会挂掉,数据不能超过内存大小。而Redis有部分是存在硬盘上的,这样能够保证数据的持久性。
-
数据支持类型:Memcache对数据类型支持相对简单,而Redis有复杂的数据类型;
-
使用底层模型不同:它们之间底层实现方式以及客户端之间通信的应用协议不一样。Redis直接构建了VM极致,因为一般的系统屌哦那个系统函数的话,会浪费一定的时间去移动和请求。
6、Redis 是单进程单线程的?
Redis是单进程单线程的,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。
7、一个字符串类型的值能存储最大容量是多少?
一个字符串类型的值能存储的最大容量为512M。
8、Redis 的持久化机制是什么?各自的优缺点?
Redis提供了两种持久化极致RDB和AOF。
(1)RDB(Redis DataBase)持久化方式:
这种方式利用数据集快照的方式半持久化模式记录Redis数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:
-
只有一个文件dump.rdb,方便持久化;
-
容灾行好,一个文件可以保存到安全的磁盘;
-
性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化,使用BGSAVE命令启动数据的持久化,使用子进程来进行持久化,主进程不会进行任何IO操作,保证了Redis的高性能。
-
相对于数据集大时,比AOF的启动效率更高。
(2)AOF(Append-only file)持久化方式:
是指所有的命令行记录都是以redis命令请求协议的格式完全持久化存储保存为AOF文件。
优点:
-
数据安全:AOF持久化可以配置appendfsync属性,有alway,每进行一次命令操作就记录到AOF文件中一次;
-
通过append模式写文件,即使中途服务器宕机,也可以通过redis-check-aof工具解决数据一致性问题;
-
AOF极致的rewrite模式。AOF文件没被rewrite之前(文件过大时对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:
-
AOF文件比RDB文件大,且恢复速度慢;
-
数据集大的时候,比RDB启动效率低;
9、Redis 常见性能问题和解决方案:
-
Master最高不要写内存快照,如果Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大的时候对性能影响是非常大的,会间断性暂停服务;
-
如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次;
-
为了主从复制的速度和链接的稳定性,Master和Slave最好在同一个局域网;
-
尽量避免在压力很大的主库上增加从节点;
-
主从复制不要用图状结构,用单向链表结构更为稳定,即:Master < - Slave < - Slave2 < - Slave3…这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
10、redis 过期键的删除策略?
-
定时删除:使用expire命令设置键的过期时间的同时,创建一个定时器timer,让定时器在键的过期时间来临时,立刻执行对键的删除操作。
-
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的时间是够过期,如果过期的话就删除该键,如果没有过期就返回该键。
-
定期删除:每个一段时间程序就对数据库进行一次检查,删除里面过期的键,至于要删除多少过期的键,以及要检查多少个数据库,都是有算法决定的。
11、Redis 的回收策略(淘汰策略)?
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰(默认)
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
注意这里的 6 种机制,volatile 和 allkeys 规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的 lru、ttl 以及 random 是三种不同的淘汰策略,再加上一种 no-enviction 永不回收的策略。
使用策略规则:
(1)如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru
(2)如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
12、为什么Redis 需要把所有数据放到内存中?
Redis为了达到最快的读写速度,将数据都读到了内存中,并且通过异步的方式将数据写入到磁盘,所以Redis具有快速和数据持久化的特征。 如果不讲数据放在内存中,磁盘I/O速度会严重影响Redis的性能,在内存越来越便宜的今天,Redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
13、Redis 的同步机制了解么?
Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次BGSAVE,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放,这样就完成了同步过程。
14、Pipeline 有什么好处,为什么要用 pipeline?
答:可以将多次 IO 往返的时间缩减为一次,前提是 pipeline 执行的指令之间没有因果相关性。使用 redis-benchmark 进行压测的时候可以发现影响 redis 的 QPS峰值的一个重要因素是 pipeline 批次指令的数目。
15、是否使用过 Redis 集群,集群的原理是什么?
-
Redis Sentinal(哨兵)着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务;
-
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。
(Redis Cluster是由多个redis实例组成的)
16、Redis 集群方案什么情况下会导致整个集群不可用?
有A、B、C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个节点就会以为缺少5501-11000这个范围的槽而不可用。
17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
支持的客户端有:Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
18、Jedis 与 Redisson 对比有什么优缺点?
-
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持,Redisson实现了分部所和可扩展的Java数据结构,相比Jedis,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。
-
Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更几种低放在处理业务逻辑上。
19、Redis 如何设置密码及验证密码?
-
设置密码:config set requirepass 123456
-
授权密码:auth 123456
20、说说 Redis 哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。
21、Redis 集群的主从复制模型是怎样的?
答:为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.
22、Redis 集群会有写操作丢失吗?为什么?
Redis并不能保证数据的一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作。
23、Redis 集群之间是如何复制的?
异步复制
24、Redis 集群最大节点个数是多少?
16384个
25、Redis 集群如何选择数据库?
Redis集群目前无法做数据库选择,默认是在0数据库。
如果要切换到其它数据库就是用select index命令进行操作,index为数据库索引号,0作为起始索引号。
26、怎么测试 Redis 的连通性?
使用ping命令,如果已连接返回PONG。
27、怎么理解 Redis 事务?
-
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其它客户端发送来的命令请求所打断。
-
没有隔离级别的概念:队列中的命令在事务没有被提交之前不会被实际执行。
-
不保证原子性:redis中的一个事务中如果存在命令执行失败,那么其他命令依然会被执行,没有回滚机制
Redis事务的生命周期?
-
事务的创建:使用MULTI开启一个事务
-
加入队列:在开启事务的时候,每次操作的命令将会被插入到一个队列中,同时这个命令并不会被真的执行
-
EXEC命令进行提交事务
28、Redis 事务相关的命令有哪几个?
有:MULTI、EXEC、DISCARD、WATCH。
-
MULTI:使用该命令,标记一个事务块的开始,通常在执行之后会回复OK,(但不一定真的OK),这个时候用户可以输入多个操作来代替逐条操作,redis会将这些操作放入队列中。
-
EXEC:执行这个事务内的所有命令
-
DISCARD:放弃事务,即该事务内的所有命令都将取消
-
WATCH:监控一个或者多个key,如果这些key在提交事务(EXEC)之前被其他用户修改过,那么事务将执行失败,需要重新获取最新数据重头操作(类似于乐观锁)。
-
UNWATCH:取消WATCH命令对多有key的监控,所有监控锁将会被取消。
29、Redis key 的过期时间和永久有效分别怎么设置?
-
使用expire命令对key的过期时间进行设置;
-
使用persist命令对key永久有效进行设置;
30、Redis 如何做内存优化?
尽可能的使用散列表(hashes)。散列表使用的内存非常小(指的是散列表里面存储的数量少),所以应该尽可能的将数据模型抽象到一个散列表里面。
比如说:web系统中有一个用户对象,不要为这个用户的名称、年龄、邮箱、密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面。
31、Redis 回收进程如何工作的?
答:一个客户端运行了新的命令,添加了新的数据。Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。
32、都有哪些办法可以降低 Redis 的内存使用情况呢?
如果使用的是32位的Redis实例,可以好好利用Hash、List、Sorted set、Set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放在一块。
33、Redis 的内存用完了会发生什么?
如果达到设置的上限,Redis的写命令会返回错误信息(读命令还是可以正常返回的),可以将Redis当缓存时使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
34、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
理论上Redis可以处理多达232个keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。
任何list、set和sorted set都可以放232个元素,换句话说,Redis的存储极限是系统中的可用内存值。
35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证redis 中的数据都是热点数据?
答:Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
相关知识:Redis 提供 6 种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
36、Redis 最适合的场景?
-
(1)会话缓存(最常用的一种使用 Redis 的情景是会话缓存(session cache)。用 Redis 缓存会话比其他存储(如 Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台Magento 也提供 Redis 的插件。
-
(2)全页缓存(FPC)
除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了 Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地 FPC。 再次以 Magento 为例,Magento提供一个插件来使用 Redis 作为全页缓存后端。 此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
- (3)队列
Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop 操作。 如果你快速的在 Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery 有一个后台就是使用 Redis 作为 broker,你可以从这里去查看。
- (4)排行榜/计数器
Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的 10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。
- (5)发布/订阅
最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!)
37、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。
如果这个Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
Redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿,知道指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取指令模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
38、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置过于集中,那么到过期的那个时间点,Redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一点。
39、使用过 Redis 做异步队列么,你是怎么用的?
一般使用list结构作为队列,rpush生产消息,lpop消费消息。
当lpop没有消息的时候,要适当sleep一会儿再重试。
追问:可不可以不使用sleep呢?
list还有个指令叫blpop,在没有消息的时候,它会阻塞住,直到消息到来。
再追问:能不能生产一次,消费多次呢?
使用pub/sub主题订阅者模式,可以使用1:N的消息队列。
再问:pub/sub有什么缺点?
在消费者下线的情况下,生产的消息会丢失,解决这样的问题得使用专业的消息队列,如RabbitMQ等。
再问:Redis如何实现延时队列呢?
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangbyscore指令获取N秒之前的数据轮询进行处理。
40、使用过 Redis 分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后再用expire给锁加一个过期时间防止锁忘记了释放。
问:如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这个时候确实锁会永远得不到释放了,但是set指令有个非常复杂的参数是可以同时把setnx和expire合成一条指令来用的。
搞定收工?NoNoNo,还有后面的需要理解。
Redis的其它提问
1、Redis的缓存雪崩、穿透、击穿了解么?有什么异同点?分别怎么解决?
参考这篇文章进行学习:Redis中的缓存穿透、缓存击穿以及缓存雪崩
2、Redis为什么那么快?
Redis采用的是基于内存的单进程单线程模型的KV数据库,由C语言编写,官方提供的数据是可以达到10万次的QPS(每秒内的查询次数)。
-
完全基于内存,绝大部分请求是纯粹的内存操作,非常快。它的数据存在内存中,类似于HashMap,HashMap的优势就在于查找和操作的时间复杂度都是O(1)。
-
数据结构简单,对数据操作也简单。
-
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多线程或者多进程导致切换而消耗CPU,不需要去考虑各种锁的问题,也不存在加锁释放锁的操作,没有可能出现死锁而导致性能消耗。
-
使用多路I/O复用模型,是非阻塞I/O。
3、Redis是单线程的,现在使用的服务器都是多核的,那不是很浪费吗?
Redis是单线程的,在多核情况下我们可以单机开多个Redis实例,这样就不浪费了。
4、Redis单机是有瓶颈的,那你是怎么解决这个瓶颈问题的呢?
我们使用的集群部署方式是Redis-Cluster,并且是主从同步、读写分离,Redis Cluster支撑N个Redis cluster Node,每个master node都可以挂载多个slave node,这样整个Redis就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的master节点,每个master节点就能存放更多的数据。
5、使用以上的集群部署方式,那主从节点之间怎么进行数据交互呢?Redis是怎么进行持久化的?Redis数据都在内存中,一断电或者重启不就什么东西都没有了吗?
它们进行数据交互的方式主要为:主从复制(全量赋值和增量复制);
Redis持久化方式有RDB和AOF两种方式。
RDB方式是对Redis中的数据执行周期性的持久化。AOF方式是对每条写入命令作为日志,以追加的模式写入到一个日志文件中,没有任何磁盘寻址的开销。
以上两种方式都可以将Redis内存中的数据持久化到磁盘中,然后再将这些数据备份到其它地方,RDB适合冷备,AOF适合热备。两种方式都开启的适合Redis默认会使用AOF方式去重新构建数据,因为AOF方式比RDB方式更完整。
6、说一下这两种持久化方式的优缺点是什么?
(1)RDB方式
优点:RDB方式对Redis的性能影响非常小,因为做持久化操作的时候fork了一个子进程去完成持久化,而且它恢复数据的速度要比AOF快。
缺点:RDB都是快照文件,默认是5分钟甚至更长时间才生成一次,这就意味着到下一次同步5分钟内的数据都有可能全部丢失,还有就是RDB生成数据快照的时候如果文件很大,客户端可能会暂停几毫秒或者几秒,如果是做秒杀去fork一个子进程生成快照,就会出大问题。
(2)AOF方式
优点:AOF默认是一秒生成一次快照,最多也只是丢失一秒以内的数据,再则它是以追加的方式对日志文件进行操作的,减少了磁盘的开销,并且写入性能惊人,文件也不容易破损。
缺点:AOF文件要比RDB文件大,因为每秒都要去做一次同步,所以性能比较低。
那两者如何做选择?
全都要,因为单独使用RDB会丢失很多数据,而单独使用AOF数据恢复没RDB快,因此第一时间用RDB恢复数据,然后AOF补全。
7、Redis中还有什么方式可以保证集群高可用?
哨兵集群(sentinel),哨兵必须要使用至少三个实例去保证自己的健壮性,哨兵+主从并不能保证数据不丢失,但是可以保证集群的高可用。
哨兵组件的功能:
- 集群监控:负责监控集群的主节点 Redis master 和 子节点slave进程是否工作正常;
- 消息通知:如果某个Redis实例有故障,那么哨兵就会负责发送消息作为报警通知给管理员;
- 故障转移:如果主机节点master node挂掉了,会自动转移到slave node上;
- 配置中心:如果发生了故障转移,通知client客户端新的master地址。
8、主从同步,主从之间的数据是怎么进行同步的?
当启动一台从机slave的时候,它会发生一个sync同步命令给主机master,如果这个slave从机是第一次连接到主机master,那么它就会触发一次全量复制,master就会启动一个线程生成RDB快照,还会把新的写命令都缓存到内存中,当RDB文件生成后,master就会将这个RDB发送给slave,slave拿到这个文件后就会写入到本地的磁盘中,然后加载内存,然后master会把内存中缓存的那些新命令都发给slave。
9、数据传输的时候断网了或者服务器挂了怎么办?
在传输过程中如果断网了啥的会自动重连的,并且连接上以后会把缺少的数据补上。
10、说一下Redis的过期策略。
Redis的过期策略:定期删除+惰性删除。
定期删除就是默认100ms就随机抽取一些设置了过期时间的key,去检查是否过期,如果过期了就删除。
惰性删除就是不主动删,等用户来查询的时候在看看过期没有,过期了就删除并且无返回值。
11、为什么不扫描全部设置了过期时间的key呢?
那样做太耗性能了,假设Redis中的key都设置了过期时间,扫描一遍就耗时间了,100ms一次,Redis的性能会被拉夸。
同类提问方式
其实就是那么一些东西,只要将知识点理解了,怎么问都是那些知识点,当然了,如果面试官问工作中的东西,那就看个人经历了。
0、在集群模式下,Redis 的 Key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 Hash 算法吗?
1、使用Redis有哪些好处?
2、Redis相比Memcached有哪些优势?
3、Redis常见性能问题和解决方案
4、MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
5、Memcache与Redis的区别都有哪些?
6、Redis 常见的性能问题都有哪些?如何解决?
7、在什么样的场景下可以充分的利用Redis的特性,大大提高Redis的效率?
8、Redis的缓存雪崩、穿透、击穿了解么?有什么异同点?分别怎么解决?
9、Redis的基本类型有哪些?他们的使用场景了解么?比较高级的用法你使用过么?
10、Redis主从怎么同步数据的?集群的高可用怎么保证?持久化机制了解么?
11、为什么 redis 单线程却能支撑高并发?
12、如何保证缓存和数据库数据的一致性?
13、项目中是怎么用缓存的,用了缓存之后会带来什么问题?
如果觉得本文对你有帮助,可以点赞支持以下噢。。