緩存服務器 Redis 作者詳談 2.4 版本改進
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。
性能測試結果:
SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次,服務器配置如下:
Linux 2.6, Xeon X3320 2.5Ghz.
stackoverflow 網站使用 Redis 做為緩存服務器。
項目地址:http://redis.io/
由于Redis集群可能在較長一段時間內還處理開發階段,為了避免穩定版本由于這一原因被無限延后,于是從2.2版本fork出了一個2.4分支,這一分支目前進行了一些新的優化改進及bug修復,如果沒有嚴重bug將會在近幾個星期內發布穩定版本。
隨后作者列出了2.4版本中的一大堆優化改進及Bug修復,主要有下面一些:
- 對小數據量的sorted sets結構的內存使用做很大的優化
- RDB文件的持久化速度也將會大大提高
- 對目前的一些寫操作命令進行了改進,支持批量寫入功能
- 啟用新的內存分配模式 jemalloc.
- 通過對copy on write機制使用的優化,數據持久化保存的子進程的內存占用將大大減少
- INFO內容更加豐富
- 新的OBJECT命令,提供對Redis存儲value結構描述
- 新的CLIENT命令,提供對Redis客戶端連接的信息描述
- 徹底將Slave對Master的連接改成非阻塞,之前connect(2)系統調用是會阻塞的
- Redis-benchmark、Redis-cli 都進行了幾個方面的改進
- Make 改為彩色輸出,更易讀
- VM機制徹底廢棄
- 總的來說2.4版本會在各方面有性能上的提升
- Redis測試框架也有非常大的提升
后面又詳細對其中的一些方面做了深入講解
1.對Sorted Sets的內存優化
實際上在2.2版本中,Redis就對小數據量Value的情況做了性能優化,主要優化方式是將小數據量的Value值不再按具體的數據結構存儲, 而是存在一塊二進制的整塊數據。而這一改進一直沒能應用于Sorted Sets數據結構上來,而在2.4版本中,作者終于想到合適的辦法把Sorted Sets在小數據量下也進行了此種優化。
2.RDB文件持久化提速
這塊很大程度上依賴于上面第1點,由于小量數據被存為一個大的二進制數據塊,所以在持久化的時候,就不需要再遍歷數據了,只需要一個key進行一次持久化寫入。
3.提供批量寫入功能
下面是所有提供批量寫入功能的命令
- SADD set val1 val2 val3 … — 返回添加的元素個數
- HDEL hash field2 field3 field3 … — 返回刪除的元素個數
- SREM set val1 val2 val3 … – 返回刪除的元素個數
- ZREM zset val1 val2 val3 … – 返回刪除的元素個數
- ZADD zset score1 val1 score2 val2 … – 返回添加的元素個數
- LPUSH/RLPUSH list val1 val2 val3 … – 返回操作后的LIST的長度
提供批量命令的效果是顯而易見的,網絡往返的時間被大大節約了,在最理想的網絡情況下,作者的測試結果是一次性寫入200w個元素,僅僅花費了1.28秒,每秒超過100w元素的寫入!
為何不為所有寫入命令都加上批量功能呢?作者解釋說,由于很多命令在返回值上需要攜帶信息,如果改成批量的,無法批量返回信息內容。不過相信上面的改進已經可以讓很多應用場景得到大大改進了。
4.改用jemalloc的內存分配模式
Redis長期以來的思想就是盡量不產生外部依賴,比如網絡事件庫沒有用傳統的libevent庫,而是自己單獨抽離出幾個文件組成的更簡單且性能 更高的網絡事件啟動庫,這一庫目前在很多開源項目中也被采用。而此次引入jemalloc實在是由于作者認為Linux下的glibc的內存分配器實在是 太爛了,無法有效地防止碎片的產生。
雖然jemalloc是外部引入,你也不需要在安裝Redis時先安裝一堆東西,因為它已經包含在Redis源碼里了,你還是像往常一樣直接Make編譯即可,還是那么方便貼心。
5.減少 copy-on-write 使用
Redis的RDB文件持久化和AOF日 志寫入,都是通過調用fork()方法產生子進程來做的。由于主進程還是繼續處理請求,當有數據寫操作導致數據內容發生變化時,原來的內存段會被復制一 份,這就是我們熟知的copy-on-write機制。而采用這一機制的問題就是,在最壞的情況下,進行一次RDB文件寫入,可能導致使用內存加倍。所以 在2.4版本中,作者對這一機制的使用進行了優化,大大減少了對copy-on-write的使用。
作者還坦言,自己在2.2版本中在這方面的一些修改是有問題的,這導致了2.2版本中的許多Bug。
6.INFO輸出內容增強
2.4版本的INFO內容會有較大改變,其中比較重要的有下面兩個
used_memory_peak:185680824 used_memory_peak_human:177.08M
你的實際物理內存使用(RSS)和內存碎片情況通常都與最高峰內存使用相關,而這參數就是用來描述這些情況。一個是以byte為單位(185680824),一個是自動智能單位(177.08M)。
7.測試框架的優化和提速
這一點在NoSQLFan之前的文章《Redis 測試引擎將升級提速》中有比較詳細的描述。有興趣的朋友可以查看之前的文章。
來源:antirez.com
原文出處:http://blog.nosqlfan.com/html/2620.html