问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

32道Redis面试题解析:Redis主从复制+缓存+分布+集群

发布网友 发布时间:2024-09-27 06:32

我来回答

1个回答

热心网友 时间:2024-10-02 01:12

就我个人而言,我觉得Redis的基本使用是我们每个Java程序员都应该会的。如果需要面试的话,一些关于Redis的主从复制+缓存+分布+集群等问题,大家也必须要了解掌握,不过我都帮大家找到了大厂面试原题,相信你看完这32道Redis面试题解读,会对Redis有更好的理解,应对面试官的提问也更加得心应手。

1.什么是Redis?它主要用来什么的?

Redis,英文全称是RemoteDictionaryServer(远程字典服务),是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA脚本、LRU驱动事件、多种集群方案。

2.说说Redis的基本数据结构类型

大多数小伙伴都知道,Redis有以下这五种基本类型:

String(字符串)

Hash(哈希)

List(列表)

Set(集合)

zset(有序集合)

它还有三种特殊的数据结构类型

Geospatial

Hyperloglog

Bitmap

3.Redis为什么这么快?

4.缓存和数据库间数据一致性问题

分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存。我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。

5.布隆过滤器

bloomfilter就类似于一个hashset,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于hash算法和容器大小

6..缓存雪崩问题

存在同一时间内大量键过期(失效),接着来的一大波请求瞬间都落在了数据库中导致连接异常。

解决方案:

也是像解决缓存穿透一样加锁排队。

建立备份缓存,缓存A和缓存B,A设置超时时间,B不设值超时时间,先从A读缓存,A没有读B,并且更新A缓存和B缓存;

7.缓存并发问题

这里的并发指的是多个redis的client同时setkey引起的并发问题。比较有效的解决方案就是把redis.set操作放在队列中使其串行化,必须的一个一个执行,具体的代码就不上了,当然加锁也是可以的,至于为什么不用redis中的事务,留给各位看官自己思考探究。

8.Redis分布式

redis支持主从的模式。原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

这是一个典型的分布式读写分离模型。我们可以利用master来插入数据,slave提供检索服务。这样可以有效减少单个机器的并发访问数量

9.读写分离模型

通过增加SlaveDB的数量,读的性能可以线性增长。为了避免MasterDB的单点故障,集群一般都会采用两台MasterDB做双机热备,所以整个集群的读和写的可用性都非常高。读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

10.数据分片模型

为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。

可以将每个节点看成都是独立的master,然后通过业务实现数据分片。

结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

11.redis常见性能问题和解决方案:

Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

尽量避免在压力很大的主库上增加从库

12.redis通讯协议

RESP是redis客户端和服务端之前使用的一种通讯协议;RESP的特点:实现简单、快速解析、可读性好

13.Redis分布式锁实现

先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。**如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?**set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

14.为什么Redis是单线程的?

Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)。

15.Redisinfo查看命令:infomemory16.Redis内存模型

used_memory:Redis分配器分配的内存总量(单位是字节),包括使用的虚拟内存(即swap);Redis分配器后面会介绍。used_memory_human只是显示更友好。

used_memory_rss**:**Redis进程占据操作系统的内存(单位是字节),与top及ps命令看到的值是一致的;除了分配器分配的内存之外,used_memory_rss还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存。

mem_fragmentation_ratio**:**内存碎片比率,该值是used_memory_rss/used_memory的比值。

mem_allocator**:**Redis使用的内存分配器,在编译时指定;可以是libc、jemalloc或者tcmalloc,默认是jemalloc;截图中使用的便是默认的jemalloc。

17.Redis内存划分

数据作为数据库,数据是最主要的部分;这部分占用的内存会统计在used_memory中。

进程本身运行需要的内存Redis主进程本身运行肯定需要占用内存,如代码、常量池等等;这部分内存大约几兆,在大多数生产环境中与Redis数据占用的内存相比可以忽略。这部分内存不是由jemalloc分配,因此不会统计在used_memory中。

缓冲内存缓冲内存包括客户端缓冲区、复制积压缓冲区、AOF缓冲区等;其中,客户端缓冲存储客户端连接的输入输出缓冲;复制积压缓冲用于部分复制功能;AOF缓冲区用于在进行AOF重写时,保存最近的写入命令。在了解相应功能之前,不需要知道这些缓冲的细节;这部分内存由jemalloc分配,因此会统计在used_memory中。

内存碎片内存碎片是Redis在分配、回收物理内存过程中产生的。例如,如果对数据的更改频繁,而且数据之间的大小相差很大,可能导致redis释放的空间在物理内存中并没有释放,但redis又无法有效利用,这就形成了内存碎片。内存碎片不会统计在used_memory中。

18.Redis对象有5种类型

无论是哪种类型,Redis都不会直接存储,而是通过redisObject对象进行存储。

19.Redis没有直接使用C字符串

(即以空字符’\0’结尾的字符数组)作为默认的字符串表示,而是使用了SDS。SDS是简单动态字符串(SimpleDynamicString)的缩写。

20.Reidis的SDS在C字符串的基础上加入了free和len字段21.Reids主从复制

复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的*。

22.Redis哨兵

在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存储能力受到单机的*。

23.MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

##24.Redis有哪些适合的场景?

(1)、会话缓存(SessionCache)最常用的一种使用Redis的情景是会话缓存(sessioncache)。用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中搜索“Redisqueues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGEuser_scores010WITHSCORESAgoraGames就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

26.一个Redis实例最多能存放多少的keys?

List、Set、SortedSet他们最多能存放多少元素?理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。我们正在测试一些较大的值。任何list、set、和sortedset都可以放232个元素。换句话说,Redis的存储极限是系统中的可用内存值。

27.Redis常见性能问题和解决方案?

(1)Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(2)如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3)为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4)尽量避免在压力很大的主库上增加从库(5)主从复制不要用图状结构,用单向链表结构更为稳定,即:Master<-Slave1<-Slave2<-Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

28.Redis提供了哪几种持久化方式?

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。

Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。

你也可以同时开启两种持久化方式,,在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始。

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

一般来说,如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份,并且RDB恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免之前提到的AOF程序的bug。

30.修改配置不重启Redis会实时生效吗?

针对运行实例,有许多配置选项可以通过CONFIGSET命令进行修改,而无需执行任何形式的重启。从Redis2.2开始,可以从AOF切换到RDB的快照持久性或其他方式而不需要重启Redis。检索‘CONFIGGET*’命令获取更多信息。但偶尔重新启动是必须的,如为升级Redis程序到新的版本,或者当你需要修改某些目前CONFIG命令还不支持的配置参数的时候。

31.Redis与memcached相比有哪些优势?

1.memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

2.redis的速度比memcached快很多redis的速度比memcached快很多

3.redis可以持久化其数据redis可以持久化其数据

32.Redis集群方案什么情况下会导致整个集群不可用?

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

作者:Java架构师
史上最全Redis面试题,让面试官问无可问(附答案)

Redis 集群使用哈希槽概念,将数据均匀分布在集群节点上。17、Redis 集群的主从复制模型是怎样的?Redis 集群使用主从复制模型,每个节点有 N-1 个复制节点。18、Redis 集群会有写操作丢失吗?为什么?Redis 并不能保证数据强一致性,特定条件下可能会丢失写操作。19、Redis 集群之间是如何复制的?Redis ...

Redis常见面试题

在数据一致性方面,Redis通过过期策略和内存淘汰策略保证数据更新。通过监听binlog或双删机制,确保数据库和缓存的同步。常见的缓存问题如穿透、击穿、雪崩等,需要采取针对性的解决策略。Redis主从复制和集群架构确保数据同步和高可用。主从复制通过异步复制,哨兵模式则提供了自动故障切换。集群中,一致性哈希算...

Redis最常见的5道面试题

Redis是内存数据库的面试常见题,涉及数据结构、过期策略、分布式锁和主从复制。1. Redis支持的数据结构包括字符串、哈希、列表、集合和有序集合,适用于不同场景。2. 过期策略有定时、惰性和定期,如设置键的过期时间代码示例...3. 使用Lua脚本实现分布式锁,具体操作代码...4. 主从复制原理涉及数据...

Redis主从复制原理详解

同时,这也是面试中出现频率最高的几个主题,这期我们先来讲讲 Redis 的主从复制。2. 主从复制简介Redis 同时支持主从复制和读写分离:一个 Redis 实例作为主节点 Master,负责写操作。其它实例(可能有 1 或多个)作为从节点 Slave,负责复制主节点的数据。2.1 架构组件主节点Master数据更新:Master 负责处理所有的写操...

52.redis面试题汇总(1)

Redis服务高可用通过主从复制、哨兵模式和集群等机制实现。五种常见Redis数据类型包括字符串、哈希、列表、集合和有序集合。Redis并非完全单线程,其后台线程用于管理内存、日志等非I/O密集型任务。混合持久化结合RDB和AOF优点,平衡性能与数据安全性。Redis内存管理机制在达到最大运行内存时触发内存淘汰。LRU(...

详解Redis三大集群模式,轻松实现高可用!

本文详细解析Redis的三大集群模式,助您轻松实现高可用性与性能提升:主从复制模式 (Master-Slave): 这是基础的集群方式,通过主节点写入、从节点同步数据,实现备份与读写分离。它适用于备份、读多写少场景,但主节点故障需手动切换,高可用性较低。 哨兵模式 (Sentinel): 基于主从复制,哨兵监控节点在...

redis集群的主从复制模型是怎样的

Redis集群的主从复制模型是一种典型的分布式系统中的数据同步机制。模型概述:Redis集群的主从复制模型实现了数据的高可用性和负载均衡。在这个模型中,主节点负责处理写操作请求,而从节点则通过复制主节点的数据来保持数据的一致性。这种复制过程确保了即使在主节点出现故障时,系统仍然能够继续运行,并通过从...

40道 Redis 运维经典面试题

Redis集群的原理是什么?Redis集群通过主从复制和哈希槽分配实现高可用和扩展性。Redis集群不可用的情况有哪些?集群不可用可能因节点失败、复制模型等问题导致。Redis支持哪些Java客户端?Redisson、Jedis、lettuce等都是常用Java客户端,官方推荐使用Redisson。Jedis与Redisson有何优缺点?Jedis功能全面,Redisson则...

详解Redis 主从复制及主从复制原理

1、数据冗余: 主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。2、故障恢复: 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。3、负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时...

中间件-Redis详解(2)

Redis详解(2):中间件架构与功能介绍Redis的部署与管理方式多种多样,本文将重点解析单节点、主从复制、哨兵以及集群的部署架构和优缺点。单节点(Single)优点:部署简单,适合小型应用或测试环境。缺点:性能受限,单点故障。主从复制(Replication)原理:主数据库(Master)与从数据库(Slave)之间进行数据...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
学会自制柠檬减肥茶,健康减肥每一天 柠檬减肥茶怎么做 怎样制作柠檬减肥茶 柠檬减肥茶的做法 扬剧《恩仇记》 乙肝症状有哪些?什么是最严重的?? 请问医生乙肝有哪些病发症状?是不是有气稠与气短的病发生 孙浩英演唱会 孙浩英个人简介 孙浩英专辑 我现在有一个5万平米的商场项目,关于空调机组选择及耗电量怎么计算?大 ... 工程硕士中,GCT入学考试和自主命题入学考试和同等学历申硕有什么区别... wpf 中 DataGrid有没属性 可以显示当前有多少行数据? 我想要的结果是... 通过Demo学WPF—数据绑定(一)✨ ...从表1如何通过函数公式检索相关数据,然后把符合条件的数据整行... EXCEL中用公式把表1中符合条件的数据筛选出来并自动复制到表2中去? 聊聊你吃过最好吃的鸡是怎么样的? 正厅级任级十年退休可以提副省吗? 副省级和正厅级哪个大 “从最基本的东西教起”打一个成语? 从山西太原到乌鲁木齐有几趟火车? 从太原到乌鲁木齐坐火车一个来回,最少要花多少钱?最少花多少时间? 吉日万年历2023年4月28日是不是开业大吉的日子? 2023年最佳的开市吉日一览表兔年万年历开市吉日查询? 一辆汽车从甲地开往乙地,如果把车速提高20%,可以比原定时间提前一小时到... 西门子xqg55- wm65洗衣机按什么键进入脱水? 西门子洗衣机操作图解 ARMA3是不是比ARMA2更加显卡杀手 西门子洗衣机如何操作 武装突袭二箭头行动汉化怎么搞?简单一点,本人不是很会搞 找点有意义的QQ英文网名谢谢! 家里开了中央空调一般一个月电费是好多 精通英语的帮我想个QQ英文网名,给我带上中文翻译,要那种拼搏进取意义的... 建筑面积18000平方米,分为1.2.5层三种阶梯式建筑,现在想安装一部中央... 装修公司市场部经理岗位职责5篇 胃寒吃什么食物比较好?推荐下面几种 96110不接电话怎么办 ...是定义在R上的一列函数,E={x:lim(n→∞)fn(x) ...函数列,且几乎处处收敛于f(x).若limfn(x)dx=0,则f(x)? 为什么函数fn(x)在x趋向无穷大时为无穷大 概率论与数理统计,证明:lim(x→∞)Fn(x)= 1- e^(-2x) x&gt;0 已知fn(x)=(1 x)^n(x不等于0且x不等于-1,n属于N*)设g(x)=f3(x) f4... lim(f(x))^n=(limf(x))^n证明 iPhone7如何在App Store下载并安装软件? 西安城南客运站离北郊凤城六路远吗 魅族x和魅族9的电池好用么?现在推出的re版肿么样啊,急急急各位大侠给... 从西安北郊凤城二路到西稍门要多长时间,怎么走?我拿东西多,打的?_百度... 咸阳到西安凤城二路咋走? 国产手机小米和魅族那个好一点?请详细点谢谢本人现在用的米4感觉... 如何在VMware虚拟机中手动安装VMware tools(在虚拟机选项卡是灰色的情况...