Swoole學習筆記 記憶體表table 1

2021-09-26 02:38:29 字數 2945 閱讀 7609

一、個人案例

//建立記憶體表物件

$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時僅返回該字段的值,而不是整個記錄

swoole學習筆記

一 服務端 0.swoole常用的配置項 daemonize true 守護程序化 worker num swoole配置引數 設定啟動的worker程序數 如 1 個請求耗時 100ms,要提供 1000qps 的處理能力,那必須配置 100 個程序或更多。reactor num 執行緒數 tas...

swoole學習筆記一

管理程序manager 非同步reactor執行緒 全非同步非阻塞 同步或者非同步worker程序,沒有用到epoll task worker程序 完全是同步阻塞模式 factory task 如果reactor最大允許監聽的事件數比reactor的事件數小的話用poll select,否則用epo...

swoole 學習筆記(1)

解壓 configure make make install tips php i grep php.ini 檢視php.ini 配置檔案位置 獲取原始碼 swoole官網 phpize 生成configure 檔案 configure make make install configure ena...