Redis解析之Redis要点

1、Redis特点
① Redis是基于内存的、支持事务和持久化的高性能key-value非关系型NoSQL数据库 —>>> 它将整个数据库的内容加载到数据库进行操作,并定期通过异步操作将数据库数据flush到硬盘上进行保存 —>>> 因为是纯内存操作,所以性能非常出色,可处理的读写次数达10万次/秒
② 支持5种数据类型:string/hash/list(列表)/set(集合,不允许重复)/zset(有序集合,不允许重复) —>>> 单个value的最大限制为1GB,可用来实现多种功能,如list可用作FIFO双向链表,实现消息队列服务。
③ 缺点:数据库容量受物理内存限制,不能用作海量数据的高性能读写,因此适用于数量较少的高性能操作上。

2、Redis为什么是单线程
单纯就网络IO来说,量达到一定程度后,多线程的确有优势,但是Redis操作的对象是内存中的数据结构,若采用多线程,则必须对对象加锁 —>>> 导致同步开销大大增加,吞吐量增大的同时,响应延迟也会增加 —>>> 多线程性能提高的同时,单个线程的效率会严重下降,而且程序逻辑严重复杂化

严格来说,Redis并不是单进程/线程。
1)Redis多进程:BgSave(后台异步保存当前数据库到磁盘)命令执行之后立即返回OK,然后Redis fork一个新子进程。原来的Redis 进程继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
2)Redis多线程:AOF持久化过程中,若持久化模式为AOF_FSYNC_EVERYSEC,则fsync操作被放到一个异步队列中,由线程去执行。

3、Redis为什么要将整个数据库内容放到内存中
磁盘的存取速度远远低于内存的存取速度 —>>> Redis为实现高性能读取,将整个数据库内容读取至内存中,并定期通过异步操作将数据写入磁盘,故Redis具有快速和数据持久化的特征 —>>> 内存越来越便宜的今天,Redis将越受欢迎

4、主从复制、读写分离
Master会将数据同步到Slave,而Slave不会将数据同步到Master。(同步在Master/Slave都是非阻塞的,可继续处理其他请求) —>>> 可利用Master提供数据更新服务,Slave提供数据检索服务,以减少单个Redis Server的并发访问数量(Slave是否可写,有所属Master的配置项slave-read-only决定)。

主从复制分为全量同步和增量同步。

全量同步原理:
一般发生在Slave第一次连接Master阶段。步骤:
① Slave连接Master,并发送sync命令;
② Master收到sync命令后,执行bgsave命令备份数据库至.rdb文件,同时将新收到的写命令存入缓冲区;
③ Master备份完毕后,将.rdb文件发送个Slave,Slave收到文件后,首先将内存清空,然后加载.rdb文件至内存;
④ Master将新收到的保存在缓冲区的命令发送给Slave,Slave收到命令后,执行命令以实现主从同步。

增量同步:
发生在Slave初始化并开始正常工作后。
原理:Master每执行一个写命令,都会向Slave发送相同的写命令,Slave接收并执行写命令。

2.8版本以前,Slave与Master重连,采用全量同步,2.8之后版本采用持续复制处理方式代替全量同步:Master维护着一个缓冲区,用于记录最近发送的写命令,同时Master和Slave各维护着一个偏移量和Master服务器ID。当Slave重连Master时,若Slave断开前连接的Master ID与重连服务器ID相同,并且从断开前至当前的所有写命令都保存在缓冲区内,则Master将该期间内的所有写命令发送给Slave。

6、Redis默认端口:6379(端口号为0时,不监听TCP套接字。)。

7、为什么调用write把数据写入到文件之后,还需要调用fsync函数?
大多数unix系统为了减少磁盘IO,采用了“延迟写”技术,因此当执行write调用后,数据并不一定立马被写入磁盘(可能还是保留在系统缓存中)。假若主机断电,则这些数据可能就会丢失,所以当我们需要确保数据被完整正确的写入磁盘(譬如数据库的持久化),则需要调用同步函数fsync,它会一直阻塞直到数据全部被写入到硬盘。

8、Redis协议:

*<参数数量>\r\n
$<参数 1 的字节数量>\r\n
<参数 1 的数据>\r\n
...
$<参数 N 的字节数量>\r\n
<参数 N 的数据>\r\n
如:SET mykey myvalue

*3
$3
SET
$5
mykey
$7
myvalue

9、AOF持久
AOF文件存储Redis协议
AOF文件越来越大时,优化重写:
AOF_REWRITE触发条件:
1)被动: 当AOF文件尺寸超过REDIS_AOF_REWRITE_MIN_SIZE & 达到一定增长比;
2)主动: 调用BgRewriteAof命令;

AOF_REWRITE的主动和被动方式基本相同,唯一的区别就是,通过BGREWRITEAOF命令执行的AOF_REWRITE(主动)是在一个子进程中进行,而被动方式由于是在主进程中进行,因此主动方式不会阻塞主进程对客户端请求的处理。

主动调用问题:
当主动方式去执行AOF_REWRITE时,因为主进程没有被阻塞,那么在保存AOF文件期间,“键空间”可能发生变化,若直接用新生成的文件去替换原来的AOF文件,就会造成数据的不一致性(丢失在AOF_REWRITE过程中更新的数据)
redis的解决方案:
如果redis检测到有一个子进程正在进行AOF_REWRITE,则它会把这期间所有变更命令写到AOF重写缓存(aof_rewrite_buf_blocks),然后当子进程完成AOF_REWRITE后,它会再把AOF重写缓存中的内容追加到新生成文件。

10、Redis应用场景
1)取最新的N条数据:list
如网站最新文章
(文章ID)插入表头:lpush key value1 [value2]
对列表进行修剪,只保留5000条数据:ltrim key 0 5000
2)设定过期时间:zsort(或游戏积分排行榜)
score设置为过期的时间戳(游戏积分)
zRemRangeByScore key min max
3)Uniq操作:set
set会自动去重
4)队列系统
list可构建队列系统
zsort可构建具有优先级的队列系统

11、3种集群方式
1)高可用性集群(High availability cluster,HAC):当Master发生故障而无法对外提供服务时,Slave可接替Master对外提供服务。
2)负载均衡集群(Load balance cluster, LBC):集群中每一台机器都能对外提供服务,当收到请求之后,集群会选择负载最小、能够最好提供服务的机器来接受请求。
3)科学群集 、高性能集群(High performance cluster,HPC):将一个任务被分成若干个子任务,集群中各机器分别负责其中一个子任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值