Redis 2.6 新功能預告:aof性能提升

openkk 12年前發布 | 12K 次閱讀 Redis

Redis 一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。

Redis 2.6 新功能預告:aof性能提升

在2.4版
本中,Redis對很多命令引入了批量參數的功能,這可以讓我們一次連接一個操作就操作多個值。這些功能可能你已經用上了,但今天我們要講一個在2.6版本中會推出的一個優化,aof文件rewrite和load的性能提升。

我們知道aof文件是純文本形式的,里面存儲的是Redis的文本協議內容。而在有了批量參數功能后。我們可以把批量參數的命令組合成一個命令,這 樣就能夠減小aof文件的大小。其優點是顯而易見的。比如我們在rewrite的時候,我們可以通過一條命令就把set,list,zset,hash的 數據寫完。load的時候也只需要一條命令就能執行完。

下面是Redis作者做的性能測試結果:

數據集如下:

TYPES
=====
 string: 95480 (95.48%)   zset: 4469 (4.47%)       list: 48 (0.05%)
 set: 3 (0.00%)

可以看到,純key-value的string類型占了絕大多數(95.48%),實際上能夠被組織成一條批量命令的數據占比非常小。在這種不利于aof優化的情況下,測試結果如何呢?

對于aof rewrite操作:

  • 使用舊的aof rewrite方法:耗時 12 秒,aof文件大小 569 MB
  • 使用新的aof rewrite方法:耗時 9 秒,aof文件大小 479 MB
  • 而BGSAVE寫rdb文件的:耗時 9 秒,rdb文件大小 344 MB

對于加載aof操作

  • 加載 RDB 文件時間:7.156 秒
  • 加載舊的AOF文件時間:15.232 秒
  • 加載新的AOF文件時間:12.589 秒

我們可以看到,相對來說性能提升在20%-30%之間,效果還是相當明顯的。

下面再試一個好一些的情況,當數據全部是hash結構的時候,結果會怎么樣呢。首先用下面的lua腳本向Redis寫入100w個hash數據,每個hash數據包含16個屬性

local i, j
for i=1,1000000 do
    for j=1,16 do
        redis.call('hmset','key'..i,'field:'..j,'value:'..j)
    end
end
return {ok="DONE"}

對這100w數據進行上面的實驗,得到如下的結果。

對于aof rewrite操作:

  • 使用老的aof rewrite方法:耗時 17 秒,aof文件大小 851 MB
  • 使用新的aof rewrite方法:耗時 10 秒,aof文件大小 440 MB
  • 而BGSAVE寫rdb文件的:耗時 4 秒,rdb文件大小 158 MB

對于加載aof操作

  • 加載 RDB 文件時間:1.888 秒
  • 加載舊的AOF文件時間:31.946 秒
  • 加載新的AOF文件時間:17.512 秒

我們能夠看到,相對于舊的AOF文件,新的方法在性能上接近50%的提升。而RDB文件的性能更是驚人。這是因為在2.4版本中,BGSAVE方法 會將通過zipmap,ziplist等壓縮結果直接作為value寫入到dump文件,并不解析其結構,而我們上面的例子,100w hash數據,每個屬性只有16個,所以全部都會采用zipmap進行壓縮存儲。這是RDB文件在性能上更高的原因。

無論如何,還是讓我們期待2.6版本的新版AOF吧。

來源:antirez.com

本文轉載自: http://blog.nosqlfan.com/html/3562.html

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