利用swoole+redis实现股票和区块链服务

利用swoole与redis实现股票和区块链服务,具体包含以下几个步骤。

1. 环境准备

需要安装、配置以下软件。

  • swoole
  • redis
  • PHP版本 >= 7.0

在安装完以上软件后,需要在php.ini中开启swoole和redis扩展。

2. 实现股票服务

2.1 设计数据结构

在redis中,我们可以使用HashTable(Hash)类型来保存每一个股票的信息,以股票代码作为键名,股票相关的信息作为键值。

# 举个例子(swoole股票小程序)
# 上证指数的编号为000001
# HK股票海底捞的编号为06862
hset stock 000001 "{\"name\":\"上证指数\",\"price\":\"3400.00\",\"rate\":\"1.23%\"}"
hset stock 06862 "{\"name\":\"香港海底捞\",\"price\":\"64.50\",\"rate\":\"3.50%\"}"

2.2 创建服务端

我们使用swoole的Server类来创建服务端,然后监听客户端请求,进行数据处理。

$server = new Swoole\Server('0.0.0.0', 9502, SWOOLE_BASE);

$server->on('Connect', function ($serv, $fd) {
    echo "Client: Connect.\n";
});

$server->on('Receive', function ($serv, $fd, $from_id, $data) {
    $params = unserialize($data);
    if ($params['action'] === 'getStockInfo') {
        $stockCode = $params['param'];
        $stockInfo = redis_client->hget('stock', $stockCode);
        $serv->send($fd, $stockInfo);
    }
});

$server->on('Close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

$server->start();

2.3 创建客户端

在客户端使用swoole的Client类,可以通过send向服务端发送数据,然后接收服务端处理后的响应结果。

$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9502, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}

$client->send(serialize(['action' => 'getStockInfo', 'param' => '000001']));
$response = $client->recv();

echo $response;
$client->close();

2.4 示例

如下所示,我们可以使用上面的客户端代码获取股票代码为“000001”的信息。

$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 9502, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}

$client->send(serialize(['action' => 'getStockInfo', 'param' => '000001']));
$response = $client->recv();

echo $response;
$client->close();

3. 实现区块链服务

3.1 设计数据结构

在redis中,我们可以使用List类型来保存每一块区块链信息,以块号作为键名,块中相关的信息作为键值。

# 举个例子
# 区块1
rpush blockchain 1 "{\"from\":\"user1\",\"to\":\"user2\",\"owner\":\"github\",\"value\":\"100\"}"
# 区块2
rpush blockchain 2 "{\"from\":\"user3\",\"to\":\"user4\",\"owner\":\"github\",\"value\":\"200\"}"
# 区块3
rpush blockchain 3 "{\"from\":\"user4\",\"to\":\"user2\",\"owner\":\"alipay\",\"value\":\"300\"}"

3.2 创建服务端

服务端也是使用swoole的Server类来创建服务端,然后监听客户端请求,进行数据处理。

$server = new Swoole\Server('0.0.0.0', 9503, SWOOLE_BASE);

$server->on('Connect', function ($serv, $fd) {
    echo "Client: Connect.\n";
});

$server->on('Receive', function ($serv, $fd, $from_id, $data) {
    $params = unserialize($data);
    if ($params['action'] === 'addBlock') {
        $blockInfo = $params['param'];
        $blockchainLength = redis_client->llen('blockchain');
        $lastBlock = redis_client->lindex('blockchain', $blockchainLength - 1);
        $lastBlockHash = hash('sha256', $lastBlock);
        $newBlock = [
            'index' => $blockchainLength + 1,
            'hash' => hash('sha256', json_encode($blockInfo).$lastBlockHash),
            'timestamp' => time(),
            'data' => $blockInfo,
        ];
        redis_client->rpush('blockchain', json_encode($newBlock));
        $serv->send($fd, json_encode($newBlock));
    }
});

$server->on('Close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

$server->start();

3.3 创建客户端

在客户端使用swoole的Coroutine\Http\Client类,可以通过post向服务端发送数据,然后接收服务端处理后的响应结果。

Coroutine\run(function () {
    $cli = new Coroutine\Http\Client('127.0.0.1', 9503);
    $cli->set(['timeout' => 2]);
    $cli->post('/', [
        'action' => 'addBlock',
        'param' => [
            'from' => 'user1',
            'to' => 'user2',
            'owner' => 'github',
            'value' => '100',
        ]
    ]);
    $response = $cli->body;

    echo $response;
});

3.4 示例

如下所示,我们可以使用上面的客户端代码向区块链中增加一个区块,其中包含了转账信息。

Coroutine\run(function () {
    $cli = new Coroutine\Http\Client('127.0.0.1', 9503);
    $cli->set(['timeout' => 2]);
    $cli->post('/', [
        'action' => 'addBlock',
        'param' => [
            'from' => 'user1',
            'to' => 'user2',
            'owner' => 'github',
            'value' => '100',
        ]
    ]);
    $response = $cli->body;

    echo $response;
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用swoole+redis实现股票和区块链服务 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Oracle表字段的增删改、表的重命名及主键的增删改

    Oracle表字段的增删改 在Oracle数据库中,我们可以通过ALTER TABLE语句来进行表字段的增删改。 1. 表字段的添加 我们可以通过以下SQL语句,在指定表中添加一个新的字段: ALTER TABLE <table_name> ADD <column_name> <data_type> [DEFAULT &l…

    database 2023年5月21日
    00
  • 【数据库】7.0 MySQL入门学习(七)——MySQL基本指令:帮助、清除输入、查询等

    1.0 help == ? 帮助指令,查询某个指令的解释、用法、说明等。详情参考博文: 【数据库】6.0 MySQL入门学习(六)——MySQL启动与停止、官方手册、文档查询  https://www.cnblogs.com/xiaofu007/p/10301005.html  2.0 在cmd命令行中,输入“”ysql –help”,可以查看由mysql…

    MySQL 2023年4月12日
    00
  • MySQL: LEAVE Statement

    https://www.techonthenet.com/mysql/loops/leave.php   This MySQL tutorial explains how to use the LEAVE statement in MySQL with syntax and examples. Description In MySQL, the LEAVE …

    MySQL 2023年4月13日
    00
  • SQL实现查询某字段的值为空的记录

    要查询某个字段的值为空的记录,在 SQL 中可以使用 IS NULL 来进行。下面是 SQL 实现查询某字段的值为空的记录的攻略和示例: 基础查询语句 查询某个字段的值为空的记录,可以使用如下的 SQL 查询语句: SELECT * FROM 表名 WHERE 字段名 IS NULL; 其中,字段名代表需要查询的字段名称,表名代表需要查询的表格名称。 例如,…

    database 2023年5月21日
    00
  • Python操作Redis的5种数据类型

    1.连接redis(两种方式) # decode_responses=True: 解决获取的值类型是bytes字节问题 r = redis.Redis(host=’localhost’, port=’6379′, db=0, decode_responses=True)    pool = redis.ConnectionPool(host=’localho…

    Redis 2023年4月12日
    00
  • SQL Optimizer 详细解析

    SQL Optimizer 详细解析攻略 简介 SQL Optimizer 是一个用于分析 SQL 语句的性能问题和优化的工具,它可以帮助用户识别出潜在的性能问题,并提供优化建议,从而使 SQL 语句的执行效率得到提高。本篇攻略将详细解析 SQL Optimizer 的使用方法和步骤,并提供示例说明。 步骤 1. 准备工作 使用 SQL Optimizer …

    database 2023年5月19日
    00
  • Ubuntu Mysql 5.7 datadir 数据目录的修改

    今天要修改一下Ubuntu下mysql 5.7 的数据目录,发现无论怎么折腾文件 /etc/mysql/my.cnf   重启后都无效,在网上查看的相关的文档,说是要修改apparmor的文件,借此整理了一下文档,将步骤写到下面。 系统的的版本信息: dc@dc-virtual-machine:~$ uname -a Linux dc-virtual-mac…

    MySQL 2023年4月16日
    00
  • apache负载均衡的安装和实现方法

    Apache负载均衡的安装和实现方法 安装Apache 首先需要安装Apache服务器,在Linux系统上可以使用以下命令安装: sudo apt-get update sudo apt-get install apache2 安装mod_proxy模块 安装mod_proxy模块可以让Apache支持代理功能,用于实现负载均衡。使用以下命令安装: sudo…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部