目次
Redis
valkey
Redisのフォーク
インストール
$ brew install redis
サーバ起動
デフォルト設定で起動(port 6379を使用)
$ redis-server
port 6379をマスターにしてport 6380で起動
$ redis-server --port 6380 --slaveof 127.0.0.1 6379
コンフィグファイルを指定して起動
$ redis-server ./redis-master.conf
sentinelを起動
$ redis-sentinel
コンフィグファイルを指定してsentinelを起動
$ redis-sentinel ./redis-sentinel.conf
コマンドラインツール
クライアント起動
$ redis-cli -h 127.0.0.1 -p 6379
DB番号を指定
$ redis-cli -n 1
コマンド
大文字/小文字どちらでも動作します。
共通
キーを全て取得
KEYS *
指定したキーのデータ型を調べる
TYPE key
サーバの情報取得。引数で指定したセクションのみ取得することも可能
info info replication info server info sentinel
指定番号のDBに変更
select 1
hash型データの操作
keyに対して保存された値がハッシュでなければエラーになる。
ハッシュが持っているキーを全部取得する。
HKEKS key
ハッシュが持っている値を全部取得する。
HVALS key
ハッシュが持っているキーと値を全部を取得
HGETALL key
バルク処理
ver 2.8から。
コマンドを羅列したファイルを作る。改行コードをCR+LF(windows)で保存
set nyan nyannyan set wang wangwang
cat data.txt | redis-cli --pipe
redis運用の注意点
keysは絶対に使わない
keysは要するにテーブルフルスキャンで、とてもCPU負荷の大きいコマンドです。後述のとおりRedisはシングルスレッドゆえkeys処理中は他のコマンドを受け付けなくなります。
このコマンドをアプリケーションから安易に実行したことが原因で、かなり有名な会社が運営しているサービスやソーシャルゲームでも不具合を出した事例があります。要注意
メモリは十分に
メモリ重要。全てのデータがメモリに乗るようにしましょう。
Redisはシングルスレッド
CPUコアの多いマシンを使っても性能は上がりません。遅いからと言ってCPUの良いインスタンスに変えても改善しないことがほとんどです。
遅い場合は
- メモリが足りているか
- アプリ内で O(n) のコマンドを乱発していないか
あたりをチェックしましょう。
connectionのtimeoutを設定しよう
特にコネクションプールする場合は、サーバ側にconnection timeoutを設定しましょう。
大抵のアプリは終了時にコネクションの切断などしていないのため、redisサーバ側に死んでいるコネクションが溜まっていき、いずれfile descriptorの限界を超えて新規接続ができなくなります。
redisサーバのtimeoutはredisクライアント側よりも大きい値にすべきです。クライアントより先にサーバ側でconnectionが破棄されると、クライアントはコネクション破棄を検知できずに死んだコネクションへ読み書きを行ってしまうためです。