Python
Redis
python3

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

すみません有用な結論はないです。
検証した結果よくわからなかったということで、いったんここで打ち切りがてらメモ。
内容はしょって書いてありますが検証コードと結果をあげた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/