MemoryTable(内存表)

优质
小牛编辑
135浏览
2023-12-01

imi 支持 MemoryTableModel,也支持直接定义和操作MemoryTable。

配置方法

// 内存表配置
'memoryTable'   =>  [
    // name => 配置
    't1'    =>  [
        // 定义字段
        'columns'   =>  [
            ['name' => 'name', 'type' => \Swoole\Table::TYPE_STRING, 'size' => 16],
            ['name' => 'quantity', 'type' => \Swoole\Table::TYPE_INT],
        ],
        'lockId'    =>  'atomic', // 锁 ID,非必设。不配置就不允许使用锁,其它的可以正常用
    ],
    'connectContext'    =>  [
        // 指定实现了 Imi\Util\MemoryTable\IMemoryTableOption 接口的来,来定义表结构
        'class' =>  \Imi\Server\ConnectContext\StoreHandler\MemoryTable\ConnectContextOption::class,
        'lockId'=>  'atomic', // 同上
    ],
],

使用方法

写入

use Imi\Util\MemoryTableManager;
$key = 'a'; // 主键
$value = [
    'name'      =>  'abc',
    'quantity'  =>  123,
];
MemoryTableManager::set($tableName, $key, $value);

读取

// 获取一行
$row = MemoryTableManager::get($tableName, $key);

// 获取单个字段
$field = 'quantity';
$value = MemoryTableManager::get($tableName, $key, $field);

删除

MemoryTableManager::del($tableName, $key);

数据行是否存在

MemoryTableManager::exist($tableName, $key);

原子自增

MemoryTableManager::incr($tableName, $key, $field); // +1
MemoryTableManager::incr($tableName, $key, $field, 123); // +123

原子自减

MemoryTableManager::decr($tableName, $key, $field); // -1
MemoryTableManager::decr($tableName, $key, $field, 123); // -123

获取行数

MemoryTableManager::count($tableName);

加锁执行

需要配置 lockId

MemoryTableManager::lock($tableName, function(){
    // 方法体内部都在锁中执行,执行完自动释放锁
    $row = MemoryTableManager::get($tableName, $key);
    $row['quantity'] = 456;
    MemoryTableManager::set($tableName, $key, $row);
});

实现 IMemoryTableOption 接口

示例代码:

<?php
namespace Imi\Server\ConnectContext\StoreHandler\MemoryTable;

use Imi\Util\MemoryTable\IMemoryTableOption;

/**
 * Swoole 内存表
 */
class ConnectContextOption implements IMemoryTableOption
{
    /**
     * 获取配置
     *
     * @return array
     */
    public function getOption($option = null): array
    {
        if(!$option)
        {
            $option = [];
        }
        if(!isset($option['size']))
        {
            $option['size'] = 65536;
        }
        $option['columns'] = [
            ['name' => 'data', 'type' => \Swoole\Table::TYPE_STRING, 'size' => $option['dataLength'] ?? 1024],
        ];
        return $option;
    }

}