Skip to content
This repository has been archived by the owner on Sep 4, 2020. It is now read-only.
lastcat edited this page Oct 10, 2015 · 11 revisions

基本

読む: http://redis.shibu.jp/

  • インストール

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に乗り換えるメリットは十分にあります。

Rubyでの利用

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"}
……

って感じに使える。

golangでの利用

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でいろいろ出来るわけでもないんでよくアクセスするデータは個別にキー持って保存するのがいいと思います。

例: https://github.com/nonylene/isucon-practice/commit/40cbbb7be9458307ec3617d7bb3db139b15fac28#diff-30adbcc3d8cfb779e690a14bd7421278R52

sortっていうコマンドもあるけど割りと面倒ではある。

http://qiita.com/rubytomato@github/items/91351bc903b3211aa2e1

リスト処理

一度に大量にpushとかする場合はMULTIを使う(他のプロセスに割り込まれない、失敗したら全部の処理が行われない)

ロック

rubyならredis-lockを使うと良い redis-lock

中ではSETNXとかを使って実装されている