Edited at

Redisをhash形式にすると容量軽くなるっていうけどどうもよくわからない

More than 1 year has passed since last update.

すみません有用な結論はないです。

検証した結果よくわからなかったということで、いったんここで打ち切りがてらメモ。

内容はしょって書いてありますが検証コードと結果をあげたgithubのリンクを最後にはりつけてあります。

検証用のコードは主にpythonで書きました。


どういうことかというと

RedisのHash型を活用するとメモリ使用量が激減

https://siguniang.wordpress.com/2013/02/16/hash-reduce-memory-usage-in-redis/

って素敵な記事を読みまして。

hash形式でデータ格納すると、Redisで圧縮かかって必要なメモリ容量めっちゃ減るよ!ってな感じのことが書いてあるじゃないですか。(ナナメ読みしかしてませんごめんなさい)

その差、なんと5倍!

で。


仮説1

前項のことについて

以下のようなデータがあるとして

key1: hogehoge1

key2: hogehoge2
key3: hogehoge3

以下のように個別のキーにしてRedisに格納するよりも

redis-key1: hogehoge1

redis-key2: hogehoge2
redis-key3: hogehoge3

以下のように、1つのキーにhashでまとめてデータつっこんだほうが

redis-hash-key-hoge: {

hash-key1: hogehoge1
hash-key2: hogehoge2
hash-key3: hogehoge3
}

容量節約できるよ!って話だと思ってたんですよ。

それで検証してみたんですけど。


仮説1の検証結果

そうでもなかった。

検証コードのtest_all.shから実行した結果のresultにありますが、使用しているメモリ容量はさほどかわらない。


仮説2

じゃあ、比較すべきは、これと

redis-hash-key-hoge: {

hash-key1: hogehoge1
hash-key2: hogehoge2
hash-key3: hogehoge3
}

これ(イメージ)

redis-str-key-hoge: serialize({

hash-key1: hogehoge1
hash-key2: hogehoge2
hash-key3: hogehoge3
})

かな?って検証してみたんですよ。


仮説2の検証結果

これもそうでもなかった。

検証コードのtest_all2.shから実行した結果のresult2にありますが、使用しているメモリ容量はさほどかわらない。


つまりどういうことだってばよ?

わからん。


  • 仮説に対する検証コードが間違ってる

  • データ件数が多くないと効果が出ない

  • 環境の問題とかバージョンの問題とかいろいろ

などの可能性はありますが、とりあえず疲れたのでいったん中止…


検証につかったコードと結果ファイル

https://github.com/robitan/redis-kensho/tree/kensho-set-hset

※やたらめったら出してあるデバッグ情報とか無駄な機能とかに、苦労と苦悩のあとを読み取っていただけるととても嬉しい…。


参考URL

検証コードの作成にあたり、以下のURL参考にさせていただきました。ありがとうございます。結果がよくわからないことになったのはただただ自分のせいです。

http://mokicks.hatenablog.com/entry/2017/10/13/024127

https://qiita.com/FGtatsuro/items/92bca91ed665449ab047

http://takuya-1st.hatenablog.jp/entry/2014/08/23/022031

https://qiita.com/kentarosasaki/items/033751ba8b26cc51cf2a

https://siguniang.wordpress.com/2013/02/16/hash-reduce-memory-usage-in-redis/