Redisの使い方 その4 – キーの正規表現検索(KEYS)

キーの正規表現検索

KEYS pattern

引数patternには、検索したいキーの正規表現が入ります。使える正規表現は以下の3つです。

  • ? ・・・ 任意の1文字
  • * ・・・ 任意の文字列
  • [ ] ・・・ 角カッコ内の文字のどれか1文字

※これらの文字列自体を検索したいときはバックスラッシュ(\)を前につけます。

例)

  • “h?llo” なら “hello”, “hollo”, “hallo” のどれでも引っかかる
  • “h*llo” なら “hello”, “heeeeeeeeeello”, “hasdfllo” のどれでも引っかかる
  • “h[ea]llo” なら “hello”, “hallo” が掛かる。”hillo” は掛からない。
注意点

キーの数が多くなってくると検索が遅くなります。むやみにキーを増やさないようにするか、キーの用途に応じてデータベースを分けることでそのような自体を防ぐことができます。ここでいうデータベースは、Redisサーバ内に定義されるデータベースのことです。デフォルトでは1個目のデータベースである”DB 0″が使用されるようになっています。これは以下のコマンドで変更可能です。

SELECT index

使用するデータベースを引数indexのものに変える。indexはint値。DB0以外のデータベースを使うときは、コネクションを生成するごとにこのコマンドを発行する必要があります。

Redisの使い方 その3 – キーの生存期限を設定する(EXPIRE)

Redisでは、各キーごとに生存期限:Expireを設定することができます。期限を過ぎたらキーは自動的に削除されます。

期限を設定する

EXPIRE key seconds

キー key に対して、その生存期限を seconds に設定します。その期限を過ぎると、Redisの自動削除ロジックによって削除されます。

※1: 期限切れてるのにキーが残ることがある?

=> 削除ロジックが回ってくるまでに時間がかかっている可能性があります。厳密な期限が必要な場合は必ずTTL(後述)のチェックを行いましょう。

※2: 期限付きのStringを更新すると期限が消える?

仕様です。setexコマンドを使えば期限も同時に設定できるので、そちらを使うようにしましょう。

※3: 期限付きのキーを更新するとキーが消滅する?

=> 昔のRedis(バージョン2.1.3以前)だと、期限付きのキーの値を変更するとキーが消滅する、という動作をしていました。最新バージョンでは直っていますが、古いバージョンを使っている場合は注意が必要です。

UNIX TIMEで期限を設定する

EXPIREAT key timestamp

UNIX秒で期限を指定できます。

期限の残り秒数を取得する

TTL key

キーの残り生存秒数を取得します。-1 が返ってくる場合はキーが存在しないか期限が設定されていないかのどちらかです。

※システムを設計する上での注意点

上記の期限は、キーごとにのみ設定できるものであり、キーに含まれる要素ごとには設定できません(例えばSet中の特定のmemberだけに期限を設定するのは無理)。

要素ごとに消えて欲しい場合は代わりにStringを使うことになります。キー名はkeysコマンドで正規表現的に検索することが可能なので、うまく使えばなんとかなります。

Redisの使い方 その2 – データ型のメソッド概説

各データ型のよく使うコマンドについて解説します。

各言語のクライアントライブラリの仕様とは少し違う部分(複数の引数に対応してない、nilではなくnull、など)もありますので、詳細は各ライブラリのドキュメントを参照してください。

String

コマンド 引数 説明 戻り値
GET key キーの値を取得する。 キーに対応する値。値が無い場合はnilが返ってくる。
SET key value
キーの値をセットする。 常に”OK”
GETSET key value 値をセットしつつ、古い値をGETする。 キーにすでに値が入っていたらその値。入ってなかったらnil
MGET key [key …] 複数のキーの値を取得する。 値のリスト。値がないときは代わりにnilが入っている。
MSET key value [key value …] 複数のキーの値をセットする。 常に”OK”。

Hash

コマンド 引数 説明 戻り値
HGET key field field値を指定して要素を取得する。 fieldとvalueが一緒に返ってくる。値が無い場合はnilが返ってくる。
HSET key filed value fieldとvalueを指定して要素をセットする。 新しくfieldがセットされたら1、すでに同じfieldがあったら0を返す。
HMSET key field value [field value …] HSETを複数同時に行う。 常に”OK”。
HMGET key field [filed …] 複数のfield値を指定して要素を取得する。 filedとvalueが一緒にリストで返ってくる。該当するfield値がないときはnilが入ったリストが返る。
HEXIST key field
キーの中にfield値を含む要素があるかどうか調べる。 あれば1、無ければ0が返る。
HDEL key field [field …]
field値を指定して要素を削除する。複数指定可。 削除した要素の個数を返す。

List

コマンド 引数 説明 戻り値
LPOP key リストの先頭の要素を取り出す。取り出したあと、要素は削除される。 値があればその文字列。値がないときはnil。
LPUSH key value [value …] リストの先頭に要素を追加する。複数を追加することも可。 PUSHしたあとのリストの長さ。
LRANGE key start stop 要素番号の範囲を指定して要素を取得する。 要素のリストを返す。
LREM key count value 要素番号の範囲を指定して要素を削除する。 削除した要素の個数を返す。
RPOP key リストの末尾の要素を取得する。取得したあと、その要素は削除される。 取得した要素。該当するものがなければnilが返る。
RPUSH key value [value …] リストの末尾に要素を追加する。 追加したあとのリストの要素数を返す。

Set

コマンド 引数 説明 戻り値
SADD key member [member …] セットに要素を追加する。複数追加も可。 追加した要素数。ただしすでにセットに入っていた要素はカウントしない。
SISMEMBER key member セット中に要素があるかどうか。 あれば1、無ければ0。
SMEMBERS key セットの全要素を取得する。 セット。
SREM key member [member …] 指定した要素をセットから削除する。複数可。 削除した要素数。

Sorted Set

コマンド 引数 説明 戻り値
ZADD key score member [score] [member] セットに要素を追加する。複数可。 追加できた要素数を返す。
ZCOUNT key min max 指定したSCOREの範囲内にある要素の個数を取得する。 指定したSCORE内にある要素数。
ZRANGE key start stop 指定した順序の範囲にある要素を取得する。 要素のリスト。要素がなければ空のリストが返る。
ZRANGEBYSCORE key min max 指定したSCOREの範囲にある要素を取得する。 要素のリスト。要素がなければ空のリストが返る。
ZREM key member member値を指定して要素を削除する 削除した要素数を返す。ただし、存在しなかった要素は含まれない
ZREMRANGEBYSCORE key min max SCOREで範囲を指定して要素を削除する 削除した要素の数を返す。
ZSCORE key member 指定したmember値に対応するSCORE値を取得する SCORE値。文字列として返される。

Redisの使い方 その1 – インストールからデータ型の概説まで

このページは?

メモリキャッシュシステムであるRedisについて解説するページです。対象読者は、MySQLやMemcacheについて知っており、それらについてある程度プログラムを組んだことのある人です。

Redisってなに?

MemcacheみたいなKey-Value型メモリキャッシュシステム。MySQLみたいなRDBMSと違い、メモリにデータを保存するため、より高速な読み書きが実現できます。

また、Memcacheよりも多くのデータ型を備えており、より自由度の高い設計を行えることも特徴の1つです。

まず使ってみる

1. 利用OSにあったものをダウンロードしてインストールする。

以下のページからダウンロード

http://redis.io/download

2. redis-cliで値をsetしたりgetしてみたりする

Redis用のクライアント(redis-cli)でまずは値を出し入れしてみる。

3. プログラム言語から使ってみる

公式ページに言語別クライアントモジュールが置いてあるので、好きな言語のモジュールをダウンロードして使ってみる。大量の読み書きを行うことで、MySQLとの性能の違いを実感してみるのも良し。

http://redis.io/clients

データ型の種類

Redisが提供する5種類のデータ型を列挙・概説します。

  1. String 1つのキーに対して1つの文字列を格納する
  2. Hash field-value型のMapを格納する
  3. List リスト型の値を格納する。重複OK
  4. Set セット型の値を格納する。重複できない。逆にいうと重複が自動で排除される
  5. Sorted Set 順序を付けられるセット型の値を格納する。順序付けのため、セット内の各要素にScoreと呼ばれる数値がひもづけられる

String

  • 1つのキーに対して1つの文字列を格納する
  • もっとも基本的なデータ型

例)
key1 - value2
key2 - value2
key3 - value3

Hash

  • field-value型のMapを格納する
  • fieldとvalueはどちらも文字列を格納する
  • Mapであるため、1つのキーの中では同名のfieldを複数持つことはできない

Hashの例)
key1 - filed1 - value1
key1 L field2 - value2
key1 L field3 - value3

key2 - filed4 - value4
key1 L field5 - value5
key1 L field6 - value6

List

  • 文字列のリストを格納する
  • 値を追加した順序が保持される
  • 値は重複していてもOK
  • リスト前後からの値の出し入れが可能(LPUSH, RPUSH, LPOP, RPOP)
  • リスト中の要素番号を範囲指定して取り出せる(LRANGE)

Listの例)

key1 - value1
key1 L value2
key1 L value3
key1 L value1
key1 L value2
key1 L value3

Set

  • 順序のないリスト(セット)を格納する
  • 重複のない値、または重複をチェックする必要の無い値を格納するのに適している
  • 異なるセットを比較することができる
  • セット同士を結合することができる

Setの例)

key1 - value1
key1 L value2
key1 L value3
key1 L value4
key1 L value5
key1 L value6

Sorted Set

  • Setの各要素(Member)にソート用の数値(Score)を付加したセット。Scoreで自動的にソートされる
  • Scoreは重複可能
  • Memberは文字列値。重複できない
  • Scoreの値・範囲を指定してMemberを取得できる。削除もできる。
  • Memberを指定して取得・削除ができる(1個だけ。範囲指定は無理)
  • 要素の順位(RANK)を取得できる。また、RANKを指定して削除することもできる

Sorted Setの例)

key1 - member1 - score1
key1 L member2 - score2
key1 L member3 - score3
key1 L member4 - score3

つづく。