ページネーションの実装
LRANGEコマンドは,
次のコードは,
<?php
function contents_list_page($page, $size = 20) {
if ($page <= 0 || $size <= 0) {
return array();
}
$redis = new Redis();
$redis->connect('localhost', 6379);
$start = ($page - 1) * $size;
$end = $start + $size - 1;
$list = $redis->lRange('contents_list', $start, $end);
$redis->close();
return $list;
}
LRANGEコマンドで取得できる部分リストは,
$list = $redis->lRange('contents_list', 0, -1);
リストのトリミング
Redisはオンメモリデータストアですので,
次のコードは,
<?php
function contents_list_trim($size = 1000) {
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->lTrim('contents_list', 0, $size - 1);
$redis->close();
}
前述したニコニコ生放送の
リスト全体のアトミックな差し替え
LPUSHやRPUSHを使った更新では,
こんなときに便利なのはRENAMEコマンドです。空のテンポラリリストに更新後の内容をゼロから構築し,
<?php
function contents_list_replace($new_idarray) {
$redis = new Redis();
$redis->connect('localhost', 6379);
$tmp_key = /* ここでユニークなテンポラリキー名を生成 */;
foreach ($new_idarray as $id) {
$redis->lpush($tmp_key, $id);
}
$redis->rename($tmp_key, 'contents_list');
$redis->close();
}
RENAMEコマンドはキー名を変更する機能ですが,
前述のユーザー生放送一覧ページでは,
LIST型のソート
SORTコマンドは,
前のコード例と同様に
SORT contents_list
コンテンツの属性情報でソートしたいというケースを考えてみます。各コンテンツIDごとに,
access_count:コンテンツID
このとき,
SORT contents_list BY access_count:*
外部キーパターンを指定すると,
なお,
次の例は,
SORT contents_list BY access_count:* LIMIT 0 3 DESC
他にも,
リストのサイズが非常に大きい場合など,
LIST型を使ったキューの実装
LIST型は連結リストとして実装されているため,
ニコニコ生放送では,
ブロッキング形式のキュー処理
LIST型をキューとして利用する場合,
BRPOPコマンドは,
次のコードは,
public void run() {
Jedis jedis = new Jedis("localhost");
while (true) {
// BRPOPコマンドでキー"myqueue"から要素を取得する。
// タイムアウトは5秒に設定。
List<String> popped = jedis.brpop(5, "myqueue");
if (popped != null) {
// 戻り値の最初の要素はキー名
String key = popped.get(0);
// 戻り値の2番目の要素は値
String value = popped.get(1);
doSomething(key, value);
} else {
System.out.println("timeout!");
}
}
}
より堅牢なキュー処理
上記のコードでは,
元のリストから取り出した要素をバックアップ用のリストに格納しておけば,
バージョン2.
まとめ
今回は,