SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
redis 活用術 初級
発表者:鄭・在燮
-普段使ってないコマンドを有効に活用しよう-
目次
• ログの管理に活用
• 「いいね!」管理に活用
• 訪問者数(DAUなど)に活用
• 最近クリックした商品リスト表示に活用
• 同点問題を解決するには
• Pipelineについて
• Keysコマンドの代案について
• BigO表記法について
ログの管理に活用
…サーバが複数…
log log log log log log log
・ログを調べるために各サーバ接続し、調べるのはとても大変
ログの管理に活用
…サーバが複数…
redis
バッチ
サーバ
ストレージ
バッチ処理で定期的
にストレージに保存
一つのサーバで確認
できるので楽
ログの管理に活用
■方法1
WEBサーバ側
・APPEND key value:ログを継続的に追加
バッチサーバ側
・GETSET key value:keyの値を読み込み、keyの値を空にする
※GET&SETは他のアクセスで途中に新しいログ書き込みがある可能性があ
るためだめ!
このやり方には実は問題が一つある
APPENDコマンドは値を追加するたびにメモリの当てる・解放
→作り変える作業が発生
一つのkeyではなく複数のkeyにログを保存する方法にしたら、バッチ処理が何
かの理由で止まってしまったら、どのkeyまで処理されたのかがわかりにくい
ログの管理に活用
■方法2
・Listデータ型を使用
WEBサーバ側
・LPUSH key value [value ...]:Listデータ型にログを継続的に追加
バッチサーバ側
・RPOP key:最初に書き込まれたデータから値を取得&削除
バッチ処理が何かの理由で止まってしまっても、どこまで処理されたか気にせ
ずRPOPで処理可能
「いいね!」管理に活用
・SETデータ型を使用
・SETデータ型は重複を許容しない
・SADD key member [member ...]:書き込み毎のkeyに対して「いいね」が押さ
れたらユーザーIDを追加
・SREM key member [member ...]:「いいね」を取り消す
・SISMEMBER key member:ユーザーが「いいね」を押したかどうか判定
・SCARD key:「いいね」が押された回数を取得
訪問者数(DAUなど)に活用
・BITを使用
・BITは0or1。ユーザー毎にフラグを立てるようなデータに適している
・unique:visitors:20140422→[0,0,1,1,0,1,0,0][1,0,0,1,0,1,0,1][,0,0,1,0,1,0,1,0]…
offset 0 7 8 15
・offsetをユーザーIDだと考える
・SETBIT key offset value:offsetにユーザーIDを、valueに1を
・BITCOUNT key [start] [end]:bitが1であるデータのカウントを取得→DAU
・start、endはByte単位なので使用にご注意
・DAU計算をバッチ処理などに頼らずに低費用で即時に確認できる
訪問者数(DAUなど)に活用
・1週間連続でログインしたユーザー数を出してほしい
・GETBIT key offset:offsetの値を取得
for i=0, ‘全体ユーザーArray’ {
a = GETBIT(unique:visitors:20140416, i);
b = GETBIT(unique:visitors:20140417, i);
c = GETBIT(unique:visitors:20140418 i);
d = GETBIT(unique:visitors:20140419, i);
e = GETBIT(unique:visitors:20140420, i);
f = GETBIT(unique:visitors:20140421, i);
g = GETBIT(unique:visitors:20140422, i);
isLogin = (a && b && c && d && e && f && g);
if (isLogin) {
weeklyVisitCount++;
}
}
・ユーザー毎に7回のGETBITが発生。ユーザーが1000万人なら7000万回。
訪問者数(DAUなど)に活用
・BITOP operation destkey key [key ...]:ビット演算した結果をdestkeyへ保存
operationは「AND, OR, XOR, NOT」が可能
AND:両方1の場合1
OR:片方が1の場合1
XOR:相違の値の場合(0と1, 1と0)1
NOT:逆の値を返す
・BITOP AND key unique:visitors:20140416 unique:visitors:20140417
unique:visitors:20140418 … 1週間分
・ビット演算結果を保存したkeyに対してBITCOUNTコマンドで1週間連続ログイ
ンしたユーザー数を取得
→2回のコマンドで取得可能に
訪問者数(DAUなど)に活用
・1週間連続でログインしたユーザーの数ではなくユーザーIDを出してほしい。
そのユーザーにはイベント報酬として何かを配りたい。
・1週間連続でログイン結果をとにかくビット演算する
・GETBITをユーザー数分実行→1000万回発生
方法1
・BITOPでビット演算→GETで全体値を取得し、PHP側でログインしたユーザーを
切り分ける
→WEBサーバには費用はかかるが、redisにはやさしい
方法2
・Luaスクリプトを使用
※redisでLuaスクリプトを実行するにしてもシングルスレッドということは変わら
ないので、注意
最近クリックした商品リスト表示に活用
・最近クリックした商品のリストを常に5件表示したい。詳細画面では30件まで
表示したい
・Sorted Setを使用
・Sorted Setは重複を許容しない&順番がある
・ZADD key score member [score member ...]:scoreにはクリックした時間とする
・ZREVRANGE key start stop [WITHSCORES]:クリックした商品のリストを取得。
start stopで何件取ってくるかも可能
・ZREMRANGEBYRANK key start stop:addして全体件数が31件になったら一番
古いものを削除
同点問題を解決するには
・ZREVRANK、ZRANKという便利なコマンドがある
・同点を考慮した順位を返してはくれない
・今後redisで対応される予定だが、古いバージョンでは以下の方法が考えら
れる
・ZSCORE key member:ユーザーのスコアを取得
・ZCOUNT key min max:minにユーザーのスコア、maxに最大値(+inf)
・ZCOUNTの結果から+1すれば同点を考慮した順位になる
Pipelineについて
・pipelineはredisコマンドをまとめて転送&結果を受け取る方法
・redisサーバの負荷的にはあまり変わらないが、I/Oを減らせるので結果的に
パフォーマンスUPにつながる
・redisのコマンドではない。phpredisのようなクライアントで実現したもの
・まとめたコマンドが実行されるので他のアクセスからのコマンドは待機される
のでは?
→待機されない
→クライアントによっては内部的にMULTI/EXECを使用していて待機されるこ
ともあるので、使っているクライアントを確認するのが必要
・redisのトランザクションであるMULTI/EXECもコマンドをまとめて実行するが、
トランザクションが実行される間は他のコマンドは待機される
・phpredisはどうなっている?
$ret = $redis->multi(Redis::MULTI)
→トランザクション使用
$ret = $redis->multi(Redis::PIPELINE)
→pipeline使用(トランザクション使用しない)
※引数のDefaultは「Redis::MULTI」
Pipelineについて
・MSET key value [key value ...]
・MGET key [key ...]
などのコマンドはまとめてget・setするのでpipelineと同じ効果がある
Keysコマンドの代案について
・KEYS pattern:patternに合うkey達を探してくれる
・keyの数に比例して費用が高くなるので軽々使ったら痛い目に合う
・でも、とても便利そうなコマンドなので使いたくはなる
・バージョン2.8から追加された「SCAN、SSCAN、ZSCAN、HSCAN」
・SCAN cursor [MATCH pattern] [COUNT count]:全体keyが対象
・SSCAN key cursor [MATCH pattern] [COUNT count]:指定setが対象
・ZSCAN key cursor [MATCH pattern] [COUNT count]:指定sorted setが対象
・HSCAN key cursor [MATCH pattern] [COUNT count]:指定hashが対象
・SCANを使用すると次のcursor位置と結果値を返してくれる。
・帰ってきたcursorで再度SCAN実行。cursorが0になるまで実行
・数回SCANすることになるが、一つのコマンドが重くはないので他のコマンド
が待機されるのを防ぐ
BigO表記法について
・redisはコマンドの費用を表示するための方法としてBigO表記を採用している
・http://redis.io/commands/mget
・http://redis.io/commands/keys
などのコマンド詳細ページから確認できる
・redisコマンドではほとんどが「 O(1)、 O(N)、 O(log(N)) 」
・同じ「O(N)」でもNの対象が何になるのかによって費用はまったく違うので詳
細説明を確認するのが重要
・たとえば、MGETもKEYSも同じ「O(N)」である
BigO表記法について
・http://apelbaum.wordpress.com/2011/05/05/big-o/
おさらい
• List:データ入力の順番操作が簡単
• Set:重複を許容しない
• Sorted set:重複を許容しない&順位
• Bit:0or1。ユーザー毎にフラグを立てる
• pipelineを有効に使おう
• 各コマンドの費用(BigO表記)に気を付ける
ご清聴ありがとうございました。

Mais conteúdo relacionado

Mais procurados

Subversion
SubversionSubversion
Subversion
ghiblar
 
MySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LTMySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LT
Tomohiro Ikeda
 
My sql casual talks vol.6
My sql casual talks vol.6My sql casual talks vol.6
My sql casual talks vol.6
Satoshi Suzuki
 

Mais procurados (20)

Nodejs
NodejsNodejs
Nodejs
 
SubversionとSugarsync
SubversionとSugarsyncSubversionとSugarsync
SubversionとSugarsync
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
Gulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くするGulp入門 - コーディングを10倍速くする
Gulp入門 - コーディングを10倍速くする
 
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
さくらインターネットにおけるServerspec導入事例(DevOps勉強会 #3 Serverspecの巻)
 
mysqlftppc 紹介
mysqlftppc 紹介mysqlftppc 紹介
mysqlftppc 紹介
 
Varnish
VarnishVarnish
Varnish
 
Subversion
SubversionSubversion
Subversion
 
Grunt入門
Grunt入門Grunt入門
Grunt入門
 
MySQLからPostgreSQLへのマイグレーションのハマリ所
MySQLからPostgreSQLへのマイグレーションのハマリ所MySQLからPostgreSQLへのマイグレーションのハマリ所
MySQLからPostgreSQLへのマイグレーションのハマリ所
 
read parse-css
read parse-cssread parse-css
read parse-css
 
Server specのご紹介
Server specのご紹介Server specのご紹介
Server specのご紹介
 
Gruntを導入しよう!の話
Gruntを導入しよう!の話Gruntを導入しよう!の話
Gruntを導入しよう!の話
 
Zabbix study5lt
Zabbix study5ltZabbix study5lt
Zabbix study5lt
 
MySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LTMySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LT
 
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう新しくなったPg monzでpostgre sqlのクラスタを監視しよう
新しくなったPg monzでpostgre sqlのクラスタを監視しよう
 
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話MySQLメインの人がPostgreSQLのベンチマークをしてみた話
MySQLメインの人がPostgreSQLのベンチマークをしてみた話
 
My sqlとplugin
My sqlとpluginMy sqlとplugin
My sqlとplugin
 
My sql casual talks vol.6
My sql casual talks vol.6My sql casual talks vol.6
My sql casual talks vol.6
 
Webサーバ勉強会 LT資料
Webサーバ勉強会 LT資料Webサーバ勉強会 LT資料
Webサーバ勉強会 LT資料
 

Destaque

Redisととあるシステム
RedisととあるシステムRedisととあるシステム
Redisととあるシステム
Takehiro Torigaki
 
Cloudera サポートの現場から、YARN の最新事情 #hcj2014
Cloudera サポートの現場から、YARN の最新事情 #hcj2014Cloudera サポートの現場から、YARN の最新事情 #hcj2014
Cloudera サポートの現場から、YARN の最新事情 #hcj2014
Cloudera Japan
 

Destaque (17)

PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
 
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
 
大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い大規模Redisサーバ縮小化の戦い
大規模Redisサーバ縮小化の戦い
 
Consistent hashing
Consistent hashingConsistent hashing
Consistent hashing
 
NoSQL勉強会資料(2015/03/12@ヒカラボ )
NoSQL勉強会資料(2015/03/12@ヒカラボ )NoSQL勉強会資料(2015/03/12@ヒカラボ )
NoSQL勉強会資料(2015/03/12@ヒカラボ )
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
 
Laravelを使ってみた
Laravelを使ってみたLaravelを使ってみた
Laravelを使ってみた
 
Redis速習会@Wantedly
Redis速習会@WantedlyRedis速習会@Wantedly
Redis速習会@Wantedly
 
MySQL
MySQLMySQL
MySQL
 
Redisととあるシステム
RedisととあるシステムRedisととあるシステム
Redisととあるシステム
 
Cloudera サポートの現場から、YARN の最新事情 #hcj2014
Cloudera サポートの現場から、YARN の最新事情 #hcj2014Cloudera サポートの現場から、YARN の最新事情 #hcj2014
Cloudera サポートの現場から、YARN の最新事情 #hcj2014
 
Consistent hash
Consistent hashConsistent hash
Consistent hash
 
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
『例えば、PHPを避ける』以降PHPはどれだけ安全になったか
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
 
MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜MongoDB〜その性質と利用場面〜
MongoDB〜その性質と利用場面〜
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
アメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpringアメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpring
 

Semelhante a Redis 活用術 初級

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
Oonishi Takaaki
 
[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている
Akihiro Kuwano
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
Takahiro Inoue
 
a-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazakia-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazaki
Etsushi Ishii
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
 

Semelhante a Redis 活用術 初級 (20)

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
WordPressサイトのバージョン管理
WordPressサイトのバージョン管理WordPressサイトのバージョン管理
WordPressサイトのバージョン管理
 
Fluentd meetup #2
Fluentd meetup #2Fluentd meetup #2
Fluentd meetup #2
 
Zabbix 1.8の概要と新機能
Zabbix 1.8の概要と新機能Zabbix 1.8の概要と新機能
Zabbix 1.8の概要と新機能
 
既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~既存システムへの新技術活用法 ~fluntd/MongoDB~
既存システムへの新技術活用法 ~fluntd/MongoDB~
 
2015.04.19 WordBench 埼玉 Git & WordPress
2015.04.19 WordBench 埼玉 Git & WordPress2015.04.19 WordBench 埼玉 Git & WordPress
2015.04.19 WordBench 埼玉 Git & WordPress
 
Git勉強会
Git勉強会Git勉強会
Git勉強会
 
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
TotalViewを使ったFOCUSスパコンでのデバッグ体験 2016
 
ログにまつわるエトセトラ
ログにまつわるエトセトラログにまつわるエトセトラ
ログにまつわるエトセトラ
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている[大図解]ピグライフはこう動いている
[大図解]ピグライフはこう動いている
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
 
データベース勉強会 In 広島 mongodb
データベース勉強会 In 広島  mongodbデータベース勉強会 In 広島  mongodb
データベース勉強会 In 広島 mongodb
 
Zabbix 1.8の概要と新機能
Zabbix 1.8の概要と新機能Zabbix 1.8の概要と新機能
Zabbix 1.8の概要と新機能
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
 
1_各Atlassian製品の紹介
1_各Atlassian製品の紹介1_各Atlassian製品の紹介
1_各Atlassian製品の紹介
 
a-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazakia-blogcsm な寺子屋 2 in Okazaki
a-blogcsm な寺子屋 2 in Okazaki
 
fluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギングfluentd を利用した大規模ウェブサービスのロギング
fluentd を利用した大規模ウェブサービスのロギング
 
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
オープンソースでシステム監視!Zabbix 1.8の機能と簡単インストール手順の紹介
 

Redis 活用術 初級