miyabihitoの日記

個人的な技術メモ

Redis

■公式サイト
http://redis.io/
https://twitter.com/redisfeed

■参考
http://dotinstall.com/lessons/basic_redis

■概要
・KVSに分類される。
POSIXシステムで使用できる。
・値として保存できるデータには、いくつかの型がある事から、
データ構造サーバと称されるらしい。
BSDライセンスで公開されているオープンソース
https://github.com/antirez/redis
・ステーブルバージョンは、2.6.10(2013/02/24)
・インメモリデータベース
メモリサイズの制約があるので、アプリケーション全体のデータではなく、
一部の機能のためのデータを格納する使い方がなされる。

■インストール
sudo port install redis
//sudo port load redis 自動的に起動するようになるらしい

\--インストール時メモ------------------------------
If you prefer to start a redis server manually, rather than using 'port load',
then use this command:

redis-server /opt/local/etc/redis.conf

                                                                                                  • -


■永続化
http://redis.io/topics/persistence (読解中)
RDB
非同期で、メモリ上のデータをディスクに保存する方式。

ファイル名指定: dbfilename dump.rdb
保存条件指定(複数指定可) : save 900 1
(900秒の間に一度書き込みがあったら、その900秒経過後にバックアップを行う)

メリット : パフォーマンスがよい。
デメリット: 万が一のときのデータ損失が多いかもしれない(設定次第の点もある)

・AOF
書き込みのコマンドを実行時、コマンドをログファイルに書き込む。
設定
appendonly yes
appendfsync (always|everysec|no)
メリット : パフォーマンスが落ちる。(書き込み時に毎回I/Oがあるため)
       ログファイルが膨大になる。
デメリット: 万が一のときのデータ損失が少ない。


■操作
・サーバの起動
$ redis-server (config file)

・クライアントの起動
$ redis-cli
> exit (クライアントの終了)
> shutdown (サーバの終了)

・バージョン確認
$ redis-server --version

・データベースの選択
番号で指定する。 デフォルトで 0〜15まで、用意されている
!!! 16以降はどうするの !!!
> select 0
指定後は、プロンプトに選択DBの番号が表示される。

・データの保存
> bgsave : バックグランドで保存作業が始まる。
dump.rdb というファイルに保存される。
!!!設定ファイルでの指定方法調査!!!
指定無しだと、サーバ起動時のカレントディレクトリに保存。

・キー操作
keys pattern: キーの表示
引数にワイルドカードを指定できる。
!! 引数未指定時は? !!
exists key: キーの存在確認(有:1、無:0)
rename key name: キーのリネーム
del key: 指定したキーと対応するバリューの削除
expire key seconds: 有効期限指定(秒)
注意: 再度setするとexpireの指定は、解除される
ttl key : 有効期限参照(未指定の場合は、-1)
type key : 型の判定

■データ型
valueに以下の型のデータを持てる

・String
設定: set key value
(複数同時設定は、mset)
取得: get key
(複数同時取得は、mget)

値が整数値と判断できるデータには、加減算が適用できる。
incr / incrby
decr / decrby

・List : 配列
[key] [value]
language C Java PHP Perl Python

上例では、追加順は左から右

追加: (l/r)push
削除: (l/r)pop
範囲削除: ltrim key left-index right-index
指定した範囲外の要素が削除される

取得: lindex key index
範囲取得: lrange key left-index right-index
indexには、マイナスの値も指定できる。(末尾からのカウントになる)
0 -1 で、全取得になる
個数取得: llen key

・Set : 順不同、重複不可
追加: sadd key value
削除: srem key member
一覧: smembers key
要素数: scard key

和集合: sunion key1 key2
積集合: sinter key1 key2
差集合: sdiff key1 key2

集合コマンドは、storeを付けると、結果をセットできる。
例)suniont key key1 key2
key1とkey2の和集合をkeyのバリューに保存できる。

・Sorted Set : Setの機能に加え、個々の要素に、重み付けのスコアを設定できる。
        ランキングに用いられる。
追加: zadd key score value
取得: zrange key start end(昇順)
    zrevrange key start end (降順)
ランク取得: zrank key value (scoreの昇順ランク取得)
       zrevrank key value (scoreの降順ランク取得)



・Hash : 値に連想配列を設定できる。
追加: hset key field value(複数:hmset)
取得: hget key field(複数:hmget)
キー数取得(フィールド): hlen key
キー一覧(フィールド): hkeys key
値一覧 : hvals key
全件取得: hgetall key (フィールドとバリューが交互に表示される)

■その他コマンド
・sort key
List, Set, Sorted Setに対して使用可能。
デフォルトで昇順に並べかえる。 sort key desc で降順。
!!!実行後の値自体も下記変わるか確認。!!!
値が文字列の場合、sort key alpha

トランザクション的な機能
multi
command1
command2
command3
exec or discard

multi 〜 exec/discard までは、他の処理を割り込ませずに、
処理を連続して行わせる事が出来る。
(ただし、途中の処理で、サーバのダウン等が発生した場合は、
 途中まで実行されている事がありえるそう。
要調査)


■その他
VMwareがスポンサーなので、今後のサポートが安心
ANSI Cで書かれている

■クライアントライブラリ
fuelphp : http://fuelphp.com/docs/classes/redis.html

■Pub/Sub
チャンネルを指定して、クライアント間でメッセージを送信できる。
・送信側
PUBLISH channel message

・受信側
SUBSCRIBE channel

Node.js, socket.io と組み合わせるとチャットが出来そう。
また、上記のスケールアウトのためのハブに出来る?。

レプリケーションhttp://redis.io/topics/replication
仕組み:(粗い訳)
スレーブが、 SYNC コマンドをマスターへ送る。
マスターが、DBの内容をバックグラウンドでし、DBの内容を変更するコマンドを蓄積する。
バックグラウンドでの保存が完了次第、ファイルをスレーブへ送り、
スレーブはそれを、ディスクに保存し、メモリへ展開する。
マスタはファイルをスレーブへ転送後、クライアントからの蓄積したコマンドをスレーブへ送る。
non-blockingなので、レプリケーション時にマスタの処理が止まる事はない。

同時に複数のスレーブからの同期依頼がきた場合でも、バックグラウンドでの保存処理は一つ。
スレーブは、コネクションが切れた場合、自動的に再接続する。
スレーブとのコネクションが切れた場合は、再接続時に全同期する。

・設定ファイル
slaveof (ip-address) (port)
*サーバにパスフレーズが設定してある場合。
masterauth

・コマンド
SLAVEOF host port
(SLAVEOF NO ONE で、マスタへ昇格する。その際、既存のデータは破棄されない)
*サーバにパスフレーズが設定してある場合。
config set masterauth

マスタサーバを書き換えると、今までの全データを破棄し、新しいマスターのデータを同期し始める。

・Read only slave
バージョン2.6からデフォルトで設定されているモード。
書き込みコマンドを受け付けない。
ただし、これはセキュリティ上の目的ではない。(CONFIGコマンド等の管理コマンドは使用できるため)
管理コマンドをrename-commandディレクティブでリネームする事により、
セキュリティの向上をはかれる。


■Redis Sentinel(確認中)
http://redis.io/topics/sentinel
Redisの
・監視
・異常時の通知
・自動フェイルオーバー(スレーブの自動昇格)
の機能を持つプログラム。

バージョン2.4.16以上または、2.6.0-rc6以上のみ対応。

http://blog.kenjiskywalker.org/blog/2013/01/15/redis-sentinel/



スレーブのどれがマスターに昇格?

■未確認項目・疑問点
!!! その他コマンド !!!
!!! マスター障害時の対応は !!!
!!レプリケーション設定は !!
!! 設定ファイルの中身確認
Redis Cluster