一、个人案例

//创建内存表对象
$table=new swoole_table(1024);①

//在内存表中定义三列
$table->column('id',\Swoole\Table::TYPE_INT,4);②
$table->column('name',\Swoole\Table::TYPE_STRING,12);
$table->column('age',\Swoole\Table::TYPE_INT,4);

//在内存中创建内存表
$table->create();③
//设置行的数据,Table使用key-value的方式来访问数据。
$table->set("liuao",['id'=>1,'name'=>'liuao','age'=>20]);④

//获取一行数据
print_r($table->get('liuao'));⑤

①:Table->__construct 创建内存表。
函数原型

function Table->__construct(int $size, float $conflict_proportion = 0.2)

参数

$size参数指定表格的最大行数,如果$size不是为2的N次方,如1024、8192,65536等,底层会自动调整为接近的一个数字,如果小于1024则默认成1024,即1024是最小值
table占用的内存总数为 (结构体长度 + KEY长度64字节 + 行尺寸$size) * (1.2预留20%作为hash冲突) * (列尺寸),如果机器内存不足table会创建失败
set操作能存储的最大行数与$size正相关,但不完全一致,如$size为1024实际可存储的行数小于1024

(1)Table基于行锁,所以单次set/get/del在多线程/多进程的环境下是安全的
(2)set/get/del等方法是原子操作,用户代码中不需要担心数据加锁和同步的问题

②:Table->column 内存表增加一列
函数原型

bool Table->column(string $name, int $type, int $size = 0);

参数

$name指定字段的名称
$type指定字段类型,支持3种类型,Table::TYPE_INT, Table::TYPE_FLOAT, Table::TYPE_STRING
$size指定字符串字段的最大长度,单位为字节。字符串类型的字段必须指定$size

类型

Table::TYPE_INT默认为4个字节,可以设置1,2,4,8一共4种长度
Table::TYPE_STRING设置后,设置的字符串不能超过此长度
Table::TYPE_FLOAT会占用8个字节的内存

③:Table->create 创建内存表
函数原型

function Table->create() : bool;

定义好表的结构后,执行create向操作系统申请内存,创建表
调用create之前不能使用set、get等数据读写操作方法
调用create之后不能使用column方法添加新字段
系统内存不足,申请失败,create返回false
申请内存成功,create返回true

(1)Table使用共享内存来保存数据,在创建子进程前,务必要执行Table->create()
(2)Server中使用Table,Table->create() 必须在Server->start()前执行

内存尺寸

使用create方法创建表后,可以读取$table->memorySize属性获取实际占用内存的尺寸,单位为字节。

echo $table->memorySize;

④:Table->set 设置行的数据,Table使用key-value的方式来访问数据
函数原型

Table->set(string $key, array $value) : bool

参数

$key,数据的key,相同的$key对应同一行数据,如果set同一个key,会覆盖上一次的数据
$value,必须是一个数组,必须与字段定义的$name完全相同

(1)swoole_table->set() 可以设置全部字段的值,也可以只修改部分字段
(2)swoole_table->set() 未设置前,该行数据的所有字段均为空
(3)set/get/del 是自带行锁,所以不需要调用lock加锁
(4)Key非二进制安全,必须为字符串类型,不得传入二进制数据

返回值

设置成功返回true
失败返回false,可能是由于Hash冲突过多导致动态空间无法分配内存,可以调大构造方法第二个参数

⑤:Table->get 获取一行数据
函数原型

array Table->get(string $key, string $field = null);

参数

$key:指定查询数据行的KEY,必须为字符串类型

返回值

$key不存在,将返回false
成功返回结果数组
当指定了$field时仅返回该字段的值,而不是整个记录

内存表mysql 内存表格_数据