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

相关文章

  • MySQL中字符串比较大小详解(日期字符串比较问题)

    MySQL中字符串比较大小是在字符串类型使用的场景中常见的问题,其中包括日期字符串的比较。下面是MySQL中字符串比较大小的详细攻略,其中包含两条示例说明。 一、MySQL中字符串的比较操作 MySQL中的字符串比较操作是基于字符编码的,字符编码决定了字符串的比较结果。对于相同的字符串,如果采用不同的字符编码将会得到不同的比较结果。 当比较两个字符串时,My…

    database 2023年5月22日
    00
  • CentOS 7下安装与配置MySQL 5.7

    下面是详细的篇章介绍: CentOS 7下安装MySQL 5.7的步骤 更新系统包: sudo yum update 添加MySQL 5.7的yum源: sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 安装MySQL 5.7: sudo y…

    database 2023年5月22日
    00
  • redis 性能监控和排查

    redis出现瓶颈的问题,现在把排查的一些经验记录下来备查,本篇只是思路的整理,不涉及具体的使用。    大体的思路如下:   1.通过slow log查看      参考 http://www.cnblogs.com/onmyway20xx/p/5486604.html   查看下是否有较为明显的慢查询?一般认为出现慢查询的话,redis性能瓶颈已经比较明…

    Redis 2023年4月11日
    00
  • redis中Could not get a resource from the pool异常及解决方案

    当使用Redis作为缓存系统时,由于其高性能和高可用性,被广泛使用。但有时候,我们可能会遇到相应的异常。其中一个常见的异常是“Could not get a resource from the pool”(无法从池中获取资源)。 1. 异常原因 无法从池中获取资源的异常是由于Redis连接意外断开或者连接池中没有空闲连接。当我们在系统中频繁地连接和释放Red…

    database 2023年5月22日
    00
  • linux使用scp实现服务器A向服务器B传输文件

    以下是详细讲解“linux使用scp实现服务器A向服务器B传输文件”的完整攻略: 什么是scp? Secure Copy(SCP)是指在网络上进行安全文件传输的一种方式,基于SSH协议进行加密传输,类似于linux中的cp命令,但是可以安全地将文件传输到远程服务器。 如何使用scp? 使用scp需要注意的是服务器之间必须开启ssh服务,同时进行连接的账户也需…

    database 2023年5月22日
    00
  • mysql 操作数据库基础详解

    MySQL 操作数据库基础详解 MySQL 是一种基于关系型数据库管理系统的开源软件。它能够提供数据存储、访问和管理的能力。MySQL 操作数据库有多种方式,包括使用命令行、使用图形用户界面和使用编程语言对数据库进行操作。在本文中,我们将介绍如何使用命令行方式操作 MySQL 数据库。 连接 MySQL 数据库 在进行任何操作之前,必须先连接到数据库。使用以…

    database 2023年5月22日
    00
  • mybatis 有时update语句执行无效的解决方案

    要解决MyBatis中Update语句无效的问题,可以从以下几个方面入手: 1.检查SQL语句 首先,应该检查Update语句本身是否正确。具体来说,需要检查: Update基本语法是否正确,例如表名、列名的拼写、大小写等; SQL逻辑是否正确,例如Update语句的条件是否恰当、是否错漏等。 若SQL语句本身无误,则应检查MyBatis的配置文件和Java…

    database 2023年5月18日
    00
  • IDEA 自动生成 JPA 实体类的图文教程

    下面是关于“IDEA 自动生成 JPA 实体类的图文教程”的详细攻略。 什么是 JPA JPA(Java Persistence API)是 JDK 5.0新引入的一组持久化API,它包含了一系列Java API的标准,可用于管理Java应用中的关系型数据。使用JPA可以方便地将Java对象映射为关系型数据库中的表。 为什么要使用 IDEA 自动生成 JPA…

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