Redis持久化与集群 (Redis高频面试点: AOF,RDB,CAP,主从复制,哨兵,集群)

Redis持久化与集群

这一篇是之前就想写的,但是考虑到学习一样东西有一样好的方式是对比,就先写的MySQL的复制,备份与恢复与Redis的持久化,集群有许多相同之处(我私以为最大的区别是Redis是存储在内存,MySQL是在磁盘,其他的思想其实差不多)
Redis持久化与集群

1.什么是Redis持久化

1.1 Redis持久化定义

将Redis的数据从内存存储到磁盘(可以存储到MySQL数据库,或直接存储为Redis能够识别的脚本)的过程,称为持久化

1.2 持久化目的

  • Redis的数据存储在内存中,带来的好处是高效率,但是问题同样明显,只要断电数据就丢失,或者说重启Redis原来的数据也不会保存。
  • 持久化的目的就是为了解决数据丢失问题,以及启动时能够加载上次数据

数据丢失问题很好理解,为了数据安全性,肯定不能让数据丢失
但是为什么要加载上次保留的数据?

  • Redis的目的是什么,大部分是用来做缓存,为了让热点数据加载更快,同时减轻数据库的负担。如果每次重启都需要重新获取热点数据,就会再次个别次数的卡顿。一般为了体验更平滑,都会在启动时加载热点数据(预热)

1.3 相关面试题

  • Q:了解缓存击穿吗?或者说Redis缓存可能会有那些问题?
    A:Redis缓存可能会有 缓存击穿缓存雪崩缓存穿透问题
    缓存击穿:热点数据访问量过高,当Redis缓存失效(为什么缓存会失效,下面会分析)时候,MySQL访问量过高导致的卡顿,宕机或者其他问题;解决方案是:热点数据缓存不设置失效日期,或者失效时间很长
    缓存雪崩:许多缓存在同一时间失效,导致页面的卡顿;解决办法:缓存失效的时间设置的随机点,避免同时失效发生
    缓存穿透:频繁访问一个不存在的数据,导致缓存无法发挥效用。例如说访问某个值,但是这个值时不存在的,每次访问Redis发现数据不存在,然后去数据库访问,还是发现不存在。这样就导致Redis没起到作用;解决方案:将空值也缓存,或者使用布隆过滤器。缓存空值只能解决对某个确定不存在数据的恶意访问问题。但是如果是很多数据都不存在,将对应的空值都缓存也划不来,更好的方式是布隆过滤器

布隆过滤器:利用Hash算法,判断存在的数据可能存在,判断不存在的数据一定不存在。这样对于很多不存在的数据,直接给予拦截,有效减小数据库压力。布隆过滤器原理

2.Redis持久化方式

Redis的持久化方式有两种:一种是全量式(也可以说是快照式):RDB,一种是增量式(日志式):AOF

2.1 Redis持久化 – RDB

我之前描述Redis是“单线程”的时候,是用的引号的,Redis处理请求的时候,一次处理一个。但是Redis在RDB持久化的时候,如果还是单线程,那岂不是在持久化的时候需要有有一段时间不能工作(这个是后可以联想回顾下Java垃圾回收的stop the word)。显然这样是很难被接受的。Redis是怎么干的:fork了一个子进程来执行RDB持久化,为什么说是基于快照方式,当Redis开始进行RDB的时候,对于子进程来说,Redis的内容都是不变的,相当于按下快门键,所有东西都固定了。父进程的所有写操作都是在副本上进行,完成后合并到原件上。这种机制叫:COW(Copy On Write)机制:很好理解,修改操作都在副本上进行,最后提交合并(和Git的分支管原理一样)
那最后Redis到底是不是单线程的: 一般认为Redis是多个多进程单线程(多个单线程的进程组成,但是都已经是多线程,再说Redis是单线程是不是怪怪的)。一般说Redis是单线程一般是为了强调其原子性,而且大于大部分操作,Redis就是单线程

2.2 Redis持久化 – AOF

AOF是基于日志实现的(和MySQL的复制区别不大)。将Redis语句记录到日志,存储到磁盘中
AOF重写是对AOF的一种优化,能够精简AOF日志大小(参考MySQL基于行的复制)。对某个语句进行多次操作,AOF重写将这些操作合并,只留一条语句(这条语句是不是分析AOF语句重写的,而是根据Redis的内容进行重写)

2.3 RDB与AOF的对比

  • RDB相对于AOF来说效率更高,因为RDB产生的文件比AOF更小,恢复起来更快。那做实验类类比:AOF相当于是一步一步论证,最后得到结果,RDB相当于是直接给给结果,论证过程不写。文件能不小吗、。
  • 不是说RDB比AOF好,RDB是全量,AOF是增量,你总不能实时去做RDB持久化(会有公司是实时推送全量数据吗)
  • 同时RDB也会加大Redis服务器即时负载,会降低那一小段时间的并发,AOF肯定也吃服务器负载而且总负载消耗肯定更大,但是AOF相当于把消耗分布在一个时间区间(可以联想物理的省力不省功)

一般RDB和AOF是混合用的,晚上服务器没有压力的时候,进行RDB(全量)持久化,然后其他时间是进行AOF(增量)持久化。

3.什么是Redis集群

  • Redis是在内存上,4G,10W访问量顶的一台机器顶的住,如果是400G,1000W访问量呢?一台机器(要是再过20年,说不定还真的可以)肯定是不行了,我们要用多个计算机进行处理。
  • 如果在一台机器上,因为某种原因,机器宕机了,难道我们就只能等着恢复?

3.1 集群的定义

通过使用多个台计算机处理一件事情,来扩展系统的性能,这种方式称为集群

CAP理论:一致性,可用性,与分区容忍性(数据在不同的机器上,意味着可能会断开(有可能是那台服务器宕机,也有可能是网络不稳定),称为网络分区),这三者只能确保其中两者,而不能三者全部保全。Redis是通过牺牲一致性来保证后两者。不是强一致性(主从服务器始终保持数据一致),但是要保证最终一致性(最终从服务器与主服务器数据一致)

3.2 集群解决的问题

  • 读写分离,通过集群,主服务器提供写服务,从服务器提供读服务。提高系统吞吐量(数据一样)
  • 提高可用性,即使某一台服务器宕机,其他服务器还能够代替这台机器工作(多台数据的机器一样)
  • 提高系统性能,一台机器处理不了那么多数据,多台机器处理(多台机器数据不一样)

4.Redis集群方式

4.1 主从复制

  • 集群服务器分为两类,主服务器和从服务器(MySQL叫主备)
  • 主服务器提供写服务,从服务器提供读服务(只有主服务器能提供写,理由和MySQL的一样,为了保证数据的一致性)
  • Redis主从模型和MySQL主备一样,已有两种:主从模型,主-分发服务器-从服务器模型
  • 主从复制过程:主服务器提供快照(RDB),发送给从服务器,从服务器删除自己的内容,然后加载快照,再然后主服务器将缓存区的指令同步给从服务器(AOF)(主服务器将自己的指令记录到本地缓存区buffer,从服务器获取指令,同时反馈自己进度。注意主服务器的缓存区是环形数组,如果从服务器因为网络分区或者其他原因长时间未获取,这部分数据就可能丢失)

4.2 哨兵(Sentinel)

  • 上面的主从同步里面,如果是从服务器挂掉了,其他从服务器还能代替那个挂掉的继续提供读服务,但是如果是主服务器挂掉了,那么写服务就无法进行了,因为只有主服务提供写服务。哨兵可以解决这个问题。
  • 哨兵是什么:哨兵是一种监控Redis服务器的工具,当主服务器挂掉的时候,在从服务器里选一个最接近主节点的节点为主节点
  • 客户端是通过哨兵来获取主节点地址(其他从节点也是 ),当主节点挂掉,客户端会重新从哨兵获取主节点地址,哨兵会给出一个最佳节点。
  • 当主节点挂掉之后又恢复后,这个不会就是从节点了,因为已经有一个主节点了

4.3 Codis

  • Condis是国人开发的一个三方代理工具
  • 其原理是通过代理,将查询(增删改查)转发到各个Redis实例上
  • 可以有多个Condis实例。
  • Condis实例与Redis的映射关系存储在其他分布式中间件上:例如ZooKeeper
  • 能够自动均衡,当有新增的Redis实例后,会将其他实例的一部分Key迁移到新的实例上,如果访问的key正在迁移中,会马上将这个key进行迁移在访问
    *映射规则:对Key的Hash进行Crc32运算,然后模1024,得到key的槽位,Condis会缓存槽位和实例的关系
  • Condis的迁移可以后台自动进行,同时Condis有可视化的后台管理页面

4.4 Cluster

  • Redis自己的工具
  • 将一共划分16384个槽位(Condis是1024)(hash槽的概念)
  • Cluster是可以直接找到节点(Condis需要代理),也不需要第三方工具来同步槽位与实例地址的关系
  • 映射规则:堆Key的hash进行CRC16运算,然后模16384
  • 没有代理节点可以提供,key与实力地址的映射,扩容之后找,客户端在原先的实例寻找Key,服务器会返回一个正确的地址。从原节点迁移到目标节点后悔删除调原节点

4.5 个人思考

在网上搜Redis集群,一般都是说有三种集群方案:主从复制,哨兵,Cluster。我不是很认同这种观点,一来就把Condis(除了这个,其他3个都是Redis自身的功能)开除了。哈哈哈,给中国开发者一点面子好不好:我觉得主从复制和哨兵只是Redis集群的基础以及一部分功能。Condis与Cluster更倾向于分布式方案。举例子:
现有A,A2,A3,B,B2,B3,C,C2,C3九台机器构成一个集群系统。其中Condis和Cluster更倾向于描述A,B,C这三个主服务器的关系(分布式的概念)。主从复制与哨兵是A,A2,A3描述作用这种关系。(也不知道我有没有表达清楚)

实际上一般公司到主从复制就这个阶段就够了,最多哨兵层次,后面两个一般用不到。即使业务比较多,但也有可能是不同的系统,各自独立。也用不到Condis与Cluster。但是我们也需要知道原理,不然面试怎么造航母。

5.小结

  • RDB与AOF是什么?
  • RDB与AOF的优劣,应用场景
  • 缓存雪崩,缓存击穿,缓存穿透
  • 主从复制,哨兵,Condis,Cluster

还有些东西想说:但是这篇文章已经字数已经严重超标了。
Redis缓存过期策略,布隆过滤器,hash槽概念,哨兵的工作过程

我今天早上起来看了部电影《横空出世》,推荐大家看下。我们今天的生活来之不易,不要被疫情打倒。对国家有信心

															苔痕上阶绿,草色入帘青
															博主:五更依旧朝花落
															最早发布时间:2020年4月6日19:01:19
															最后更新时间:
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。   本课程主要讲解以下内容:1. Redis的基本使用2. Redis数据库的数据类型3. Redis数据库数据管理4. Redis主从复制5. Redis数据库的持久性6. Redis的高可靠性和集群7. Redis的优化和性能测试8. Redis服务器的维护和管理9. Redis服务器的常见问题排错 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值