首先說一下背景,在雙十一的時候,我們系統接受X寶的訂單推送,同事原先的實現方式是使用redis的List作為推送資料的承載,在非大促的場景下,
一切執行正常,記憶體佔用大概3-4G,機器是16G記憶體。由於提前預計不足,在雙十一來臨的時候,訂單瞬時量達到了平時的10X倍,記憶體非常吃緊,情況算
是非常緊急了,採取的臨時解決方案就是再開一個redis,將程式中的redis地址指向這臺新的,重啟一下程式,把資料暫時引導過去。
一:分析
redis確實是一個好東西,一個如此強大的記憶體資料結構伺服器,全記憶體儲存,有些場景,恰恰你會死在全記憶體上,而且相對ssd硬碟來說,記憶體還是
太小了。記憶體很便宜,但是記憶體和ssd比起來很貴,況且有些場景你可能根本不需要使用全記憶體,使用硬碟也許會更能幫助我們節省成本,你可能會說,現
在業界標準已經差不多是kafka了,有時候我們還需要redis裡面的hash,也就是說我現在需要kafka + redis 的一個綜合體的產品,這就是本篇和大家說到的
ssdb,當然ssdb和kafka還是不能相提並論的哈,畢竟我是在選擇一個輕量級的解決方案。
二:ssdb說明
ssdb是一個使用leveldb做為底層儲存的nosql資料庫,好處就是可以利用redis中的所有資料結構,而且資料還是基於硬碟的,所以可以儲存的資料比
redis大的不要太多,官方文件的說法就是用來替代redis的,而且讓你眼前一亮的就是,它對.net還是比較友好的,一個很不錯的解決方案,不過成熟度不
如redis,大家前期可以當快取用用,或者儲存一些非關鍵性資料,節省節省記憶體空間。目前我在專案中用起來了。
1. 使用hash來存customerID 和customerNick的對映關係。
2. 使用List來承載X寶的訂單推送。
三:快速搭建
官方下載:http://ssdb.io, 有一點要注意的就是官方文件明確表示,CentOS7的檔案控制程式碼設定問題,建議不要在centos7上進行搭建,具體的說明
可以看看這個:http://ssdb.io/docs/zh_cn/config.html ,大家可以用用centos6.5或者ubantu吧。
1. wget下載和unzip解壓。
[root@localhost apps]# wget https://codeload.github.com/ideawu/ssdb/zip/master --2017-12-02 03:02:18-- https://codeload.github.com/ideawu/ssdb/zip/master Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121 Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1595060 (1.5M) [application/zip] Saving to: ‘master’ 100%[==================================================================>] 1,595,060 69.3KB/s in 36s 2017-12-02 03:02:57 (43.7 KB/s) - ‘master’ saved [1595060/1595060] [root@localhost apps]#unzip master [root@localhost apps]# ls master ssdb-master
2. 使用make對C++程式碼進行編譯
[root@localhost ssdb-master]# make
3. 編譯完之後,一泡尿的功夫,這個ssdb-server可執行檔案就出來了。
[root@localhost ssdb-master]# ls api ChangeLog Dockerfile Makefile ssdb.conf tools version build_config.mk data docs README.md ssdb-server var build.sh deps LICENSE src ssdb_slave.conf var_slave
4.然後我們把ssdb.conf配置一下
這裡面有三個配置要注意下:
<1> work_dir: 存放data和meta的目錄,可以在ssdb-master資料夾下mkdir data資料夾。
<2> ip:設為0.0.0.0,讓所有的主機都能夠連線上來。
<3> port 8888 :這個是預設的ssdbserver埠號,大家可以看情況修改。
完整配置如下:
# ssdb-server config # MUST indent by TAB! # absolute path, or relative to path of this file, directory must exists work_dir = /usr/apps/ssdb-master/data pidfile = ./var/ssdb.pid server: ip: 0.0.0.0 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 #readonly: yes # in ms, to log slowlog with WARN level #slowlog_timeout: 5 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 #host: localhost #port: 8889 logger: level: debug output: log.txt rotate: size: 1000000000 leveldb: # in MB cache_size: 500 # in MB write_buffer_size: 64 # in MB/s compaction_speed: 1000 # yes|no compression: yes
5. 啟動ssdb-server,指定一下配置檔案,採取靜默啟動
[root@localhost ssdb-master]# ./ssdb-server ./ssdb.conf -d ssdb-server 1.9.6 Copyright (c) 2012-2015 ssdb.io [root@localhost ssdb-master]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1869/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1115/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1117/cupsd tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 12994/./ssdb-server tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1627/master tcp6 0 0 :::22 :::* LISTEN 1115/sshd tcp6 0 0 ::1:631 :::* LISTEN 1117/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1627/master [root@localhost ssdb-master]#
可以看到,上面的8888埠已經成功開啟,沒毛病。
四:使用C#客戶端
在http://ssdb.io/docs/zh_cn/clients.html上面列出了各個語言的客戶端SDK,這裡我就選擇C#的SDK:https://github.com/ssdb/dotnetssdb。
可以看到,裡面沒啥東西,就三個破檔案,裡面並沒有實現ssdb應該有的所有功能,所以大家可以根據自己的需要進行封裝,連線池啥的都要
你自己根據需要實現吧,好了,接下來我用hash簡單的測試一下:
class Program { static void Main(string[] args) { Client client = new Client("192.168.23.153", 8888); client.hset("customerHash", "customerID", "1000"); string val = string.Empty; client.hget("customerHash", "customerID", out val); Debug.WriteLine("customerID= " + val); client.close(); } }
好了,本篇先就說到這裡,希望對你有幫助。