redis协议怎么写-Redis 协议详解怎么写
猜您喜欢::陕西传媒网简介-陕西传媒网简介 学卤菜培训去哪-学卤菜培训正规机构 股票绿色什么意思(绿色代表环保) xs是什么意思和含义(XS含义不明) 你给他讲道理-讲道理不如讲感情 足球小将中学队友-中学足球队友 假四六级证书被中石油查嘛(假四六级中石油查) 九江学院很恐怖(九江学院很吓人) 什么是直销银行专属(直销银行专属定义) 世界聋人节是几月几日(10 月第三个周日)
接个红数据,还是得先搞清楚它是干嘛的。说白了,Redis 就是个在内存里跑得飞快的数据库,专门用来存东西、查东西、删东西。拿个手机打个例,你平时在微信里搜个热搜,淘宝上看个大促,后台那玩意儿实际上就是内存里那一堆悬浮窗里的数据。它不常驻硬盘,省了空间,但读的时候得从内存里翻,故此速度飞快,能扛住几百万就连上千万的连接,只要流量不爆炸。 那它到底传输啥呢?协议这东西,就是两条线,一条是发指令的信号,另一条是收到信号的响应当。
你看 Redis 官方文档里总提那个红黑谱要么 JSON 的,那是整篇代码里的术语,实际干活时,你手里处理的可是两类报文:一种是管住指令,比如 `GET`、`SET`、`DEL`、`INCR`,还有 `PING` 这种心跳包,这些都是用二进制流传出来的,一串串 0 和 1 连成串,速度快,不用额外封装成对象,直接塞进缓冲区。
还有一种是数据本身,Redis 默认用的是 JSON 格式,出于它好办,兼容性好,不管是数字、字符串还是哈希表,最终总能变回 JSON 字符串给你。自然,为了极致性能,Redis 也赞成 NCL 这种更底层的二进制协议,特别在高并发场景下,把 JSON 拆成二进制块处理,传输吞吐直接翻倍,但在这种协议上调试要么老旧版本兼容起来,成本又高,故此咱们日常开发大多还是停留在 JSON 时代。 那具体如何发呢?还是得看数据结构。字符串最好办,`SET key value` 要么 `GET key`,这俩操作底层直接操作内存里的 key-value 对,传输过程就是指令 + 对应的 JSON 字符串。哈希表略微复杂点,`HSET`、`HGET` 这些命令,出于它得有键值对应,故此 JSON 结构会更丰富,务必包含 key、value 这俩字段,还得带上 tag 和 namespaces 这些信息,不然接收方就不知道是哪个数据库的。
还有哈希成员,`HMSET` 这种操作,里面得有一堆 member 对象,每个 member 都要有 hash key 和 value,结构略微乱一点。 说到数据量,那会儿写脚本可能认定 JSON 有点慢,目前数据量大了才发现,协议层实际上占了大头。假设你要存 100 万个 key-value 对,每条指令包含 JSON 头、命令名、参数(key 和 value),再加上之前的连接握手,那二进制流下来的实际内存占用得能跑个几百兆。
这时候想想,要是不用二进制协议,全是文本转乱码,要么对象转 JSON,那磁盘 IO 压力就大了,读写延迟也会指数级上升,业务性能直接掉线。
故此,协议设计的时候,得寻思如何把这些指令压缩,如何把二进制流切成小块,如何在发送和接收时做缓存,避免每次都重新序列化。 不过在协议层面,实际上也分角色。发送端是 Writer,收到端是 Reader;发送端是 Reader,收到端是 Writer;发送端是 Writer,收到端是 Writer。
这些角色别看名字听起来差不多,但在协议设计时,它们的职责挺明确:Writer 负责把数据结构打包成 JSON 要么二进制流,要是是要用 NCL 协议,还得负责拆包、写偏移量;Reader 负责解析这些流,要是数据结构是 JSON 字符串,就把它拆成对象;要是是二进制流,就从头读取,解析命令,解析参数。中间还得有个处理层,把 JSON 对象变成 Map,把二进制流变成 Map。
有时候还要加个序列化层,比如用 Protobuf 要么自定义的 Token 来传输,这时候协议就复杂多了。 另外,协议里还有状态管理这块,别看 Redis 是单线程的,但这不代表传输没状态。
比如 `EXPIRE` 命令,它得告诉服务器这个 key 过期工夫到了,服务器得去更新过期工夫,这时候服务器端就要知道 key 的状态变了。
还有连接管理,长连接中,要是用户断开,服务器得知道连接断开了,这时候连接状态得从 ACTIVE 变成 INACTIVE,就连可能触发重连逻辑。
这些状态变化是在协议层面的,需求记录在连接的上下文里,不能丢。 还有,协议还得寻思扩展性。Redis 目前赞成大量新功能,比如 ZSet 的 ZRANGE、ZREVRANGE,要么新型的数据结构,这时候协议就得赞成这些新命令。
要是协议改了,那现有的应用程序就得兼容,这可不是一件好办的事。
有时候为了兼容旧版本,还得在协议里加个版本字段,就像你在查版本一样,告诉对方你是啥版本,对方再拍板如何反序列化。 实际上,Redis 协议的核心思想就是“好办高效”。它不追求彻底对齐,出于内存访问才是王道,协议只是拿来传数据的。
只要指令清楚,数据结构明确,传输速度就稳。自然,实际开发中,协议定义也要灵活,不能把所有字段都写死,有时候为了性能,某些参数能够动态生成,要么只在特定场景下才传。
总而言之,协议不是死的代码,是业务逻辑和数据传输的中间件,得跟着业务走,跟着变化来。
相关标签: