php版redis插件,SSDB數據庫,增強型的Redis管理api實例

php版redis插件,SSDB數據庫,增強型的Redis管理api實例

SSDB是一套基于LevelDB存儲引擎的非關系型數據庫(NOSQL),可用于取代Redis,更適合海量數據的存儲。
另外,rocksdb是FB在LevelDB的二次開發版本,因此也存在使用RocksDB作為存儲引擎的SSDB版本,可以參考這里。

SSDB PHP API Documentation 官方api文檔
http://ssdb.io/docs/php/index.html

SSDB入門基礎-中文版pdf教程
http://ssdb.io/ssdb-get-started.pdf

php的redis原生插件有不少bug,建議使用ssdb的
-----------------------------
實戰例子:
require_once "SSDB.php";

function getArticleByCode($code=''){
$query = array ();
try {
$ssdb = new SimpleSSDB(REDIS_HOST,REDIS_PORT);
$key = 'article'.$code;
// $ssdb->del($key);
$articles = $ssdb->get($key);
if(empty($articles)){
$sql = "SELECT * FROM article where status=1 and code=".$this->db->escape ( $code );
$query = $this->db2->query($sql)->result();
if(count($query)>0){
$query = $query[0];
}
$ssdb->set($key, json_encode($query));
//設置過期時間,以秒為單位
$ssdb->expire($key, 360000);
}else{
$query = json_decode($articles);
}
$ssdb->close();
} catch ( Exception $e ) {}
return $query;
}
-----------------------------
SSDB支持flushdb命令清除數據庫
SSDB 提供了 flushdb 命令, 用于清除整個數據庫的數據. 這是在命令行客戶端實現的, 所以只在 ssdb-cli 里才能用. 因為這是一個非常危險的命令, 所以輸入后, 還要用戶再輸入"yes"確認.
flushdb 還支持單獨清理 kv, hash, zset 三種數據, 分別對應的用法是 flushdb kv, flushdb hash, flushdb zset.

==========================================
編譯和安裝
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make
# 將安裝在 /usr/local/ssdb 目錄下
sudo make install

啟動服務

# 啟動主庫
./ssdb-server ssdb.conf
# 或者啟動為后臺進程
./ssdb-server -d ssdb.conf
# 啟動 ssdb 命令行客戶端
./tools/ssdb-cli -p 8888
# 停止 ssdb-server
./ssdb-server ssdb.conf -s stop
# 對于舊版本
kill `cat ./var/ssdb.pid`

配置文件
ssdb.conf:

work_dir = ./var
pidfile = ./var/ssdb.pid
server:
ip: 127.0.0.1
port: 8888
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168
# auth password must be at least 32 characters
#auth: very-strong-password
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
slaveof:
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#ip: 127.0.0.1
#port: 8889
logger:
level: debug
   # 支持的日志級別有: debug, warn, error, fatal.
output: log.txt
rotate:
size: 1000000000
leveldb:
# in MB
cache_size: 500
# in KB
block_size: 32
# in MB
write_buffer_size: 64
# in MB
compaction_speed: 1000
# yes|no
compression: yes

一個 ssdb-server 實例占用的內存瞬時(有可能, 而且即使達到, 也只是持續短時間)最高達到(MB):
cache_size + write_buffer_size * 66 + 32
這是對于壓縮選項沒有開啟的情況, 如果 compression: yes, 計算公式是:
cache_size + 10 * write_buffer_size * 66 + 32
你可以調整配置參數, 限制 ssdb-server 的內存占用.



SSDB命令
與Redis類似,SSDB也支持多種數據結構(KV list, hash, soreted set),下面列出了常用命令:

dbsize           # 返回數據庫占用空間,以字節為單位
flushdb           # 清空數據庫
info            # 返回服務器信息
auth password      # 驗證訪問密碼

KV結構
set key value
setx key value ttl     # 設置key的同時設置ttl
setnx key value      # 若key已存在,則不設置
multi_set key1 value1 key2 value2 ...
exists key
get key
getset key value           # 更新key,并返回舊value
multi_get key1 key2 ...
keys key_start key_end limit     # 返回指定范圍內的key,左開右閉區間(SSDB的key有序存儲)
rkeys key_start key_end limit
scan key_start key_end limit
rscan key_start key_end limit
expire key ttl
ttl key
del key
multi_del key1 key2 ...
substr key start size         # 返回子串
strlen key
incr key [num]
getbit key offset
setbit key offset val
bitcount key [start] [end]
countbit key start size
hashmap結構
hset name key value
multi_hset name key1 value1 key2 value2 ...
hget name key
multi_hget name key1 key2 ...
hgetall name
hkeys name key_start key_end
hscan key_start key_end limit
hrscan key_start key_end limit
hdel name key            # 刪除一個字段
hclear name             # 刪除所有字符
multi_hdel name key1 key2 ...
hexists name key
hsize name
hincr name key [num]
hlist name_start name_end limit      # 列出指定范圍的所有hash表
hrlist name_start name_end limit



list結構
qpush_front name item1 item2 ...     # 往隊頭插入新元素
qpush_back name item1 item2 ...      # 往隊尾插入新元素
qpop_front name size             # 從隊頭彈出若干個元素
qpop_back name size            # 從隊尾彈出若干個元素
qtrim_front name size            # 從隊頭移除多個元素
qtrim_back name size           # 從隊尾移除多個元素
qfront name                # 返回隊頭
qback name                # 返回隊尾
qsize name                # 返回隊長
qget name index              # 返回指定位置元素
qset name index val
qrange name offset limit          # 返回一個切片
qslice name begine end          # 返回一個切片
qclear name
qlist name_start name_end limit
qrlist name_start name_end limit



sorted set結構
zset name key socre
zget name key
zdel name key
zexists name key
zsize name
zincr name key num



導出/導入
SSDB才有LSM模型,也就是說它的key是有序存儲的,因此,我們可以導出所有key的數據,也可以導出指定范圍內key的數據。

1、使用ssdb-cli 命令行客戶端
導出整個數據庫:
# backup current database into file backup.ssdb
ssdb 127.0.0.1:8888> export backup.ssdb

按照 Key 區間導出數據庫(交互模式)

ssdb 127.0.0.1:8888> export -i backup.ssdb
input KV range[start, end]:
start(inclusive, default none): a
end(inclusive, default none): z
input HASH range:
start(inclusive, default none):
end(inclusive, default none):
input ZSET range:
start(inclusive, default none):
end(inclusive, default none):
input QUEUE range:
start(inclusive, default none):
end(inclusive, default none):
命令 export -i backup.ssdb 將導出區間 [a, z] 內的 KV, 所有的 HASH, ZSET, QUEUE.

導入命令:
# import backup.ssdb into current database
ssdb 127.0.0.1:8888> import backup.ssdb
import 命令會把數據庫中的相同 key 給替換。


2、SSDB 另一個專門用于導出工具是 ssdb-dump,用法如下:
./tools/ssdb-dump ip port output_folder
目錄 output_folder 必須不存在, 因為 ssdb-dump 會創建這個目錄. 導出之后, 這個目錄里將有兩個子目錄, data 目錄里包含著數據, 還有一個空的 meta 目錄.
如果想從導出的目錄恢復數據,可以將 output_folder 目錄拷貝到你的服務器上面,然后修改你的 ssdb.conf 配置文件, 將 work_dir 指向 output_folder 目錄, 然后重啟 ssdb-server。



限制
最大 Key 長度 200 字節
最大 Value 長度 31MB
最大請求或響應長度 31MB
單個 HASH 中的元素數量 9,223,372,036,854,775,807
單個 ZSET 中的元素數量 9,223,372,036,854,775,807
單個 QUEUE 中的元素數量 9,223,372,036,854,775,807
命令最多參數個數 所有參數加起來體積不超過 31MB 大小



Replication
Redis的主從復制在主庫掛了的時候就無法再寫入數據了,而SSDB不但支持主-從結構,還支持多主結構。

主-從配置
#server1:
replication:
slaveof:

#server2:

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: sync
ip: 127.0.0.1
port: 8888

主-主配置
#server1:

replication:
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889

#server2:

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888


多主配置
在一組一共包含 n 個實例的 SSDB 實例群中, 每一個實例必須 slaveof 其余的 n-1 個實例.

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889
# ... more slaveof

監控
info命令可以返回SSDB服務狀態:

ssdb 127.0.0.1:8899> info
binlogs
capacity : 10000000
min_seq : 1
max_seq : 74
replication
client 127.0.0.1:55479
type : sync
status : SYNC
last_seq : 73
replication
slaveof 127.0.0.1:8888
id : svc_2
type : sync
status : SYNC
last_seq : 73
copy_count : 0
sync_count : 44

binlogs,當前實例的寫操作狀態:
capacity: binlog 隊列的最大長度
min_seq: 當前隊列中的最小 binlog 序號
max_seq: 當前隊列中的最大 binlog 序號

replication,可以有多條 replication 記錄. 每一條表示一個連接進來的 slave(client), 或者一個當前服務器所連接的 master(slaveof).
slaveof|client ip:port, 遠端 master/slave 的 ip:port
type: 類型, sync|mirror
status: 當前同步狀態, DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,見下面的解釋
last_seq: 上一條發送或者收到的 binlog 的序號
slaveof.id: master 的 id(這是從 slave's 角度來看的, 你永遠不需要在 master 上配置它自己的 id)
slaveof.copy_count: 在全量同步時, 已經復制的 key 的數量
slaveof.sync_count: 發送或者收到的 binlog 的數量.
關于 status:
DISCONNECTED: 與 master 斷開了連接, 一般是網絡中斷
INIT: 初始化狀態
OUT_OF_SYNC: 由于短時間內在 master 有大量寫操作, 導致 binlog 隊列淘汰, slave 丟失同步點, 只好重新復制全部的數據
COPY: 正在復制基準數據的過程中, 新的寫操作可能無法及時地同步
SYNC: 同步狀態是健康的

判斷同步狀態
binlogs.max_seq 是指當前實例上的最新一次的寫(寫/更新/刪除)操作的序號;
replication.client.last_seq 是指已發送給 slave 的最新一條 binlog 的序號;
所以, 如果你想判斷主從同步是否已經同步到位(實時更新), 那么就判斷 binlogs.max_seq 和 replication.client.last_seq 是否相等。

SSDB協議
SSDB協議與Redis的文本協議也類似:

SSDB數據包的結構:
Packet := Block+ '\n'
Block := Size '\n' Data '\n'
Size := literal_integer
Data := size_bytes_of_data

請求:
Request := Cmd Blocks*
Cmd := Block
請求命令包括: get, set, del, ...

響應:
Response := Status Block*
Status := Block
響應狀態碼包括: ok, not_found, error, fail, client_error

示例:
用 telnet 或者 nc 命令連接到 SSDB 服務器, 然后輸入下面的代碼(用最后一行空行結束):
3
get
3
key
你將看到類似這樣的響應:
2
ok
3
val


SSDB 協議解析器的C實現:

#include <stdlib.h>
#include <string.h>
int len = buffer->size();
char *ptr = buffer->data();
while(len > 0){
char *data = (char *)memchr(ptr, '\n', len);
if(data == NULL){
break;
}
data += 1;
int num = data - ptr;
if(num == 1 || (num == 2 && ptr[0] == '\r')){
// Packet received.
return OK;
}
// Size received
int size = (int)strtol(ptr, NULL, 10);
len -= num + size;
ptr += num + size;
if(len >= 1 && ptr[0] = '\n'){
len -= 1;
ptr += 1;
}else if(len >= 2 && ptr[0] == '\r' && ptr[1] == '\n'){
len -= 2;
ptr += 2;
}else{
break;
}
// Data received
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457867.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

加速度計和陀螺儀數據融合

本帖翻譯自 IMU&#xff08;加速度計和陀螺儀設備&#xff09;在嵌入式應用中使用的指南。這篇文章主要介紹加速度計和陀螺儀的數學模型和基本算法&#xff0c;以及如何融合這兩者&#xff0c;側重算法、思想的討論介紹本指南旨在向興趣者介紹慣性MEMS&#xff08;微機電系統&a…

循環嵌套練習題

//BOSS://讓用戶輸入一個奇數&#xff0c;打印菱形&#xff0c;最長的行內容個數為用戶輸入的個數&#xff0c;并且由英文字母拼接而成//比如用戶輸入了7// A// ABA// ABCBA// ABCDCBA// ABCBA// ABA// A//1、接收并判斷用戶輸入的是不是數字 try{#region 解法一…

python leetcode_leetcode 介紹和 python 數據結構與算法學習資料

for &#xff08;剛入門的編程&#xff09;的高中 or 大學生leetcode 介紹leetcode 可以說是 cs 最核心的一門“課程”了&#xff0c;雖然不是大學開設的&#xff0c;但基本上每一個現代的高水平的程序員都修過這門“課程”&#xff08;或者類似的課程&#xff0c;比如數據結構…

平衡小車卡爾曼濾波算法

最近研究STM32的自平衡小車&#xff0c;發現有兩座必過的大山&#xff0c;一為卡爾曼濾波&#xff0c;二為PID算法。 網上看了很多關于卡爾曼濾波的代碼&#xff0c;感覺寫得真不咋地。一怒之下&#xff0c;自己重寫&#xff0c;不廢話&#xff0c;貼代碼 [pre lang"C&quo…

IOS 為UILabel添加長按復制功能

IOS 為UILabel添加長按復制功能 在iOS中下面三個控件&#xff0c;自身就有復制-粘貼的功能&#xff1a; 1、UITextView 2、UITextField 3、UIWebView UIKit framework提供了幾個類和協議方便我們在自己的應用程序中實現剪貼板的功能。 1、UIPasteboard&#xff1a;我們可以向其…

navicat 的查詢功能

navicat的查詢的位置在&#xff1a; 在編輯器界面寫代碼&#xff0c;代碼完成后點左上角的運行。 代碼&#xff1a; create&#xff08;創建&#xff09; table&#xff08;一個表&#xff09; <xxx>尖括號內的內容必填——我要創建并查詢一個名叫做xxx的表 &#xff08…

c++ sleep函數_Linux 多線程應用中如何編寫安全的信號處理函數

關于代碼的可重入性&#xff0c;設計開發人員一般只考慮到線程安全&#xff0c;異步信號處理函數的安全卻往往被忽略。本文首先介紹如何編寫安全的異步信號處理函數&#xff1b;然后舉例說明在多線程應用中如何構建模型讓異步信號在指定的線程中以同步的方式處理。Linux 多線程…

css特殊情況

如果一個父級div和一個子級div&#xff0c;要給父級div加&#xff08;opacity&#xff09;透明度那子級div也會繼承父級元素的透明度。那給父級元素加透明度就不用opacity加透明度&#xff0c;使用background:rgba(120,120,120,0.7);實現效果&#xff0c;r,g,b分別代表紅&#…

CoreAnimation (CALayer 動畫)

CoreAnimation基本介紹&#xff1a; CoreAnimation動畫位于iOS框架的Media層CoreAnimation動畫實現需要添加QuartzCore.FrameworkCoreAnimation基本上是LayerAnimationCoreAnimation分類&#xff1a; CoreAnimation作用&#xff1a; CoreAnimation CALayer基本介紹 CALayer的常…

匯編為什么分段執行總是執行不了_iOS匯編教程(六)CPU 指令重排與內存屏障...

系列文章iOS 匯編入門教程(一)ARM64 匯編基礎iOS 匯編入門教程(二)在 Xcode 工程中嵌入匯編代碼iOS 匯編入門教程(三)匯編中的 Section 與數據存取iOS 匯編教程(四)基于 LLDB 動態調試快速分析系統函數的實現iOS 匯編教程(五)Objc Block 的內存布局和匯編表示前言具有 ARM 體系…

GD32 使用stm32 固件庫

1、 系統 1) 晶振起振區別 描述&#xff1a;啟動時間&#xff0c;GD32 與STM32 啟動時間都是2ms&#xff0c;實際上GD 的執行效率快&#xff0c;所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms&#xff0c;但是這個宏定義值在GD 上時間就更加短了&#xff0c;所以要加大…

干將莫邪

干將莫邪也為凡鐵鑄成&#xff0c;只是善加鍛造、融入心神&#xff0c;而成上古神兵。寶劍從來都是雙刃&#xff0c;正邪之道&#xff0c;存乎一心。

js反混淆還原工具_SATURN反混淆框架

本文為看雪論壇精華文章看雪論壇作者ID&#xff1a;夢野間摘要&#xff1a;近幾年&#xff0c;軟件的混淆強度一直在不斷提升。基于編譯器的混淆已經成為業界事實上的標準&#xff0c;最近的一些論文也表明軟件的保護方式使用的是編譯器級別的混淆。在這篇文章中&#xff0c;我…

android 彈起鍵盤把ui頂上去的解決辦法

鍵盤輸入框上面的ui布局必須為Relative相對布局。然后設置 <activityandroid:name".activity.HomeActivity"Android:windowSoftInputMode"adjustPan|stateHidden"></activity>轉載于:https://www.cnblogs.com/zhaoleigege/p/5925831.html

python 多線程并發_尋找python大神!!!python如何多線程并發?

不是大神。嘗試回答一下。 首先解釋下什么叫做線程&#xff0c;什么叫做進程&#xff0c;在解釋這兩個概念前&#xff0c;我們還需要明白什么叫做GIL全局解釋器鎖。GIL 全局解釋器鎖&#xff1a; GIL(全局解釋器鎖&#xff0c;GIL 只有cpython有)&#xff1a;在同一個時刻&…

Nginx/Apache發大招

導讀網站程序的上傳目錄通常是不需要PHP執行解釋權限&#xff0c;通過限制目錄的PHP執行權限可以提網站的安全性&#xff0c;減少被攻擊的機率。下面和大家一起分享下如何在Apache和Nginx禁止上傳目錄里PHP的執行權限。 Apache下禁止指定目錄運行PHP腳本在虛擬主機配置文件中增…

第二輪沖刺-Runner站立會議08

今天完成的內容&#xff1a;簡單的做了一下主界面的美化和日歷界面的美化 遇到的問題&#xff1a;美化按鈕還不能自己自定義按鈕 如何解決&#xff1a;暫無思路 明天將要進行的內容&#xff1a;調試bug 轉載于:https://www.cnblogs.com/Againzg/p/5544301.html

STM32串口通信中使用printf發送數據配置方法 開發環境 Keil

STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK) 已有 12456 次閱讀2011-6-29 23:29 | 在STM32串口通信程序中使用printf發送數據&#xff0c;非常的方便。可在剛開始使用的時候總是遇到問題&#xff0c;常見的是硬件訪真時無法進入main主函數&#xff0c;其實…

dmp文件查看表空間_innoDb文件

一&#xff0e;文件總體概述InnoDb文件主要有以下文件1. 參數文件&#xff1a;啟動需要的各種參數作2. 日志文件&#xff1a;記錄mysql實例某種條件做出的響應而寫入的文件&#xff0c;如錯誤日志、二進制日志、慢查詢日志、查詢日志等3. Socket文件&#xff1a;連接需要的文件…

論文筆記之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要&#xff1a;本文將 DQN 引入了 Attention 機制&#xff0c;使得學習更具有方向性和指導性。&#xff08;前段時間做一個工作打算就這么干&#xff0c;誰想到&#xff0c;這么快就被這幾個孩子給實現了&#xff0c;自愧…