Closed4

検証時によく使う Redis コマンドや設定など

tamaco489tamaco489

とりあえずデータを取得するときに使う

全てのデータを取得(本番環境ではパフォーマンスに影響が出るため無闇に使わないこと)
127.0.0.1:6379> KEYS *
1) "customer:{1969}:user:{10010719}:items"
2) "customer:{1969}:user:{10003342}:items"
3) "customer:{1969}:user:{10056734}:items"

...

98) "customer:{1969}:user:{10021006}:items"
99) "customer:{1969}:user:{10082247}:items"
100) "customer:{1969}:user:{10033240}:items"
127.0.0.1:6379> KEYS customer:{*}:user:{*}:items
1) "customer:{1969}:user:{10010719}:items"
2) "customer:{1969}:user:{10003342}:items"
3) "customer:{1969}:user:{10056734}:items"

...

98) "customer:{1969}:user:{10021006}:items"
99) "customer:{1969}:user:{10082247}:items"
100) "customer:{1969}:user:{10033240}:items"
指定した文字列にマッチする全てのキーを取得(countを指定するのが望ましい)
127.0.0.1:6379> SCAN 0 MATCH customer:{*}:user:{*}:items
1) "10240"
2)  1) "customer:{1969}:user:{10019565}:items"
    2) "customer:{1969}:user:{10012381}:items"
    3) "customer:{1969}:user:{10031441}:items"
    4) "customer:{1969}:user:{10080567}:items"
    5) "customer:{1969}:user:{10054365}:items"
    6) "customer:{1969}:user:{10030981}:items"
    7) "customer:{1969}:user:{10018066}:items"
    8) "customer:{1969}:user:{10007760}:items"
    9) "customer:{1969}:user:{10057106}:items"
   10) "customer:{1969}:user:{10086056}:items"
tamaco489tamaco489

複数のデータをまとめて操作したい(投入と取得)

MSET・MGET

まとめて投入

127.0.0.1:6379> MSET customer:{1969}:user:{10011460}:items "30062034,30076875,30096467" customer:{1969}:user:{10070677}:items "30054810,30004512"
OK


まとめて取得

127.0.0.1:6379> MGET customer:{1969}:user:{10011460}:items customer:{1969}:user:{10070677}:items
1) "30062034,30076875,30096467"
2) "30054810,30004512"

# 存在しないキーを指定すると nil が返る
127.0.0.1:6379> MGET customer:{1969}:user:{10011460}:items customer:{1969}:user:{9999999}:items customer:{1969}:user:{10070677}:items
1) "30062034,30076875,30096467"
2) (nil)
3) "30054810,30004512"
SAD・SMEMBERS

1つのキーに対して複数の値をSET型で関連付ける。※重複排除される、順序はない

127.0.0.1:6379> SADD customer:{1969}:user:{10004046}:items 30098554 30078569 30033259
(integer) 3
127.0.0.1:6379> SADD customer:{1969}:user:{10082975}:items 30003094
(integer) 1
127.0.0.1:6379> SADD customer:{1969}:user:{10022919}:items 30000761 30015732
(integer) 2


指定したキーに関連付けられたSET型のデータを取得する

127.0.0.1:6379> SMEMBERS customer:{1969}:user:{10004046}:items
1) "30033259"
2) "30078569"
3) "30098554"
127.0.0.1:6379> SMEMBERS customer:{1969}:user:{10082975}:items
1) "30003094"
127.0.0.1:6379> SMEMBERS customer:{1969}:user:{10022919}:items
1) "30000761"
2) "30015732"


SADD で投入したデータは GET や MGET では型が異なるため取得できない

127.0.0.1:6379> GET customer:{1969}:user:{10004046}:items
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> MGET customer:{1969}:user:{10004046}:items customer:{1969}:user:{10082975}:items customer:{1969}:user:{10022919}:items
1) (nil)
2) (nil)
3) (nil)
tamaco489tamaco489

データを一旦初期化したいときに使う

現在接続中のデータベース(デフォルトは0番)にある全キーを削除。※本番環境で使う際は要注意
127.0.0.1:6379> KEYS customer:{*}:user:{*}:items
1) "customer:{1969}:user:{10010719}:items"
2) "customer:{1969}:user:{10003342}:items"
3) "customer:{1969}:user:{10056734}:items"

...

98) "customer:{1969}:user:{10021006}:items"
99) "customer:{1969}:user:{10082247}:items"
100) "customer:{1969}:user:{10033240}:items"

# 削除する
127.0.0.1:6379> FLUSHDB
OK

# 削除されたことを確認
127.0.0.1:6379> KEYS customer:{*}:user:{*}:items
(empty array)
Redis サーバーが内部的に確保している不要なメモリを OS に返却するための命令。
127.0.0.1:6379> MEMORY PURGE
OK

補足:

  • Redis は効率のためにメモリを確保したまま保持し、OS に返さないことが多い(used_memory_rss が高止まりする原因)。
  • MEMORY PURGE は、Redis のメモリアロケータ(jemalloc など)に対し、アイドルなメモリを OS に返すよう要求する。
tamaco489tamaco489

メモリ周りの確認

投入したデータがどれくらいの容量だったのかを確認する

host マシンから redis コンテナ向けのコマンドを実行すれば正規表現でやりくりできる。※もっと良い方法がありそうにも思うが

# データ投入前
$ docker exec -i core_redis redis-cli FLUSHALL
OK
$ docker exec -it core_redis redis-cli INFO memory | grep -E "^(used_memory|used_memory_human):"
used_memory:979112
used_memory_human:956.16K

# データ投入後
$ docker exec -it core_redis redis-cli INFO memory | grep -E "^(used_memory|used_memory_human):"
used_memory:2278293928
used_memory_human:2.12G
Redis サーバ側のメモリ上限値や上限に達した時の振る舞い確認する
// 上限値は1GBに設定されている
docker exec -it core_redis redis-cli CONFIG GET maxmemory
1) "maxmemory"
2) "1073741824"

// 上限値に達した場合は最も長い間アクセスされていない(使われていない)キーから削除
docker exec -it core_redis redis-cli CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"

→この状態で、1GB以上のデータ突っ込むとひっそりと消されていくので要注意。


// 上限値に達した場合はエラーにする
$ docker exec -it core_redis redis-cli CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

→開発時とかはエラーにする設定とかの方が良いかも。
上限に達すると OOM command not allowed when used memory > 'maxmemory' のエラーを吐かせる。

このスクラップは1ヶ月前にクローズされました