概要
redisをproductionで使ってて、データ量が多くなってきたときのkeyのアクセスの仕方について
全てのkeyに
http://redis.io/commands/expire
設定しとけば、いいんですが、できない場合とかやってなかった場合とかでデータ量増えた状態で
特定のkeyの中身を見たいとき
keyを特定する
keys
全件 *
これで検索すると、多分、出力が返ってこないので、データが多い時はやめましょう
keys *
特定のkey
keyが全部わからないけども、途中までわかってて、keysする
データの容量にもよりますが、出力の結果は数秒して返ってきますが、redisで数秒待つとか...
@は変数
keys "@アクション名:@id:@イベント名:*"
ということで、データの容量が多い時はkeys使うのはやめましょう。
計算量を気にする
keysを使うのをやめるという理由に計算量があります。
計算量
No. | アルゴリズム | 説明 |
---|---|---|
1 | O(1) | 計算時間がO(1)のアルゴリズムは、処理が入力の量によらない場合です。 |
2 | O(log n) | 計算時間がO(log n)になるアルゴリズムは、処理をひとつ行うたびに入力を何割か減らせるようなアルゴリズムです。入力が増えても計算時間がほとんど増えません。 |
3 | O(n) | 計算時間がO(n)になるアルゴリズムは、入力の量だけ時間がかかるアルゴリズムです |
4 | O(n log n) | 計算時間がO(n log n)になるアルゴリズムは、そのほとんどがソートを前処理として行います。 |
5 | O(n^2) | 計算時間がO(n^2)になるアルゴリズムは、要素からすべての組み合わせのペアについて調べるようなアルゴリズムです。 |
6 | O(2^n) | 計算時間がO(2 ^ n)になるアルゴリズムは、要素を取り出すときのすべての組み合わせについて調べるようなアルゴリズムです。 |
7 | O(n!) | 計算時間がO(n!)になるアルゴリズムは、要素の順番のすべての組み合わせを調べるようなアルゴリズムです。 |
例えば
http://redis.io/commands/keys
O(N)
入力の量(データ量)だけ時間がかかるアルゴリズムです。
じゃあ、どうするのか
僕の場合ですが、typeしてます
type
http://redis.io/commands/type
O(1)
どんなにデータが増えても時間は変わらない
でも、プログラムを見るなりして、keyはわかってる必要があります。
type "hoge_action:478348:hoge_event"
なければ、 none が返ってきます。
typeが分かってからの値の全取得方法
string
get $redis_key
hash
hgetall $redis_key
fieldまでわかるなら
http://redis.io/commands/hget
list
lrange $redis_key 0 -1
set
smembers $redis_key
sorted_set (zset)
zrange $redis_key 0 -1