关于Redis的一些总结

一、Redis是什么?

Redsi是一种高性能的key-value NOSQL数据库,内置多种数据结构,支持市面多种主流语言,使用起来简单便捷。

二、为什么使用Redis ?

因为传统的关系型数据库如Mysql不能适用于高访问流量场景,很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有Redis和Memcached,redis支持多种数据结构,是单线程,完全基于内存,原子性操作,没有加锁释放锁的性能消耗,支持RDB镜像持久化和AOF增量持久化,支持分布式存储,在综合考虑了他们的优缺点后,最后选择了redis。

三、Redis有哪些数据结构?应用场景是什么?

字符串String、列表List、集合Set、字典Hash、有序集合Sorted Set。

String一般用来存储简单的健值类型,如用户信息、登录信息,还有一种是数值自增、自减操作,如库存扣减。

List一般用来存储列表信息,或作为轻量级的队列,rpush生产消息,lpop消费消息,当lpop没有消息,要适当sleep一会再试,或者blopop,会阻塞直到消息到来。需要注意的是作为队列,没有重试机制,消费完消息,消息在Redis就没有了。

Set作为无序不能重复的集合,一般用来存储无序不能重复的内容,如学生姓名。

Sorted Set作为有序不能重复的集合,一般用来做排行榜,或用来做延时队列,时间戳作为score,消息内容作为key,调用zadd生产消息,zrangebyscore获取N秒之前的数据进行轮询。

四、Redis是如何持久化的?

为什么要持久化?

Redis为了保证效率,数据都是存放在内存中,一旦redis宕机或重启,内存中数据将会丢失,所以redis的数据会周期性的持久化到磁盘中,待机器重启时从磁盘中恢复数据。

持久化策略?

RDB:RDB持久化就是把当前进程数据生成快照文件保存到磁盘的过程

优点:RDB是一个紧凑的的压缩二进制文件,非常适合于备份和全量复制场景,同时恢复比较快。

缺点:没有办法做到实时持久化,持久化的时候redis进程会执行fork创建子进程,rbd的持久化过程由子进程负责,完成后自动结束,fork创建子进程是阻塞的属于重量级操作,频繁执行成本比较高。rdb使用的是特定格式的二进制保存,redis版本演进过程中有多个版本的reb文件,会存在老版本无法兼容新版rdb格式的问题

AOP:以独立日志的方式记录每次的写明命令,重启时执行AOP文件中的命令就能达到恢复数据的命令

Redis默认是以快照RDB的持久化方式,但是重启是会优先使用AOF文件来还原数据。因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。

AOF可以做到全程持久化,配置中开启AOF。这样redis没执行一个修改数据的命令,都会被追加到AOF文件中。我们可以根据需求设置不同的同步测量,例如是每秒同步一次,这样即使发生宕机,重启后最多也丢失一秒钟的数据。所以就造成AOF文件通常要大于RDB文件。所以根据AOF回访恢复数据,可能相对于RDB慢一点。

redis支持同时开启两种持久化方式,所以我们可以综合AOF和RDB两种来选择。用AOF保证数据不丢失,作为恢复的第一选择;用RDB来做不同程度的冷备,这样在AOF文件丢失或者损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。

五、Redis主从复制机制是什么?

主从复制作用?

保存Redis数据副本

当我们只是通过RDB或AOF把Redis的内存数据持久化毕竟只是在本地,并不能保证绝对的安全,而通过将数据同步Slave服务器上,可以保留多一个数据备份,更好地保证数据的安全。

读写分离

在配置了主从复制之后,如果master服务器的读写压力太大,可以进行读写分离,客户端向master服务器写入数据,在读数据时,则访问slave服务器,从而减轻master服务器的访问压力。

 

关于Redis的一些总结_第1张图片

 

高可用性与故障转移

服务器的高可用性是指服务器能提供7*24小时不间断的服务,master可以通过Sentinel系统管理多个redis服务器,当master服务器发生故障时,系统会根据一定的规则将某台slave服务器升级为master服务器,继续提供服务,实现故障转移,保证Redis服务不间断。

主从复制方式?

1)、当master服务器与slave服务器正常连接时,master服务器会发送数据命令流给slave服务器,将自身数据的改变复制到slave服务器。

2)、当因为各种原因master服务器与slave服务器断开后,slave服务器在重新连上master服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。

3)、如果无法部分同步(比如初次同步),则会请求进行全量同步,这时master服务器会将自己的rdb文件发送给slave服务器进行数据同步,并记录同步期间的其他写入,再发送给slave服务器,以达到完全同步的目的,这种方式称为全量复制。

六、如果Redis主节点宕机,redis写服务不能使用,这时候Redis如何主备切换?

Redis使用了哨兵机制来解决这个问题。Redis Sentinel是一个分布式架构,其中包含了若干个数据节点和Sentinel节点,每个Sentinel节点都会对其他Sentinel节点和数据节点进行监控,当它发现节点不可达时,会做下线标识,如果不可达的节点是主节点,它会和其他Sentinel节点协商,当大多数Sentinel节点认为主节点下线时,Sentinel集群会选出一个Sentinel节点,来完成自动故障转移的工作,整个过程是自动的,不需要人工干预。

如图所示:

关于Redis的一些总结_第2张图片

基本的故障转移过程:

1)主节点出现故障,此时两个从节点与主节点断开连接

 关于Redis的一些总结_第3张图片关于Redis的一些总结_第4张图片

2)Sentinel集群每个Sentinel节点通过定期监控发现主节点出了故障

关于Redis的一些总结_第5张图片

3)当大多数Sentinel节点达成一致认为主节点故障,则选取出其中一个Sentinel节点作为领导者,进行故障转移

关于Redis的一些总结_第6张图片

4)Sentinel领导者节点进行了故障转移,整个过程自动完成

关于Redis的一些总结_第7张图片

5)故障转移后,整个Redis Sentinel集群,重新选取了新的主节点

关于Redis的一些总结_第8张图片

七、Redis和Memcached区别?

数据类型:redis支持多种数据结构,memcached仅支持字符串
数据持久化:redis支持RDB镜像持久化,AOF增量持久化(定时同步,如1s/1次),RDB耗时,在停机时丢失大量数据,需要AOF配合,在redis实例重启时,使用RDB持久化文件重新构建内存,再使用AOF重放操作恢复重启前的状态,memcached无持久化 
线程模型:redis是单线程,完全基于内存,代码更清晰,逻辑简单,没有加锁、释放锁的性能消耗,不存在多进程、线程切换消耗CPU,memcached是多线程。
分布式:memcached不支持分布式,只能通过在客户端使用一致性哈希算法,实现分布式存储,这种方式在存储和查询时,都需要在客户端计算一次数据所在的节点。redis cluster实现了分布式的存储
内存管理机制:redis 并非所有数据都在内存中,可将没用数据交换到磁盘,而membcached数据一直在内存中,membcached将内存分割成特定长度块来存储数据,以完全解决内存碎片问题,但是这种内存利用率不高。
 

参考链接:

Redis哨兵机制

Redis Sentinel 与 Redis Cluster 的区别

你可能感兴趣的:(redis,java,redis)