標籤:

SSDB 和 Redis 的優缺點各位哪些?

Redis 和 SSDB 的異同點,以及各自優缺點都有哪些。


謝邀。

SSDB 我沒用過,但讀了源碼,發現 sorted set 的實現很低效,主要是依賴 leveldb 會按 key 來排序的特性。而我的使用場景大量依賴 sorted set ,所以就放棄了。不過今天去看 Benchmark · siddontang/ledisdb Wiki · GitHub 的時候,發現主要是 zrevrange 和 zrevrangebyscore 特別慢,而 zrange 和 zrangebyscore 還能接受。其中,LedisDB with lmdb 的性能似乎很好,值得嘗試;但不排除測試時數據量小,只讀寫了內存的可能性。

至於優缺點,SSDB / LedisDB 的優點是對內存的需求小,是個較便宜的方案。

不差錢的話,Redis 在性能、穩定性和社區上都更加優秀。


項目用有用ssdb 性能還不錯上面是ssdb與redis的性能對比

PHP有中文說明書:SSDB PHP 客戶端 API 文檔_SSDB API文檔

SSDB1.9.3下載地址:https://github.com/ideawu/ssdb/archive/master.zip


ssdb主要看中的是和Redis兼容,這樣不用改源碼,就可以換個存儲引擎了。

基於Redis先驅開發的存儲有aerospike,vedis,ssdb,解決了多語言多線程分散式環境下快速存儲問題,比mysql傳統資料庫要快,有的和redis協議兼容,方便更換存儲引擎。

隨著工業化生產及技術更新換代,內存會越來越便宜越來越便宜,現在有支持24TB內存的cpu。

內存計算是必然出現的,隨著容易的提高,未來發展空間很大,因為內存是離cpu最近的存儲,速度比外部存儲要快得多。

ssdb主要是可以把存儲不下的持久化到硬碟,解決Redis容量有限問題,如果你在生產系統中,內存不夠,是要人命的。


redis是內存資料庫,ssdb是面向硬碟的存儲,二者在存儲格式和讀寫方式上有著根本的不同。前面回答里提到的zrevrange 和 zrevrangebyscore慢,而zrange 和 zrangebyscore 還能接受,其實就是說逆序遍歷比順序遍歷慢得多,其根本原因就在於逆序遍歷的時候,會多一個「記錄頭部」定位的過程,需要不斷嘗試去定位到兩條記錄的「分界點」,而順序遍歷的時候則不需要,因為讀完一條記錄直接就到了下一條記錄的「分界點」,並且像rocksdb之類的存儲引擎都會把數據長度保存在記錄的元信息里,只需要按長度讀取數據就可以了。redis則不存在類似問題,因為它是完全基於指針和偏移量在內存中進行定址來讀取數據的,定址效率高了好多個數量級。

ssdb貌似就是一個個人項目,但代碼質量還是不錯的,整個設計思想比較簡潔。

ssdb的主從複製效率很低。binlog和數據是分開存儲的,日誌冗餘較多,由於ssdb本身要在多線程條件下才能發揮出更好的性能,為了使多個線程在寫入binlog時能保證操作順序和原子性,ssdb的binlog數據結構上用了一把全局鎖,可想而知,這裡的鎖競爭會很影響性能。

另外,ssdb默認也沒有集群管理的支持。

ssdb的好處,和swapdb(http://github.com/JRHZRD/swapdb)一樣,都可以省錢。如果有需要,可以嘗試swapdb,它結合了redis和ssdb的優點,實現了基於LFU的熱度統計和冷熱交換,做到了低成本和高性能的高平衡。

redis的好處,那就多了。缺點就是純內存,比用SSD花錢。


我的項目用了ssdb。

一般情況下性能還不錯,但是數據量大了之後容易出現慢查詢。

下面是單線程批量插入數據的慢日誌:

w:0.071,p:54624.628, req: multi_set 1:7270a5848dd162d6f2a80f801af509ee [10751] 1:7270a7637feb3578f6a2c814e2ec4bf1 [10751] [196 more...], resp: ok 100

以上原因是leveldb 在持續寫入大量數據後會降低寫入速度,最後甚至停止寫入。

在使用ssdb 的過程中還碰到一個問題,ssdb沒有能夠有限的使用內存緩存數據,導致多次查詢相同數據出現慢查詢。這種現象主要集中在數據量大,或者第一層數據較多的情況。

總體來說ssdb現在不能很好的用起來,出現慢查詢我也不能有限的解決。


SSDB還不是成熟的開源項目,社區不夠活躍,貢獻者不多;

主要開發人員也非常忙, 項目的後續發展沒有規劃;

因為一些原因,捨棄了很多重要的功能,比如沒法查詢命中率;

等等。


看了看ssdb存儲引擎的原理,發現ssdb還是比較適合讀取少寫入多的場景的,底層用的levedb存儲引擎,寫入時候第一步記錄到日誌中,就可以保證數據不丟失,也可以算作寫入成功,存儲方式使用LSM樹,以memtab為存儲單位,內部使用skiplist的數據結構,在memtab達到條件進行落盤,落盤以數據寫入新鮮度劃分為level0,level1......越是新寫入的數據查詢越快,因為查詢是先查詢內存中的memtab,找不到查詢level0,level1......順序查詢下去,在短時間內數據量很大情況下,很快會達到落盤要求,那麼查詢很可能就會去讀取磁碟中數據,比較慢,個人理解,有誤方面還請指出


測試下來性能非常的差,不建議生產環境使用ssdb


ssdb對windows用戶不友好,官方的解決方案竟然是..讓用戶裝linux虛擬機?


推薦閱讀:

Redis內部數據結構詳解(4)——ziplist
redis是個單線程的程序,為什麼會這麼快呢?每秒10000?這個有點不解,具體是快在哪裡呢?EPOLL?內存?
Linux安裝redis,並設置訪問許可權,及使用可視化工具

TAG:Redis |