SSDB基礎說明及使用,SSDB基礎說明使用

來源:互聯網
上載者:User

SSDB基礎說明及使用,SSDB基礎說明使用

       當時需要使用SSDB的原因有幾個,首先是對於contest模組設計的時候,由於點擊查詢當前比賽的Rank的時候,需要多次查詢,而每次查詢的資料量比較大,為了能夠高效的擷取資料而使用SSDB資料庫;第二方面是對於使用者AC狀態的記錄,在使用者登入進之後,網頁需要顯示使用者AC了哪些題目,哪些題目嘗試了但沒有通過。為了必須遍曆當前系統儲存的所有的submit,這樣的話資料量也是很大,依照前面的原則,繼續採用SSDB解決。

 

1:那SSDB到底是什麼呢?

       百度了一下,沒有找到百度百科,找到的一個定義是SSDB是一個開源的高效能資料程式庫伺服器, 使用Google LevelDB作為儲存引擎, 支援T層級的資料。從字面意思來講,就是這個資料庫有很高的效能((/ □ \))。然後的話,我們需要用到的就是查詢速度高的特點。

2:SSDB 的主要特點(條目性的統計((/ □ \)),我們主要用到的模式就是k-v模式,即鍵值-值):

支援 zset, map/hash, list, kv 資料結構, 可替代 Redis
特別適合儲存大量集合資料, 支援豐富的資料結構: key-value, key-map, key-zset, key-list.
使用 Google LevelDB 作為儲存引擎
支援主從同步, 多主同步
用戶端支援 PHP, C++, Python, Lua, Java, Ruby, nodejs, Go 等
記憶體佔用極少

3:安裝及啟動停止

SSDB 的建議安裝⽅方式是源碼編譯安裝, 建議運⾏行環境是主流 Linux 發⾏行版. 遠程 SSH 登入你的伺服器, 然後⽤用下⾯面的命令下載, 編譯, 安裝和運⾏行:

# 安裝

$ sudo wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip

$ sudo unzip master

$ cd ssdb-master

$ sudo make

$ #optional, install ssdb in /usr/local/ssdb

$ sudo make install

# 啟動

$ sudo ./ssdb-server ssdb.conf

# 啟動作為守護進程

$ sudo ./ssdb-server -d ssdb.conf

# 停止

$ sudo kill `cat ./var/ssdb.pid`

SSDB 預設安裝在 /usr/local/ssdb ⽬目錄下. ssdb-server 是伺服器的程式, ssdb-cli 是命令⾏行用戶端.

 

4:配置

SSDB  附帶的 ssdb.conf是設定檔,一般不用修改便可以使用.。標準設定檔如下:

# ssdb-server config
# MUST indent by TAB!

# relative to path of this file, directory must exists
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

replication:
        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: info
        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: no

work_dir: ssdb-server 的工作目錄, 啟動後, 會在這個目錄下產生 data 和 meta 兩個目錄, 用來儲存 LevelDB 的資料庫檔案. 這個目錄是相對於 ssdb.conf 的相對路徑, 也可以指定絕對路徑.

server: ip 和 port 指定了伺服器要監聽的 IP 和連接埠號碼. 如果 ip 是 0.0.0.0, 則表示綁定所有的 IP. 基於安全考慮, 可以將 ip 設定為 127.0.0.1, 這樣, 只有本機可以訪問了. 如果要做更嚴格的更多的網路安全限制, 就需要依賴作業系統的 iptables.

replication: 用於指定主從同步複製. slaveof.ip, slaveof.port 表示, 本台 SSDB 伺服器將從這個目標機上同步資料(也即這個設定檔對應的伺服器是 slave). 你可以參考 ssdb_slave.conf 的配製.

logger: 配置日誌記錄. level 是日誌的層級, 可以是 trace|debug|info|error. output 是記錄檔的名字, SSDB 支援日誌輪轉, 在記錄檔達到一定大小後, 將 log.txt 改名, 然後建立一個新的 log.txt.

leveldb: 配置 LevelDB 的參數. 你一般想要修改的是 cache_size 參數, 用於指定緩衝大小. 適當的緩衝可以提高讀效能, 但是過大的緩衝會影響寫效能.

在使⽤用⾃內建的 ssdb.conf 配置⽂檔案時, SSDB ⽣產生的⽇日誌⽂檔案按體積進⾏行分割, 僅此⽽而已. 所以, 你需要編寫⾃自⼰己的 crontab 進⾏行⽇日誌壓縮和定期清理.
如果出現伺服器掉電, kernel panic 等系統故障, 在系統重新啟動之後, 你需要⼿手動刪除 ssdb的 PID ⽂檔案 ssdb.pid, 然後才能啟動。

 

5使用流程:

安裝完成之後,在ssdb目錄下執行 sudo ./ssdb-server -d ssdb.conf啟動SSDB即可,這時,資料庫已經在運行。

當需要儲存資料時:

首先:整理需要儲存的資訊,比如(contestID , rank_list_proto_str)其中前者為鍵,後者為值。

再者:決定操作,目前我們主要涉及的操作就是對於資料的儲存和查詢,即insert和get操作:

            在插入資料時,使用的模式是ssdb.set(key,value),如果key是一個組合的話,那麼中間用'\t'相連,例如ssdb.set(userID + '\t' + problemID, value)。

            查詢的時候,主要模式是一樣的,即使用ssdb.get(key)就可以得到對應的value了。如果沒有對應的值,則返回Null 字元串。

插入:

 ssdb_api.SetContestRankListProto(contestID, contest_rank_list.SerializeToString())
ssdb_api.InsertUserProblemStatus(user.userID, submit.problemID, submit.status)

查詢:

contest_rank_list = ssdb_api.GetContestRankListProto(contest_id)
status_ = ssdb_api.GetUserProblem(user.userID, problem.problemID)

上述的操作都是已經寫好了操作函數,即view/ssdb_api.py中的函數

from ssdb import SSDBimport sysimport cugbacm.proto.rank_pb2 ssdb_ip = "127.0.0.1"ssdb_port = 6666ssdb = SSDB(host=ssdb_ip, port=ssdb_port)  def GetContestRankListProto(contestID):   global ssdb   proto_str = ssdb.get(contestID)   return proto_str  def SetContestRankListProto(contestID, rank_list_proto_str):   global ssdb   try:     ssdb.set(contestID, rank_list_proto_str)   except:     pass def InsertUserProblemStatus(userID, problemID, status):   #AC == 1  No_pass = 2 other = 0   global ssdb   value = 2   if status == "Accepted":     value = 1   st = str(ssdb.get(userID + '\t' + str(problemID)))   if st == "1":     return;   else:     ssdb.set(userID + '\t' + str(problemID), value)
<pre name="code" class="html">def GetUserProblem(userID, problemID):   global ssdb   st = ssdb.get(userID + '\t' + str(problemID))   if str(st) != "1" and str(st) != "2":     return "0"   else:     return str(st)




其中,設定這個.py之後,需要在使用SSDB的檔案裡面引入這個檔案,主機localhost。


其餘的後續補充吧(/ □ \)




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.