Redis 2.6 新功能預告:aof性能提升
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類keyvalue存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。
在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