IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> redis协议-yii2源码理解 -> 正文阅读

[大数据]redis协议-yii2源码理解

0. redis 协议 图示

?

1. client一端的收发数据处理

(有时间研究下 redis server 一端的 收发数据处理)

? ?client发送数据给 redis server

*参数数量\r\n? ? $参数字节数\r\n参数数据\r\n

2. 封包encode

/**
 * Executes a redis command.
 * For a list of available commands and their parameters see http://redis.io/commands.
 *
 * The params array should contain the params separated by white space, e.g. to execute
 * `SET mykey somevalue NX` call the following:
 *
 * ```php
 * $redis->executeCommand('SET', ['mykey', 'somevalue', 'NX']);
 * ```
 */
public function executeCommand($name, $params = [])
{
    $this->open();

    $params = array_merge(explode(' ', $name), $params);
    $command = '';
    $paramsCount = 0;
    foreach ($params as $arg) {
        if ($arg === null) {
            continue;
        }

        $paramsCount++;
        $command .= '$' . mb_strlen($arg, '8bit') . "\r\n" . $arg . "\r\n";
    }
    $command = '*' . $paramsCount . "\r\n" . $command;

3. 发送数据,发送到连接socket的缓冲区

private function sendCommandInternal($command, $params)
{
    $written = @fwrite($this->_socket, $command);

4. 返回包的 格式

+? 简单字符串回复 ? ;? + 状态描述字符串 \r\n

-? ?错误回复 ;? -? 错误类型字符串 空格? 错误描述字符串? \r\n

: ? 整数回复;? :? 整数字符串 \r\n

$? ? 二进制安全字符串回复( bulk strings reply) ; ? $? 回复数据字节数? \r\n ? 回复数据? \r\n

? *? 批量回复(arrays reply) ; ? * 回复数量? \r\n? [后边都是其他回复类型的格式]? … [后边都是其他回复类型的格式]

5.? 从连接socket 读取数据 & 从应用程序缓冲区 获取一个包 & 解包decode?

($line = fgets($this->_socket)) === false)

//从连接socket的接收缓冲区读取数据
if (($line = fgets($this->_socket)) === false) {
     ...
}


$type = $line[0];
$line = mb_substr($line, 1, -2, '8bit');   //去掉后边的\r\n
switch ($type) {
    case '+': // Status reply
        ...
    case '-': // Error reply
    ...


第一个字节来区分 包的类型

+   状态描述字符 ,   OK,    PONG
- 

$   
	如果是 $-1\r\n   

	数据的长度:$length = (int)$line + 2;   //包括后边的\r\n
	采取 循环的读, 直到读不出数据 / 
while ($length > 0) {
    if (($block = fread($this->_socket, $length)) === false) {
        ......
    }
    $data .= $block;
    $length -= mb_strlen($block, '8bit');
}

    //把读取到的数据,去掉最后的两个字节(\r\n)
    mb_substr($data, 0, -2, '8bit');


 *   
     *数量\r\n   [后边都是其他回复类型的格式] … [后边都是其他回复类型的格式]  
     循环地处理 [后边都是其他回复类型的格式];
	循环地 decode

6. pipeline 有些客户端会实现 pipeline 怎么实现的,原理是?

注意 pipeline 不对应特殊的协议规则,只是客户端把几个命令一起发送给服务端,而不必等收到redis server的回复后再发送下一个命令

9. 相关链接

官网协议文档:http://www.redis.cn/topics/protocol.html

10. redis server 收发数据处理

todo

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:09:28  更:2021-09-27 14:10:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:49:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码