MemoryTable

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

配置方法

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

使用方法

写入

  1. use Imi\Util\MemoryTableManager;
  2. $key = 'a'; // 主键
  3. $value = [
  4. 'name' => 'abc',
  5. 'quantity' => 123,
  6. ];
  7. MemoryTableManager::set($tableName, $key, $value);

读取

  1. // 获取一行
  2. $row = MemoryTableManager::get($tableName, $key);
  3. // 获取单个字段
  4. $field = 'quantity';
  5. $value = MemoryTableManager::get($tableName, $key, $field);

删除

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

数据行是否存在

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

原子自增

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

原子自减

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

获取行数

  1. MemoryTableManager::count($tableName);

加锁执行

需要配置 lockId

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

实现 IMemoryTableOption 接口

示例代码:

  1. <?php
  2. namespace Imi\Server\ConnectContext\StoreHandler\MemoryTable;
  3. use Imi\Util\MemoryTable\IMemoryTableOption;
  4. /**
  5. * Swoole 内存表
  6. */
  7. class ConnectContextOption implements IMemoryTableOption
  8. {
  9. /**
  10. * 获取配置
  11. *
  12. * @return array
  13. */
  14. public function getOption($option = null): array
  15. {
  16. if(!$option)
  17. {
  18. $option = [];
  19. }
  20. if(!isset($option['size']))
  21. {
  22. $option['size'] = 65536;
  23. }
  24. $option['columns'] = [
  25. ['name' => 'data', 'type' => \Swoole\Table::TYPE_STRING, 'size' => $option['dataLength'] ?? 1024],
  26. ];
  27. return $option;
  28. }
  29. }