欢迎关注方志朋的博客,回复”666“获面试宝典

前言

面试官问:您熟悉redis?搭建过redis集群?rediscluster底层的主从复制rdb如何工作的?……

接下来,就是一轮迫击炮,犹如把面试者按在砧板上,轮番炮击……

您目前用redis那种集群模式?

采用Redis Cluster无中心结构集群模式

拓展

master-slave模式模式存在的问题是,master宕机之后,从机只能读,不可写,不能保证高可用。Redis Cluster每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。节点之间使用gossip协议传播信息以及发现新节点。

  • Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现,集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset)。

  • Redis 集群中不存在中心(central)节点或者代理(proxy)节点,集群的其中一个主要设计目标是,达到线性可扩展性(linear scalability)。

  • Redis 集群为了保证一致性(consistency),而牺牲了一部分容错性:系统会在保证对网络断线(net split)和节点失效(node failure)具有有限(limited)抵抗力的前提下,尽可能地保持数据的一致性。

redis集群技术,是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,在单个 redis 内存不足时,使用 Cluster 进行分片存储,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。

Redis集群中的节点如何保证数据一致?

采用异步复制,进行数据同步,保持各个节点数据一致。

当客户端向从S服务器发送SLAVEOF命令,要求从S服务器复制主M服务器时,从S服务器首先需要执行同步操作,也即是,将从S服务器的数据库状态更新至主M服务器当前所处的数据库状态。

从S服务器对主M服务器的同步操作,需要通过向主M服务器发送SYNC命令来完成,以下是SYNC命令的执行步骤:

  1. 从S服务器向主M服务器发送SYNC命令。

  2. 收到SYNC命令的主M服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区,记录从现在开始执行的所有写命令。

  3. 当主M服务器的BGSAVE命令执行完毕时,主M服务器会将BGSAVE命令生成的RDB文件,发送给从S服务器,从S服务器接收并载入这个RDB文件,将自己的数据库状态更新至主M服务器,执行BGSAVE命令时的数据库状态。

  4. 主M服务器将记录在缓冲区里面的所有写命令,发送给从S服务器,从S服务器执行这些写命令,将自己的数据库状态更新至主M服务器数据库当前所处的状态。

Redis有哪些适合的场景?

  • Session共享(单点登录)

  • 页面缓存

  • 队列

  • 排行榜/计数器

  • 发布/订阅

Redis如何做内存优化?

尽可能使用散列c表(hash)----是说散列表里面存储的数少,使用的内存非常小,所以尽可能的,将你的数据模型抽象到一个散列表里面。

比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

Redis回收进程如何工作的?

一个客户端运行了新的命令,添加了新的数据。

Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的LRU算法策略进行回收。

Redis 的持久化机制是什么?各自的优缺点?

Redis提供两种持久化机制 RDB 和 AOF 机制:

1、RDB(Redis DataBase)持久化方式:

是指用数据集快照的方式,半持久化模式记录 redis 数据库的所有键值对,在某个时间点,将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

优点:

  • 只有一个文件 dump.rdb,方便持久化。

  • 容灾性好,一个文件可以保存到安全的磁盘。

  • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO最大化。

  • 使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis的高性能。

  • 相对于数据集大时,比 AOF 的启动效率更高。

缺点:

  • 数据安全性低。

  • RDB 是间隔一段时间进行持久化,如果持久化期间 ,redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

2、AOF(Append-only file)持久化方式:

是指所有的命令行记录,以 redis 命令请求协议的格式,完全持久化存储,保存为 aof 文件。

优点:

  • 数据安全,aof持久化,可以配置appendfsync属性,有always,每进行一次命令操作就记录到aof文件中一次。

  • 通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题。

  • AOF机制的rewrite模式。AOF文件没被rewrite之前(文件过大时,会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall))

缺点:

  • AOF 文件比 RDB 文件大,且恢复速度慢。

  • 数据集大的时候,比 rdb 启动效率低。

Redis是单线程的,那它为什么这么快?

Redis的单线程,其实是指执行Redis命令的核心模块是单线程的,也就是文件事件处理器,主要由四个部分组成:套接字、IO多路复用、文件事件分派器和事件处理器。

Redis6.0其实已经支持多线程来提高性能了。而Redis之所以快主要原因:

  • Redis是基于内存的,数据都存放在内存中,速度非常快

  • Redis的IO模型是非阻塞IO

  • Redis核心模块的单线程使得可以避免线程切换带来的开销

  • Redis是单线程的,可以通过开启多个Redis实例来利用多核

Redis支持哪几种数据类型?优势是什么?比其他key-value存储数据库有什么不同?

支持多种类型的数据结构

Redis优势

  • 性能极高--------Redis能读的速度是11万次/s,写的速度是8.1万次/s。

  • 丰富的数据类型--------Redis支持二进制案例的Strings,Lists,Hashes,Sets及OrderedSets数据类型操作。

  • 原子--------Redis的所有操作都是原子性的,意思就是要么成功执行,要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,结合lua脚本,用MULTI和EXEC指令包起来。

  • 丰富的特性--------Redis还支持publish/subscribe,通知,key过期等等特性。

  • Redis单点吞吐量--------单点TPS达到8万/秒,QPS达到10万/秒。

可以复制脚本生成的单个写入命令,而不是复制整个脚本,我们称之为【脚本影响复制】(script effects replication)。

  • 在这种复制模式下,当执行Lua脚本时,Redis会收集由Lua脚本引擎执行的所有实际修改数据集的命令。

  • 当脚本执行完成后,由脚本生成的命令序列,将被包装到 MULTI/EXEC 事务中,并发送到从节点,和进行AOF持久化保存。

  • 当我们加了replicate_commands()以后,到AOF备份文件里面查看,发现会把写命令转换为MULTI...EXEC命令:

结合lua脚本,用MULTI和EXEC指令包起来,并且在Lua脚本中读多写少的情况下,只持久化和复制写命令,可以节省重启和备库的CPU时间。

Redis与其他key-value存储NOSQL数据库有什么不同?

  • Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。

  • Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。

  • MongoDB是一个基于分布式文件存储的数据库,文档型的非关系型数据库,与上面两者不同, MongoDB不支持事务。

性能上:

  • Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB。

  • 而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。

  • Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高。

内存空间和数据量大小:

  • MemCached可以修改最大内存,采用LRU算法。

  • Redis增加了VM的特性,突破了物理内存的限制。

  • MongoDB 适合大数据量的存储,依赖操作系统 VM 做内存管理,吃内存也比较厉害。

操作便利上:

  • MemCached数据结构单一,仅用来缓存数据。

  • 而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。

  • Mongodb 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

可靠性上:

  • MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。

  • Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。

  • MongoDB 从 1.8 版本开始采用 binlog 方式支持持久化的可靠性。

应用场景:

  • Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。

  • Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

  • MongoDB:主要解决海量数据的访问效率问题(没有事务性要求的,适合kv存储,评论,文章,邮件存储,文本存储,json存储,爬虫存储,游戏领域,tb级以上的大数据存储,这种数据用mongodb存储,mongodb更容易实现水平扩展,可以存储比数据库更多的数据)。

来源:blog.csdn.net/as4589sd/article/details/114667058

热门内容:
  • 短信验证码最佳实践

  • 厉害了!不重启JVM,替换掉已经加载的类

  • Docker 大势已去,Podman 即将崛起

  • 我同事说我写代码像写诗

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

Redis面试连环问:集群、复制以及与其他NOSQL数据库的区别?相关推荐

  1. Redis面试连环15问

    1.Redis基本数据类型有哪些? Redis 是一种基于键值对的NoSQL缓存数据库,key都是由字符串构成的,而它的值主要由string(字符串),hash(哈希),list(列表),set(集合 ...

  2. 面试连环问之Redis分布式锁

    面试连环问之Redis分布式锁 面试连环问之Redis分布式锁 核心 主要介绍 主要代码 1.新建RedisLock 2.使用Redis锁遇到的问题 面试连环问之Redis分布式锁 核心 Redis分 ...

  3. 手撸架构,Redis面试41问

    技术栈 传送门 JAVA 基础 手撸架构,Java基础面试100问_vincent-CSDN博客 JAVA 集合 手撸架构,JAVA集合面试60问_vincent-CSDN博客 JVM 虚拟机 手撸架 ...

  4. ElasticSearch面试 - es 生产集群的部署架构是什么?

    ElasticSearch面试 - es 生产集群的部署架构是什么? 面试题 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 面试官心理分析 这个问题,包括后面 ...

  5. Redis从入门到集群分布式实践

    Redis 分布式实践 一. Redis 初识 1.1 Redis 导学 Redis有哪些特点? 高性能的key-value服务器 多种数据结构 丰富的功能 高可用分布式支持 适合人群: 初学者 进阶 ...

  6. redis夺命连环问10--说说Redis是怎么做旁路缓存的?

    目录 相关前置知识文章 说说Redis是怎么做旁路缓存的? 先谈缓存大概怎么做 再谈旁路缓存两种模式 redis和mysql如何保证数据一致性? 那怎么解决缓存和数据库的数据不一致问题? 如何保证缓存 ...

  7. 第一节 Redis 使用及哨兵集群 2022-1-2

    Java组件总目录 Redis 使用及哨兵集群 Java组件总目录 一 Redis基本数据类型使用场景 1 String 2 List 存储列表结构 3 Hash 4 Set 5 Zset 二级目录 ...

  8. Redis高可用之集群配置(六)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  9. redis 3.0 cluster 集群 学习之路篇 [3]

    周氏一族,整理技术文档,给下一代留点教程...... redis 3.0 cluster 安装篇,请看 http://zhoushouby.blog.51cto.com/9150272/1560400 ...

最新文章

  1. window.open() document.open()
  2. 《一条狗的回家路》曝中国风海报 霍思燕为狗狗配音
  3. Java虚拟机new和newarray相关指令学习
  4. 让我们将包变成模块系统!
  5. Box 'laravel/homestead' could not be found.
  6. 发牌一周年 国内5G发展如何?
  7. 【汇编语言】程序格式
  8. cpuz测试分数天梯图_2015最新cpu天梯图 cpu性能排行榜
  9. android串口驱动服务怎么开启,Android usb转串口驱动开发
  10. python批量检索文献pubmed_Python 利用Entrez库筛选下载PubMed文献摘要的示例
  11. swift Key Path Layer.borderColor/Layer.borderUIColor 设置边框为黑框 颜色无效
  12. 手机软件测试实习感想
  13. labelImg打开闪退怎么解决
  14. js获取系统当前时间,实现钟表功能
  15. 物流手持PDA,无线巴枪
  16. 程设刷题 | 程序设计实践II-2017(部分)
  17. Camera详解(附身份证扫描示例)
  18. Whale帷幄 - 智慧化门店 智慧化运营
  19. 响应Response
  20. excel里面怎么排名次

热门文章

  1. php mysql zend linux_在Linux系统中安装Apache+MySQL+php+phpMyAdmin+Zend
  2. 汽车中的ECU, VCU, MCU, HCU
  3. Result Maps collection already contains value for
  4. BZOJ1251: 序列终结者
  5. pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。
  6. H国的身份证号码(搜索)
  7. 源码0306-手势解锁
  8. 你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
  9. Objective-C代码的文件扩展名
  10. Java5中的线程池实例讲解