欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ssdb簡單介紹

 更新時間:2023年08月07日 15:31:17   作者:MyObject-C  
SSDB是一套基于LevelDB存儲引擎的非關(guān)系型數(shù)據(jù)庫(NOSQL),可用于取代Redis,更適合海量數(shù)據(jù)的存儲,這篇文章主要介紹了ssdb簡單介紹,需要的朋友可以參考下

ssdb介紹

ssdb是一款類似于redis的nosql數(shù)據(jù)庫,不過redis是基于內(nèi)存的,服務(wù)器比較昂貴,ssdb則是基于硬盤存儲的,很容易擴(kuò)展,對于一些對速度要求不是太高的應(yīng)用,還是不錯的選擇。

SSDB是一套基于LevelDB存儲引擎的非關(guān)系型數(shù)據(jù)庫(NOSQL),可用于取代Redis,更適合海量數(shù)據(jù)的存儲。

另外,rocksdb是FB在LevelDB的二次開發(fā)版本,因此也存在使用RocksDB作為存儲引擎的SSDB版本,可以參考這里。

  先記錄一個比較坑的東西,具體的用法以后補(bǔ)充。

  ssdb刪除數(shù)據(jù)的時候有很多中方法:

    flushdb   刪除整個數(shù)據(jù)庫中的所有數(shù)據(jù)

    qclear     刪除列表類型的數(shù)據(jù)

    hclear     刪除hash類型的數(shù)據(jù)

    zclear     刪除有序集合類型的梳理

    del          刪除字符串類型的數(shù)據(jù)

  不過,ssdb在刪除數(shù)據(jù)的時候并不會立刻釋放磁盤的空間,用作者的話說就是ssdb會在合適的時候去釋放,這就會造成不知不覺中ssdb占用的磁盤空間越來越大,還不知道什么時候才會被釋放,如果不及時處理的話,服務(wù)器卡死是很正常的事情,經(jīng)過不斷的尋找,終于被我發(fā)現(xiàn)了一個命令 compact , 這個命令會自動去釋放應(yīng)該被釋放的磁盤空間,不過在使用的時候會造成ssdb卡慢,并且 compact 命令的執(zhí)行速度也不快,但總算是可以立刻釋放了,不用再擔(dān)心服務(wù)器被撐爆。

  需要注意的是如果服務(wù)器已經(jīng)快被撐爆了,那么你在執(zhí)行 compact 的時候ssdb是有可能崩潰的,而且執(zhí)行一次 compact 并不會釋放所有應(yīng)該釋放的空間,可能需要多次執(zhí)行才行。

  還有一個比較坑的東西就是在刪除數(shù)據(jù)的時候,會造成服務(wù)阻塞,其他任何寫命令都執(zhí)行不了,可讀不可寫。。。而且刪除的超級慢。。。

安裝,啟動

編譯和安裝

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

啟動服務(wù)

# 啟動主庫
./ssdb-server ssdb.conf
# 或者啟動為后臺進(jìn)程
./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 實例占用的內(nèi)存瞬時(有可能, 而且即使達(dá)到, 也只是持續(xù)短時間)最高達(dá)到(MB):

cache_size + write_buffer_size * 66 + 32

這是對于壓縮選項沒有開啟的情況, 如果 compression: yes, 計算公式是:

cache_size + 10 * write_buffer_size * 66 + 32

你可以調(diào)整配置參數(shù), 限制 ssdb-server 的內(nèi)存占用.

SSDB命令

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

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

  結(jié)構(gòu)

KV結(jié)構(gòu)

set key value 

setx key value ttl     # 設(shè)置key的同時設(shè)置ttl
setnx key value       # 若key已存在,則不設(shè)置
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     # 返回指定范圍內(nèi)的key,左開右閉區(qū)間(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結(jié)構(gòu)

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結(jié)構(gòu)

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結(jié)構(gòu)

zset name key socre
zget name key
zdel name key
zexists name key
zsize name
zincr name key num

導(dǎo)出/導(dǎo)入

SSDB才有LSM模型,也就是說它的key是有序存儲的,因此,我們可以導(dǎo)出所有key的數(shù)據(jù),也可以導(dǎo)出指定范圍內(nèi)key的數(shù)據(jù)。

1、使用ssdb-cli 命令行客戶端

導(dǎo)出整個數(shù)據(jù)庫:

# backup current database into file backup.ssdb
ssdb 127.0.0.1:8888> export backup.ssdb

按照 Key 區(qū)間導(dǎo)出數(shù)據(jù)庫(交互模式)

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 將導(dǎo)出區(qū)間 [a, z] 內(nèi)的 KV, 所有的 HASH, ZSET, QUEUE.

導(dǎo)入命令:

# import backup.ssdb into current database
ssdb 127.0.0.1:8888> import backup.ssdb

import 命令會把數(shù)據(jù)庫中的相同 key 給替換。

2、SSDB 另一個專門用于導(dǎo)出工具是 ssdb-dump,用法如下:

./tools/ssdb-dump ip port output_folder

目錄 output_folder 必須不存在, 因為 ssdb-dump 會創(chuàng)建這個目錄. 導(dǎo)出之后, 這個目錄里將有兩個子目錄, data 目錄里包含著數(shù)據(jù), 還有一個空的 meta 目錄.

如果想從導(dǎo)出的目錄恢復(fù)數(shù)據(jù),可以將 output_folder 目錄拷貝到你的服務(wù)器上面,然后修改你的 ssdb.conf 配置文件, 將 work_dir 指向 output_folder 目錄, 然后重啟 ssdb-server。

限制

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

Replication

Redis的主從復(fù)制在主庫掛了的時候就無法再寫入數(shù)據(jù)了,而SSDB不但支持主-從結(jié)構(gòu),還支持多主結(jié)構(gòu)。

主-從配置

#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

監(jiān)控

info命令可以返回SSDB服務(wù)狀態(tài):

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,當(dāng)前實例的寫操作狀態(tài):

  • capacity: binlog 隊列的最大長度
  • min_seq: 當(dāng)前隊列中的最小 binlog 序號
  • max_seq: 當(dāng)前隊列中的最大 binlog 序號

replication,可以有多條 replication 記錄. 每一條表示一個連接進(jìn)來的 slave(client), 或者一個當(dāng)前服務(wù)器所連接的 master(slaveof).

  • slaveof|client ip:port, 遠(yuǎn)端 master/slave 的 ip:port
  • type: 類型, sync|mirror
  • status: 當(dāng)前同步狀態(tài), DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,見下面的解釋
  • last_seq: 上一條發(fā)送或者收到的 binlog 的序號
  • slaveof.id: master 的 id(這是從 slave's 角度來看的, 你永遠(yuǎn)不需要在 master 上配置它自己的 id)
  • slaveof.copy_count: 在全量同步時, 已經(jīng)復(fù)制的 key 的數(shù)量
  • slaveof.sync_count: 發(fā)送或者收到的 binlog 的數(shù)量.

關(guān)于 status:

  • DISCONNECTED: 與 master 斷開了連接, 一般是網(wǎng)絡(luò)中斷
  • INIT: 初始化狀態(tài)
  • OUT_OF_SYNC: 由于短時間內(nèi)在 master 有大量寫操作, 導(dǎo)致 binlog 隊列淘汰, slave 丟失同步點(diǎn), 只好重新復(fù)制全部的數(shù)據(jù)
  • COPY: 正在復(fù)制基準(zhǔn)數(shù)據(jù)的過程中, 新的寫操作可能無法及時地同步
  • SYNC: 同步狀態(tài)是健康的

判斷同步狀態(tài)

binlogs.max_seq 是指當(dāng)前實例上的最新一次的寫(寫/更新/刪除)操作的序號;

replication.client.last_seq 是指已發(fā)送給 slave 的最新一條 binlog 的序號;

所以, 如果你想判斷主從同步是否已經(jīng)同步到位(實時更新), 那么就判斷 binlogs.max_seq 和 replication.client.last_seq 是否相等。

SSDB協(xié)議

SSDB協(xié)議與Redis的文本協(xié)議也類似:

SSDB數(shù)據(jù)包的結(jié)構(gòu):

Packet := Block+ '\n'
Block  := Size '\n' Data '\n'
Size   := literal_integer
Data   := size_bytes_of_data

請求:

Request := Cmd Blocks*
Cmd     := Block

請求命令包括: get, set, del, ...

響應(yīng):

Response := Status Block*
Status   := Block

響應(yīng)狀態(tài)碼包括: ok, not_found, error, fail, client_error

示例:

用 telnet 或者 nc 命令連接到 SSDB 服務(wù)器, 然后輸入下面的代碼(用最后一行空行結(jié)束):

3
get
3
key
 

你將看到類似這樣的響應(yīng):

2
ok
3
val
 

SSDB 協(xié)議解析器的C實現(xiàn):

#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
}

到此這篇關(guān)于ssdb簡單介紹的文章就介紹到這了,更多相關(guān)ssdb介紹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論