-
Notifications
You must be signed in to change notification settings - Fork 0
Redis
- インストール
Debian系: sudo apt-get installl redis-server
CentOS系:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/redis-2.4.10-1.el6.x86_64.rpm
rpm -ivh redis-2.4.10-1.el6.x86_64.rpm
chkconfig redis on
ほんでredis-server
で起動する。
/etc/redis/redis.conf
に色々設定する。
和訳があるのでコレを読んだら良い?
もし古ければ自分でビルドすることもできる。(そんなに時間はかからないはずでsu)
$ wget http://download.redis.io/releases/redis-3.0.4.tar.gz
$ tar xzf redis-3.0.4.tar.gz
$ make
$ sudo make install
ここまでで redis-cli
できるはず。
$ sudo ./install-server.sh (どっかにあるはず)
したらinitもしてくれるので
$ sudo service redis-(ポート番号) start
とかすればよさそう。
index張ったsqlは遅くないです。単純にuserをidから抽出するみたいなのだったらそう変わらないので様子をみたほうがいい。
例えばアクセス数を毎回SQLから計算してるとかそういうのがあれば使えると思う。あとはアクセスごとにinsertするのとか、sqlつかってると遅いのでredisに乗り換えるメリットは十分にあります。
redis-rbというのとhiredis-rbというのがある。
後者は単体でも使えるけどインターフェースが悪い。両方reuiqreすると、インターフェースはredis-rbでバックエンドでhiredis使ってくれるらしいのでそうするのが一番賢いっぽい。
その場合にはrequire 'redis/connection/hiredis'
が必要。
おそらくsqlのテーブルを一つのhashに置き換える、という運用になると思われる。redis-namespace
というgemが簡易にkeyにprefixをつけてくれるのでコレを仮想的なテーブルとして利用するのが良さそう。
- isucon4の予選で使ってみた例。
def redis
Redis.current || Redis.new
end
def login_table
@login_table ||= Redis::Namespace.new(:login_, redis: redis)
end
def user_table
@user_table ||= Redis::Namespace.new(:user_, redis: redis)
end
これで
{"login_:created_at"=>"login_:2014-02-22 00:00:26 +0000", "login_:user_id"=>"login_:196515", "login_:login"=>"login_:amaol"
, "login_:ip"=>"login_:127.200.1.7", "login_:succeeded"=>"login_:0"}
{"user_:salt"=>"user_:qdnxm9no", "user_:login"=>"user_:shirley", "user_:password_hash"=>"user_:5ae3560d45553043d73482b17116
2b60609cf53127593bf640d789daea763a7a"}
{"login_:created_at"=>"login_:2014-02-22 00:00:28 +0000", "login_:user_id"=>"login_:197597", "login_:login"=>"login_:adolph
us_schoen", "login_:ip"=>"login_:127.250.0.29", "login_:succeeded"=>"login_:1"}
{"user_:salt"=>"user_:ce0xcad6p", "user_:login"=>"user_:concepcion.smith", "user_:password_hash"=>"user_:ced337109f9563a0d5
bafc3fa445b1364e57aecf8369d2146a5f8470c715c380"}
……
って感じに使える。
redigo ってのがあります。4p-nonylene
ブランチとかサンプルコード見ればよさそう。
コネクションプールはちゃんと実装して(http://godoc.org/github.com/garyburd/redigo/redis#Pool, https://github.com/nonylene/isucon-practice/commit/90e49e881dcb98e623e287ee6b8a3214a37c48b0 )使いましょう。
- 文字列(任意のバイナリ列)
- リスト
- セット
- ソート済みセット
- ハッシュ
ハッシュのリストとかは作れないです。リストやセットは文字列のみになります。
作り方はキー名を score:nonylene
にしてキー名でデータを表すのが多そう。ハッシュはSQLの代替にはなるけどSQLみたいにSELECTでいろいろ出来るわけでもないんでよくアクセスするデータは個別にキー持って保存するのがいいと思います。
sortっていうコマンドもあるけど割りと面倒ではある。
http://qiita.com/rubytomato@github/items/91351bc903b3211aa2e1
一度に大量にpushとかする場合はMULTIを使う(他のプロセスに割り込まれない、失敗したら全部の処理が行われない)
rubyならredis-lockを使うと良い redis-lock
中ではSETNXとかを使って実装されている