利用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日

相关文章

  • redis数据库操作的C++简单封装

    用c++简单封装了redis的基本操作(hiredis) 接口包括:①链接和断开连接、②设置键值对(set)、③查询键值对(get)、④删除键值对(del)、⑤将所有键显示出来 若任何一处发生错误,返回对应的错误状态码,同时可以调用getErrorMsg()查看错误信息 所有码包括: M_REDIS_OK = 0, //执行成功 M_CONNECT_FAIL…

    Redis 2023年4月13日
    00
  • Codeigniter操作数据库表的优化写法总结

    下面是关于Codeigniter操作数据库表的优化写法总结的完整攻略。 一、Codeigniter操作数据库表的基本优化 Codeigniter是一个快速的PHP轻量级Web应用程序开发框架,它可以协助开发者快速而且简单的创建Web应用程序。在Codeigniter中操作数据库表的优化关键有以下几点: 1. 数据库优化 在操作数据库表之前,需要对数据库进行优…

    database 2023年5月19日
    00
  • php mssql扩展SQL查询中文字段名解决方法

    首先我们来详细讲解一下”php mssql扩展SQL查询中文字段名解决方法”的完整攻略。 问题分析 在使用php扩展的mssql进行SQL查询时,如果查询语句中包含中文字段名,可能会出现乱码或者无法查询到数据的情况。这是因为mssql扩展在处理中文字段名时,会将中文转换成UTF-16编码,导致数据库无法正确识别。 解决方法 解决这个问题的方法比较简单。我们可…

    database 2023年5月18日
    00
  • Java的MyBatis框架中MyBatis Generator代码生成器的用法

    下面是Java的MyBatis框架中MyBatis Generator代码生成器的用法的完整攻略。 什么是MyBatis Generator? MyBatis Generator是一个可以基于MyBatis框架自动生成Java持久层代码的工具,可以快速地创建对数据库表的增、删、改、查的操作类、POJO类及其映射映射文件等,简化了持久层代码的编写工作。 MyB…

    database 2023年5月18日
    00
  • Linux运维MySQL必会面试题100道

    Linux运维MySQL必会面试题100道攻略 前言 MySQL是Linux系统下常见的关系型数据库管理系统之一,常用于Web应用程序的后端数据库。对于Linux运维人员来说,熟练掌握MySQL的使用和管理是非常重要的技能之一。在面试过程中,往往会考察一些MySQL相关的技术知识。本文汇总了100道MySQL面试题及其答案,旨在为Linux运维人员提供参考和…

    database 2023年5月22日
    00
  • 修改Oracle监听默认端口号1521的方法

    修改Oracle监听默认端口号1521的方法可以通过以下步骤: 1. 确认当前监听的状态 先确认一下当前监听的状态,可以使用以下命令查看: lsnrctl status 如果结果中有如下输出,则表示Oracle数据库的监听已经启动: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT…

    database 2023年5月22日
    00
  • windows下mysql数据库主从配置教程

    下面我来为你详细讲解“windows下mysql数据库主从配置教程”的完整攻略。 1. 简介 MySQL主从复制是指将一个MySQL数据库的操作记录自动同步到其他MySQL数据库服务器上,以实现多台MySQL服务器数据完全相同,保持数据的一致性和高可用性。在Windows下,配置MySQL主从复制可以使用MySQL官方提供的命令行工具。 2. 步骤 2.1.…

    database 2023年5月22日
    00
  • node使用Mongoose类库实现简单的增删改查

    接下来我将详细讲解如何使用Node.js和Mongoose类库实现简单的增删改查操作。 准备工作 在开始之前,请确保你已经正确安装了Node.js和Mongoose类库,并且已经连接到了MongoDB数据库。 创建Mongoose模型 在使用Mongoose进行增删改查操作之前,我们需要先创建一个Mongoose模型,该模型会映射到MongoDB中的一个集合…

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