SWOOLE 高效能共享記憶體Table

2021-10-05 19:00:12 字數 2574 閱讀 5761

高效能共享記憶體 table

由於 php 語言不支援多執行緒,因此 swoole 使用多程序模式,在多程序模式下存在程序記憶體隔離,在工作程序內修改 global 全域性變數和超全域性變數時,在其他程序是無效的。

設定 worker_num=1 時,不存在程序隔離,可以使用全域性變數儲存資料

$fds

=array()

;$server

->on(

'connect'

,function

($server

,$fd

)\n"

;global

$fds

;$fds

=$fd

;var_dump

($fds);

});$fds 雖然是全域性變數,但只在當前的程序內有效。swoole 伺服器底層會建立多個 worker 程序,在 var_dump

($fds

) 列印出來的值,只有部分連線的 fd。

對應的解決方案就是使用外部儲存服務:

資料庫,如:mysql、mongodb

快取伺服器,如:redis、memcache

磁碟檔案,多程序併發讀寫時需要加鎖

普通的資料庫和磁碟檔案操作,存在較多 io 等待時間。因此推薦使用:

redis 記憶體資料庫,讀寫速度非常快,但是有 tcp 連線等問題,效能也不是最高的。

/dev/shm 記憶體檔案系統,讀寫操作全部在記憶體中完成,無 io 消耗,效能極高,但是資料不是格式化的,還有資料同步的問題。

除了上述使用儲存之外,推薦使用共享記憶體來儲存資料,swoole\table 乙個基於共享記憶體和鎖實現的超高效能,併發資料結構。用於解決多程序 / 多執行緒資料共享和同步加鎖問題。table 的記憶體容量不受 php 的 memory_limit 控制

不要使用陣列方式讀寫 table,一定要使用文件中提供的 api 來進行操作;

陣列方式取出的 swoole\table\row 物件為一次性物件,請勿依賴其進行過多操作。

優勢效能強悍,單執行緒每秒可讀寫 200 萬次;

應用**無需加鎖,table 內建行鎖自旋鎖,所有操作均是多執行緒 / 多程序安全。使用者層完全不需要考慮資料同步問題;

支援多程序,table 可以用於多程序之間共享資料;

使用行鎖,而不是全域性鎖,僅當 2 個程序在同一 cpu 時間,併發讀取同一條資料才會進行發生搶鎖。

<?php

//建立記憶體表

$table

=new

swoole\table

(1024);

//設定記憶體大小

//記憶體表增加一行

$table

->

column

('id'

, swoole\table::

type_int);

$table

->

column

('name'

, swoole\table::

type_string,64

);//字串需要設定長度

$table

->

column

('age'

, swoole\table::

type_int);

$table

->

create()

;$table

->

set(

'test',[

'id'

=>1,

'name'

=>

'***x'

,'age'

=>30]

);//另一種方案

$table

['test2']=

['id'

=>2,

'name'

=>

'zzz'

,'age'

=>31]

;$table

->

incr

('test2'

,'age',2

);//增長操作

$table

->

decr

('test'

,'age',3

);//原子自減操作。

$table

->

del(

'test2');

print_r

($table

->

get(

'test'))

;//獲取另一種方法

print_r

($table

['test2'])

;

執行結果

array

([id]

=> 1

[name]

=> ***x

[age]

=> 27

)swoole\table\row object

([key]

=> test2

[value]

=> array

())

多程序之間共享資料

swoole高效能賽事直播平台 筆記

一 php7原始碼安裝 1.解壓資料夾 tar xjvf php7.2.21.tar.bz2 2.configure configure prefix home soft php php安裝環境目錄 3.make 在make過程中報錯 ext iconv libs iconv.o in functi...

高效能之記憶體池

記憶體池 memory pool 是一種記憶體分配方式。通常我們習慣直接使用new malloc等api申請分配記憶體,這樣做的缺點在於 由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記...

高效能穩定可靠的記憶體加密

由於專案需要,經各種調研及頭腦風暴,終於做成這一高效能穩定可靠的記憶體加密演算法。使用起來超級隨意啦,直接拿它當int,float等基本資料型別使用就可以啦,比如這樣 encryptint a 10 if a 20 也可以這樣 int v 100 encryptint ev v ev v 10 ev...