緩存服務器 Redis 作者詳談 2.4 版本改進

fmms 13年前發布 | 23K 次閱讀 Redis

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.png

由于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

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!