redis.confの設定内容

# はじめに
他のRedis構築に関するページは以下をご参考ください。
[Redis構築のまとめ](https://qiita.com/ono-soic/items/d63ac849ebccee68b5bc)

以下の記事を参考にさせていただきました。(多くはこちらを表形式にしたものになります。)
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544a

検証時にredis-clusterかredis-sentinelかで検証したため、各構築の場合の値が記載されている部分があります。

※今回の設定では${REDISPORT}は6379
その他項目もあるので随時調査していく

| 項目 | 設定値 | 内容 | コメント |
|:--|:--|:--|:--|
| <b>GENERAL</b> |
| # include /path/to/local.conf<br># include /path/to/other.conf || 複数の設定ファイルを利用できる<br>同じパラメータをいじってる場合は最後にincludeされたものが優先される | コメントアウト |
| daemonize |  yes | デーモン化するときはyes  | デーモン化するのでyes |
| pidfile | redis_${REDISPORT}.pid | デーモン化した時のPID |   |
| port | ${REDISPORT} | クライアント向けの開放ポート<br>デフォルトのポート番号を使用 |
| tcp-backlog | 511  | tcp connectionの待ちの上限 | デフォルト |
| protected-mode | no | 他のサーバからのアクセスを制限する<br>コメントアウトしてもデフォルトはyesで設定される | alias IPを使用して接続するためnoに設定 
| bind | 192.168.56.111 127.0.0.1<br>(そのサーバのIPアドレス) | bindするネットワークのインターフェースを限定できる<br>bind xxx.xxx.xx.xxx 127.0.0.1(そのサーバのIPアドレス)を指定する | alias IPを使用して接続するためコメントアウトに設定 |
| unixsocket<br>unixsocketperm | | クライアントからのコネクションに対してUnix socketで対応する コメントアウト |
| timeout | 0 | 指定時間を過ぎるとコネクションが切れる（秒）。０ならdisable | デフォルト |
| tcp-keepalive | 0 | ０でなければクライアントへのTCP ACKsに SO_KEEPALIVE を使う（秒）<br>0が一般的 | デフォルト |
| loglevel | notice | ログレベル<br>debug (たくさん。 development/testing向け)<br>verbose (多すぎない程度にたくさん)<br>notice (普通。本番向き)<br>warning (重要なもののみ。玄人 or リソース厳しいときのみ？) | 本番向きのnoticeに設定 |
| logfile | /var/log/redis/6379.log | logfile名 | |
| syslog-enabled | no | loggingにSyslogを使う | コメントアウト |
| syslog-ident | redis | syslogの識別子 | コメントアウト |
| syslog-facility | local0 | syslogのfacility、LOCAL0-LOCAL7のどれか | コメントアウト |
| databases | 16 | databaseの個数。０〜N-1まで作られ、初期の接続先は０ # クラスタ構成するならv3.0では一つしか使えない | デフォルト |
| <b>SNAPSHOTTING</b> |
| save  | save ""<br>■デフォルト<br>900 1<br>300 10<br>60 10000<br>[A] [B] | save [seconds] [changes]<br>RDB ファイルを自動的にディスクに保存するタイミングを設定。複数指定可能<br># B 回変更されたら、その後 A 秒以内に保存する<br>保存したくない場合は「save ""」 | 永続化しないのでsave "" |
| stop-writes-on-bgsave-error | yes | RDBスナップショットが有効なのに作成に失敗している（保存できていない）場合は書き込みを受け付けない。デフォルトではyes<br>これにより、ユーザーは永続化できないのを無理矢理に知ることができる。 | デフォルト |
| rdbcompression | yes  | LZFを使ってrdbを圧縮する<br>普通はyesだが、どうしてもCPUリソースを削りたいときはno | デフォルト |
| rdbchecksum | yes | RDBバージョン５から、 CRC64 checksumがファイル末尾につく<br>正真性がある、その処理にCPUを取られるので場合によってはnoにする | デフォルト |
| dbfilename | ${REDISPORT}.rdb | RDBのファイル名 |
| dir | /var/run/redis | dbfilenameのファイルや、redisが使う一時ファイルなどを保存する領域<br>ファイル名でなくディレクトリ名 |
| <b>REPLICATION</b> |
| slaveof | ・sentinelの場合<br>[masterip] [masterport]<br>・clusterの場合<br>コメントアウト | 対象のマスタのスレーブとなる<br>1) レプリケーションは非同期だが、もしレプリカが一定数死んでいれば書き込みを止めることもできる<br>2) スレーブは、少しのネットワーク障害であれば整合性を回復できる<br>3) レプリケーションは自動なのでユーザーで気にする必要はない。もしネットワークが瞬断しても自動で復旧する。 |
| masterauth | [master-password] | もしマスタが認証アリにしていたら、スレーブはまず認証を通ってからでないとレプリケーションできない。(VIP方式を使用する場合はマスタ/スレーブは同じパスワードでないといけない) | 任意のパスワードの設定をお願いします 
| slave-serve-stale-data | yes | 1) slave-serve-stale-dataが'yes'なら、 古くても多少不整合でもいいからレスポンスを返す<br>2) slave-serve-stale-dataが'no'なら、 INFO and SLAVEOF以外のコマンドは受け付けない<br>（redisのスレーブは古い状態もありうるのが一般的なのでyesでよいかと） | デフォルト |
| slave-read-only | yes | スレーブが書き込みを受け付けるかどうか。 （直ぐにレプリケーションで消されてしまうが、一時的なデータストアならいい。 しかしクライアントが間違えて使ってしまうケースが起こりうることに注意。 | デフォルト |
| repl-diskless-sync | no | 注： disklessはEXPERIMENTAL<br>クラスタに新しく加わった場合は、差分でなくfull syncをする必要がある。これは二種類の方法がある。 <br>1) Disk-backed: マスタがRDBファイルを作りスレーブに転送する。 一度RDBを作ってしまえば、好きなタイミングで送るだけ。<br>2) Diskless: マスタがスレーブのRDBファイルソケットに直接データを送る。 複数のソケットに同時に送れるが、送信中に他クライアントの追加はできない。 Diskが遅くてネットワークが速いならDisklessの方が良い。（EXPERIMENTALだけど） | デフォルト |
| repl-diskless-sync-delay | 5 | Disklessの場合、一定時間待ってからレプリケーションを開始する。<br>これは、一度転送が始まると後から新規ノードが来ても対応できないため。 | デフォルト |
| repl-ping-slave-period | 10 | スレーブがマスターに PING を送る間隔を指定(秒)<br>（ネットワークが安定しているならもう少し短くていいかも） | コメントアウト |
| repl-timeout | 60 | 重要な点は、この値はrepl-ping-slave-periodよりかなり大きくしないと、<br>一度pingが通らないくらいでtimeout判定されてしまう。（秒） | コメントアウト |
| repl-disable-tcp-nodelay | no | yes<br>少数のpacketでやりとりして帯域を占領しなくなるが、遅延が起きてしまう。<br>no<br>多くのpacketで帯域を占領するが、遅延は少なくなる。 デフォルトはnoだが、ネットワーク環境が悪い場合や、物理的に遠い場合はyesを利用する。 | デフォルト |
| repl-backlog-size | 1mb | スレーブが一時的にマスタから見えない時に差分データを溜めておく<br>fullSyncの時には必要ない<br>このbacklogは、slaveが一つ接続された時のみ作られる（スレーブごとに作られる？） | コメントアウト |
| repl-backlog-ttl | 3600 | slaveとの接続が切れて指定時間過ぎたらbacklogが消される。 0ならずっと消さない。 （backlogが消されてからslaveが復帰したら、RDB dumpを取ってくることになる？） | コメントアウト |
| slave-priority | 100 | Redis Sentinelがスレーブ昇格の際に参考にする優先度 || どのサーバも一律100に設定 | デフォルト |
| min-slaves-to-write<br>min-slaves-max-lag | 3<br>10 | どちらかの設定が０やコメントアウトしてたらこれらはdisabled この値はただの設定例 （データロストを防ぎたいならキツ目に設定しておく）<br>書き込みを許容する際のスレーブの最低数<br>書き込みを許容する際のスレーブの最終接続からの経過時間 | コメントアウト |
| <b>SECURITY</b> |
| requirepass | xxxxxx | redis起動時にパスワードが必要になる設定<br>パスなしのコマンドも受け付けなくなる | 任意のパスワードの設定をお願いします |
| reneme-command CONFIG |   |   | コメントアウト  |
| <b>LIMITS</b> |
| maxclients | 10000 | コネクションの数を制限します<br>デフォルトは10000クライアント<br>最大でfile limit -32まで可能（redisは他にもfileを扱うので、多くて困ることはない気がする。） | コメントアウト |
|  maxmemory | [bytes] | メモリが設定値を超えたら、redisは古いkeyを削除する<br>もし破棄できなければ、set系のコマンドはエラーを返す（getは問題なし）<br>デフォルトではLRUを使用<br>WARNING: slaveを利用している場合は、output bufferにメモリを持って行かれるので注意<br>maxmemoryはサーバの半分ほどのメモリを使用するとmaxmemoryに達した挙動を行うので、サーバの半分程度のmaxmemoryを設定しておくと良い<br>メモリ検証(Redis)(随時リンク追加) | コメントアウト |
| maxmemory-policy | volatile-ttl | メモリ検証(Redis)参照 |
| maxmemory-samples | 5 | アルゴリズムの厳密さ？ （数値が高ければアルゴリズム[LRUとか]に近くなるがメモリを消費する。低ければいいかげんだが速い） | コメントアウト |
| <b>APPEND ONLY MODE</b> |
| appendonly | no | デフォルトでは非同期で永続化するので、あるケースではデータがロストする可能性がある Append Only Fileは、それよりも障害に強いモード デフォルトでは最悪の場合1秒程度のデータロストの可能性がある AOF と RDBへの保存は両立する。AOFの方がデータが飛びにくい Please check http://redis.io/topics/persistence for more information. （消えたくないデータを使っているなら一旦yesでよいかと） | デフォルト(永続化しないのでno) |
| appendfilename | appendonly.aof | append only fileの名前 | コメントアウト |
| appendfsync | everysec | OSのfsync()を利用して即座に書き込むようになる、3種類のモードを用意している<br>no: OSの好きなタイミングでfsyncする。速い <br>everysec：毎秒書き込む。デフォルト<br>always：遅いがデータが飛ばない http://antirez.com/post/redis-persistence-demystified.html | デフォルト |
| no-appendfsync-on-rewrite | no | fsyncがものすごくIO waitを発生してしまったら、現状防ぐ方法がない この問題を解決するには、BGSAVEが既に起動中ならfsync()のコールを止めること waitが発生して入る場合には "yes" それ以外は"no"のままにすることで耐障害性は高くなる | デフォルト |
| auto-aof-rewrite-percentage | 100 | 指定したパーセントを超えた場合に自動的に AOF を再構成する | デフォルト |
| auto-aof-rewrite-min-size | 64mb | 指定したサイズ以下の場合には自動的に再構成しない | デフォルト |
| aof-load-truncated | yes | AOFから復旧した場合、読み終わったAOFファイルを消すかどうか | デフォルト |
| <b>LUA SCRIPTING</b> |
| lua-time-limit | 5000  |   | デフォルト  |
| <b>REDIS CLUSTER</b> |
| cluster-enabled | ・sentinelの場合<br>no<br>・clusterの場合<br>yes | クラスタに参加するには、以下のモードをyesにする必要がある | Clusterを使用しないのでno |
| cluster-config-file | nodes-${REDISPORT}.conf | Redisノードが、クラスタの状態を永続化するためにcluster-config-fileを用いる。<br>(これによって再起動時にすぐにクラスタに加わるなどが可能になる。) |
| cluster-node-timeout | 15000 | ノードの死活管理の際に用いるミリ秒指定 | デフォルト |
| cluster-slave-validity-factor | 10 | スレーブは、自身のデータが古いと判断したらマスタに昇格しない dataの古さの明確な指標はないので以下の方法を用いる 1) 複数のスレーブがフェイルオーバー可能な場合、offset値を見て一番新しいスレーブにする 2) マスタと最後に連絡がとれた時間を見て判断する<br>2は、ユーザーの方で、どのくらい古くても許容するかを指定できる。<br>(node-timeout * slave-validity-factor) + repl-ping-slave-period<br><br>可用性を最大化するためにslave-validity-factorを０にすることができる<br>これはスレーブが、マスタと以前通信できていても常にフェイルオーバーをしようとする （しかしマスタが生きていればoffsetを更新して終わり） ０は、常にクラスタが生きていられるようにマスタを維持しようとする | コメントアウト
| cluster-migration-barrier | 1 | クラスタは、もしマスタの一部が飛んでも接続を試み続ける。 これは、もしスレーブが昇格するとスレーブいなくなる時に、データを維持し続けることができる。 スレーブは、もしマスタが死んでスレーブの数も十分な場合のみフェイルオーバーする。 その数に達していなければフェイルオーバー（マイグレーション）しない。 デフォルトは１で、０にするとデータのロストがありうるので本番時はおすすめしない。 （スレーブなしのマスタがいると、そいつが死んだらデータは永遠に失われるため。）| コメントアウト |
| cluster-require-full-coverage | yes | デフォルトでは、あるslotが応答できなくなったら全部のクエリを止める。 これは、もし担当ノードが死んでslotが利用できなくなったら、非同期でクラスタ全体を止める。 slotが復活したら即座に運用を再開する。 もし一部だけでも動かし続けたい場合はここをnoにする。 （あるいはデータのロストや不整合を許容しても可用性を確保したいとき以外はyes） | コメントアウト |
| <b>SLOWLOG</b> |
| slowlog-max-len<br>slowlog-log-slower-than | 128<br>10000 | 特定時間を超えるクエリを特定する。 これにはクライアントとのIOは含まない。 実行待ちは含まず、純粋に処理時間を扱う。 2つのパラメータを設定できる。 len：一つはslowの度合い。（㍉秒） than：もし容量を超えたら古いものが消される | デフォルト |
| <b>LATENCY MONITOR</b> |
| latency-monitor-threshold | 0 | インスタンスの遅延度を別プロセスで収集するツール<br>LATENCYを利用してグラフを表示する。<br>応答速度の許容値㍉秒（もし０なら表示しない。） （普段は消しておいて、問題が発覚してからonにするでもいいのでは。） | デフォルト |
| <b>EVENT NOTIFICATION</b> |
| notify-keyspace-events |  |   | デフォルト |
| <b>ADVANCED CONFIG</b> |
| hash-max-ziplist-entries<br>hash-max-ziplist-value | 512<br>64 | hashエンコードはkeyの数が小さければ効率化する必要があるし、多ければ閾値を超えないようにする必要がある | デフォルト |
| list-max-ziplist-entries<br>list-max-ziplist-value | 512<br>64  | hashと同様にlistも決める必要がある | デフォルト |