|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 640|回復: 0
打印 上一主題 下一主題

Redis 使用的什么协议

[複製鏈接]

56

主題

0

好友

475

積分

中學生

Rank: 3Rank: 3

  • TA的每日心情

    2024-3-15 19:20
  • 簽到天數: 191 天

    [LV.7]常住居民III

    推廣值
    0
    貢獻值
    0
    金錢
    179
    威望
    475
    主題
    56
    樓主
    發表於 2020-11-23 16:28:33

    现在就来看一下 AOF 和 RESP 协议的关系

    • 从两种持久化方式说起。
    • RESP 协议是什么
    • 动手实现一个简单的协议解析命令行工具

    先从持久化说起,虽然一提到 Redis,首先想到的就是缓存,但是 Redis 不仅仅是缓存这么简单,它的定位是内存型数据库,可以存储多种类型的数据结构,还可以当做简单消息队列使用。既然是数据库,持久化功能是必不可少的。

    Redis 的两种持久化方式

    Redis 提供了两种持久化方式,一种是 RDB 方式,另外一种是 AOF 方式,AOF 是目前比较流行的持久化方案。

    RDB 方式

    RDB持久化是通过快照的方式,在指定的时间间隔内将内存中的数据集快照写入磁盘。它以一种紧凑压缩的二进制文件的形式出现。可以将快照复制到其他服务器以创建相同数据的服务器副本,或者在重启服务器后恢复数据。RDB是Redis默认的持久化方式,也是早期版本的必须方案。

    RDB 由下面几个参数控制。

    • # 设置 dump 的文件名
    • dbfilename dump.rdb
    • # 持久化文件的存储目录
    • dir ./
    • # 900秒内,如果至少有1个key发生变化,就会自动触发bgsave命令创建快照
    • save 900 1
    • # 300秒内,如果至少有10个key发生变化,就会自动触发bgsave命令创建快照
    • save 300 10
    • # 60秒内,如果至少有10000个key发生变化,就会自动触发bgsave命令创建快照
    • save 60 10000

    持久化流程

    上面说到了配置文件中的几个触发持久化的机制,比如 900 秒、300秒、60秒,当然也可以手动执行命令 save或bgsave进行触发。bgsave是非阻塞版本,通过 fork 出子进程的方式来进行快照生成,而 save会阻塞主进程,不建议使用。

    1、首先 bgsave命令触发;

    2、父进程 fork 出一个子进程,这一步是比较重量级的操作,也是 RDB 方式性能不及 AOF 的一个重要原因;

    3、父进程 fork 出子进程后就可以正常的相应客户端发来的其他命令了;

    4、子进程开始进行持久化工作,对现有数据进行完整的快照存储;

    5、子进程完成操作后,通知父进程;

    RDB的优点:

    • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据 快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份, 并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
    • Redis加载RDB恢复数据远远快于AOF的方式。

    RDB的缺点:

    • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
    • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式 的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

    AOF 方式

    AOF 由下面几个参数控制。

    • # appendonly参数开启AOF持久化
    • appendonly yes
    • # AOF持久化的文件名,默认是appendonly.aof
    • appendfilename "appendonly.aof"
    • # AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的
    • dir ./
    • # 同步策略
    • # appendfsync always
    • appendfsync everysec
    • # appendfsync no
    • # aof重写期间是否同步
    • no-appendfsync-on-rewrite no
    • # 重写触发配置
    • auto-aof-rewrite-percentage 100
    • auto-aof-rewrite-min-size 64mb
    • # 加载aof出错如何处理
    • aof-load-truncated yes
    • # 文件重写策略
    • aof-rewrite-incremental-fsync yes

    针对RDB不适合实时持久化的问题,Redis提供了AOF 持久化方式来解决,AOF 也是目前最流程的持久化方式。

    AOF(append only file),以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。

    1、所有的写入命令会追加到aof_buf(缓冲区)中;

    2、AOF缓冲区根据对应的策略向硬盘做同步操作;

    3、随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的;

    4、当Redis服务器重启时,可以加载AOF文件进行数据恢复;

    AOF 文件里存的是什么

    我在本地的测试 redis 环境中随便刷了几条命令,然后打开 appendonly.aof 文件查看,发现里面的内容像下面这样子。

    RESP 协议Redis客户端与服务端通信,使用 RESP 协议通信,该协议是专门为 Redis 设计的通信协议,但也可以用于其它客户端-服务器通信的场景。

    RESP 协议

    有如下几个特点:

    • 实现简单;
    • 快速解析;
    • 可阅读;

    客户端发送命令给服务端,服务端拿到命令后进行解析,然后执行对应的逻辑,之后返回给客户端,当然了,这一发一回复都是用的 RESP 协议特点的格式。

    一般情况下我们会使用 redis-cli或者一些客户端工具连接 Redis 服务端。

    • ./redis-cli

    然后整个交互过程的命令发送和返回结果像下面这样,绿色部分为发送的命令,红色部分为返回的结果。

    这就是我们再熟悉不过的部分了。但是,这并不能看出 RESP 协议的真实面貌。

    用 telnet 试试

    RESP 是基于 TCP 协议实现的,所以除了用各种客户端工具以及 Redis 提供的 redis-cli工具,还可以用 telnet 查看,用 telnet 就可以看出 RESP 返回的原始数据格式了。

    我本地的 Redis 是用的默认 6379 端口,并且没有设置 requirepass ,我们来试一下用 telnet 连接。

    • telnet 127.0.0.1 6379

    然后执行与前面相同的几条命令,发送和返回的结果如下,绿色部分为发送的命令,红色为返回的结果。

    怎么样,有些命令的返回还好,但是像get str:hello这条,返回的结果除了 world值本身,上面还多了一行 $5,是不是有点迷糊了。

    协议规则

    请求命令

    一条客户端发往服务器的命令的规则如下:

    • *<参数数量> CR LF
    • $<参数 1 的字节数量> CR LF
    • <参数 1 的数据> CR LF
    • ...
    • $<参数 N 的字节数量> CR LF
    • <参数 N 的数据> CR LF

    RESP 用\r\n作为分隔符,会表明此条命令的具体参数个数,在命令上看来,空格分隔的都表示一个参数,例如 set str:hello world 这条命令就是3个参数,会表明每个参数的字符数和具体内容。


    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-5-16 04:20 , Processed in 0.085564 second(s), 25 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部