Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9008

Redisの概要とNode.jsでの使い方

$
0
0

Redisの概要

redisはインメモリのNoSQLのデータベースです。単純なKey-Valueストアのように文字列だけでなく、様々な種類の値をサポートしています。
Webアプリケーションのスケーリングに便利です。

https://redis.io/

環境構築

dockerが利用できるなら、それで環境を作成するのが楽です。

 docker run --name redis -p 6379:6379 -d -v /Users/hoge/dev/node/socketio/data:/data redis:latest

dockerで作成したコンテナでredis-cliを使用するには以下のようにします。

hoge@macpro socketio % docker exec -it redis /bin/bash
root@8f9888c8bb76:/data# redis-cli
127.0.0.1:6379> 

ホストとポートを指定したい場合は以下のようにします。デフォルトではlocal:6379に接続しています。

redis-cli -h localhost -p 6379

Redisのデータについて

Redisは単純なキーと値だけでなくリストやハッシュなどが使えます。
この章は以下を元に記述されていますので英語読める人は以下読んだほうがいいと思います。
https://redis.io/topics/data-types-intro
https://redis.io/topics/data-types

また、この章で記述されているコマンドはredis-cliで実行したものとなります。

キー

Redisのキーはバイナリデータを正しく扱うことができます。"foo"のような文字列からJPEGファイルの中身まで任意のバイナリをキーとして使えます。空の文字列も有効なキーです。
キーに関するルールは以下の通りです。

  • 非常に長いキーはお勧めしません。例えば1024バイトのキーはメモリの点だけでなく、データセット内の検索にコストがかかります。
  • 多くの場合、非常に短いキーはお勧めしません。"user:1000:followers"と記載する代わりに"u1000flw"とかく意味はほとんどありません。前者は読みやすく、使用されるスペースもわずかです。
  • スキーマーに固執するようにしましょう。とえば、"user:1000"のように、 "object-type:id"のような形式にするのは良いアイディアです。  キーの最大は512MBです。

キーに関係するコマンド

コマンド名概要
DELキーを削除する
UNLINK別スレッドで非同期にキーを削除する。DELと同じだが非ブロッキング。
EXISTSキーが存在するか確認する
TYPEキーに格納されている値のタイプを取得する
KEYS指定のパターンに一致するキーの一覧を取得する
TOUCHキーの最終アクセス時刻を変更する
RENAMEキーの名前を変更する
RENAMENX新しいキーが存在しない場合のみキーの名前を変更する
DUMP指定されたキーに格納されている値のシリアル化されたバージョンを取得する
OBJECTRedisオブジェクトの内部を検査する
MOVEキーを別のデーターベースに移動する
MIGRATEキーをRediusインスタンスから別のインスタンスに転送する
RANDOMKEYキースペースからランダムなキーを返す
RESTORE以前にDUMPしたシリアル化された値を使用してキーを作成する
SORTリスト、セット、ソート済セットの要素を並び替える
WAIT別の接続コンテキストで送信された全ての書き込みコマンドの同期複製を待つ
SCANキースペースを段階的に反復する

文字列

文字列は最も基本的な種類のRedis値です。Redis文字列はバイナリを正しく扱うことができ、単純な文字列から、JPEG画像など、あらゆる種類のデータを含めることができます。文字列値の最大は512MBです。

単純なサンプル

SETコマンドGETコマンドを使用することで文字列の値を格納、取得することができます。

redis-cliを使用して簡単なキーと値を格納するサンプルを以下に示します。

使用例
 localhost:6379> set mykey somevalue
 OK
 localhost:6379> get mykey
 "somevalue"
 localhost:6379> 

規定ではSETコマンドではキーがすでに存在している場合は、既存のキーに格納されている値を新しい文字列に置き換えることができます。
すでに存在するキーの場合は失敗させる、または存在するキーの場合のみ更新させる場合にはnxオプション、xxオプションを以下のようにして使用します。

使用例
すでに存在するキーの場合は失敗させる
 localhost:6379> set mykey newval nx
 (nil)

 すでに存在するキーがある場合のみ成功させる
 localhost:6379> set mykey newval xx
 OK

GETコマンドではキーが存在しない場合はnilを返します。また、格納されている値が文字列ではない場合、エラーとなります。

文字列に関係するコマンド

文字列に関係するコマンドは以下の通りです。
https://redis.io/commands/#string

コマンド名概要
APPEND指定のキーの値に指定の文字列を追記する
GET指定のキーの文字列値を取得する
SETキーの文字列値を設定する
SETEX有効期限を秒で指定してキーの文字列値を設定する
SETNXキーが存在しない場合にキーの文字列値を設定する
PSETEX有効期限をミリ秒で指定してキーの文字列値を設定する
GETSETキーの文字列値を設定し、古い値を取得する
MGET指定された複数のキーの値を取得する
MSET指定された複数のキーと値を設定する
MSETNXキーが存在しない複数のキーと値を設定する
GETRANGE指定のキーの値の部分文字列を取得する
SETRANGE指定のキーの値の部分文字列を設定する
STRLENキーの値の文字列の長さを取得する
APPENDコマンド

指定のキーの値に指定の文字列を追記します。

使用例
127.0.0.1:6379> set mykey hello
OK
127.0.0.1:6379> append mykey world
(integer) 10
127.0.0.1:6379> get mykey
"helloworld"
GETSETコマンド

GETSETコマンドを使用することで新しい値を設定して、古い値を取得することが可能です。

使用例
 localhost:6379> set mykey test
 OK
 localhost:6379> getset mykey testnew
 "test"
 localhost:6379> get mykey
 "testnew"
MSETとMGETコマンド

複数のキーの値を同時に設定、取得するにはMSET,MGETコマンドを使用します。

使用例
 localhost:6379> mset a 10 b 30 c 30
 OK
 localhost:6379> mget a b c
 1) "10"
 2) "30"
 3) "30"
 localhost:6379> get a
 "10"
 localhost:6379> get b
 "30"
 localhost:6379> get c
 "30"

数値として取り扱うコマンド

rediusの文字列値が整数または浮動小数として変換できる場合は以下のコマンドが使用できます。

コマンド名概要
INCRキーの整数値を1増やす
INCRBYキーの整数値を指定された数増やす
DECRキーの整数値を1減らす
DECRBYキーの整数値を指定された数減らす
INCRBYFLOATキーのfloat値を指定された数増やす

これらのコマンドはアトミックな操作となっており、同じキーに対して複数のクライアントが同時に操作しても競合状態にはなりません。例えばINCRコマンドを使用してクライアントAが「10」を読み取り、同時にクライアントBが「10」を読み込んで、両方とも「11」に設定することはなく、最終値は常に「12」になります。

使用例
 localhost:6379> set counter 100
 OK
 localhost:6379> incr counter
 (integer) 101
 localhost:6379> incr counter
 (integer) 102
 localhost:6379> incr counter
 (integer) 103
 localhost:6379> set counter 100
 OK
 localhost:6379> incrby counter 5
 (integer) 105
 localhost:6379> decr counter
 (integer) 104
 localhost:6379> decrby counter 5
 (integer) 99

リスト

Redisリストは、挿入順で並べ替えられた、文字列のリストです。リストに対して先頭(左)または後方(右)に値を追加できます。
リストの最大長は4294967295です。

単純なサンプル

RPUSHコマンドでリストの後方に文字列を追加し、LPUSHコマンドでリストの先頭に文字列を取得します。リストの内容を取得するにはLRANGEコマンドで範囲を指定して取得します。

使用例
127.0.0.1:6379> rpush mylist AA
(integer) 1
127.0.0.1:6379> rpush mylist BB
(integer) 2
127.0.0.1:6379> lpush mylist first
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "AA"
3) "BB"

リストに関係するコマンド

https://redis.io/commands#list

コマンド名概要
BLPOPリストの最初の要素を削除して取得するまたは、要素が使用可能になるまでブロックする
BRPOPリストの最後の要素を削除して取得するまたは、要素が使用可能になるまでブロックする
BRPOPLPUSHリストから要素をポップして、それを別のリストにプッシュして返す。またはいずれかが利用可能になるまでブロックする
LINDEXインデックスでリストから要素を取得する
LINSERTリスト内の別の要素の前後に要素を挿入する
LLENリストの長さを取得する
LPOPリストの最初の要素を削除して取得する
LPOSリストの一致する要素のインデックスを取得する
LPUSHリストに1つまたは複数の要素をリストの先頭に追加する
LPUSHXリストが存在する場合のみ、リストの先頭に要素を追加する
LRANGEリストから指定の範囲の要素を取得する
LREMリストから要素を削除する
LSETリスト内の要素の値をインデックスで指定する
LTRIMリストを指定された範囲でトリムします。(指定した範囲外の要素を削除する)
RPOPリストの最後の要素を削除して取得する
RPOPLPUSHリストの最後の要素を削除して別のリストの前に追加して返す
RPUSHリストの末尾に1つまたは複数の要素を追加する
RPUSHXリストが存在する場合にのみ、リストに要素を追加する

セット

文字列の順序付けられていないコレクションです。
コレクション内のメンバーは同じメンバーを許可しないという性質を持っています。
セット内のメンバーの数は最大4294967295になります。

簡単なサンプル

セットを使用するにはSADDコマンドで新しい要素を追加して、SMEMBERSコマンドでセットの要素を取得します。

127.0.0.1:6379> sadd myset 3 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"

この例では重複する要素が登録されていないことをが確認できます。
Redisのセットでは要素の順番については保証がないため、SMEMBERSコマンドは呼び出しのたびに任意の順番で返却されます。

セット用コマンド

https://redis.io/commands#set

コマンド名概要
SADDセットにメンバーを追加する
SCARDセットのメンバー数を取得する
SDIFF複数のセットの差を取得する
SDIFFSTORE複数のセットの差を取得して結果セットをキーに格納する
SINTER複数のセットを交差させる
SINTERSTORE複数のセットを交差させ、その結果セットをキーに格納する
SISMEMBER指定された値がセットのメンバーであるか判定する
SMEMBERSセット内の全てのメンバーを取得する
SMOVEメンバーをあるセットから別のセットに移動する
SPOPセットから1つまたは複数のメンバーをランダムに削除して返す
SRANDMEMBERセットから1つまたは複数のメンバーをランダムに取得する
SREMセットから1つ以上のメンバーを削除する
SUNION複数のセットを追加する
SUIONSCTORE複数のセットを追加して、結果のセットをキーに格納する
SDIFFとSINTERコマンドのサンプル

SINTERコマンドは最初に指定したセットと後に指定したセットと同じメンバーを取得します。
SDIFFコマンドでは最初に指定したセットから、共有するメンバーを除いたメンバーを返します。

127.0.0.1:6379> sadd key1 a b c
(integer) 3
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"
127.0.0.1:6379> SINTER key1 key2
1) "c"

ソート済セット

Redisセットと同様に、文字列の繰り返しのないコレクションです。違いは、並べ替えられたセットのすべてのメンバーがスコアに関連付けられていることです。これは、並べ替えられたセットを最小から最大のスコアまで順番に並べるために使用されます。メンバーは一意ですが、スコアは繰り返される場合があります。

簡単なサンプル

ZADDコマンドを使用してスコアと値を指定してソート済セットに追加します。
ソート済セットの内容はZRANGEコマンドを使用してスコアの小さい順で取得することができます。この際、withscoresオプションを使用するとスコアも同時に取得することができます。
スコアの大きいの順番で取得するにはZREVRANGEコマンドを取得できます。

127.0.0.1:6379> zadd hackers 1940 "Alan Kay"
(integer) 1
127.0.0.1:6379> zadd hackers 1957 "Sophie Wilson"
(integer) 1
127.0.0.1:6379> zadd hackers 1953 "Richard Stallman"
(integer) 1
127.0.0.1:6379> zadd hackers 1949 "Anita Borg"
(integer) 1
127.0.0.1:6379> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
127.0.0.1:6379> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
127.0.0.1:6379> zadd hackers 1916 "Claude Shannon"
(integer) 1
127.0.0.1:6379> zadd hackers 1969 "Linus Torvalds"
(integer) 1
127.0.0.1:6379> zadd hackers 1912 "Alan Turing"
(integer) 1
127.0.0.1:6379> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"
127.0.0.1:6379> zrange hackers 0 -1 withscores
 1) "Alan Turing"
 2) "1912"
 3) "Hedy Lamarr"
 4) "1914"
 5) "Claude Shannon"
 6) "1916"
 7) "Alan Kay"
 8) "1940"
 9) "Anita Borg"
10) "1949"
11) "Richard Stallman"
12) "1953"
13) "Sophie Wilson"
14) "1957"
15) "Yukihiro Matsumoto"
16) "1965"
17) "Linus Torvalds"
18) "1969"
127.0.0.1:6379> zrevrange hackers 0 -1
1) "Linus Torvalds"
2) "Yukihiro Matsumoto"
3) "Sophie Wilson"
4) "Richard Stallman"
5) "Anita Borg"
6) "Alan Kay"
7) "Claude Shannon"
8) "Hedy Lamarr"
9) "Alan Turing"

ソート済セットで使用するコマンド

コマンド名概要
BZPOPMIN1つ以上のソート済セットからスコアが最も低いメンバーを削除して取得するまたは、使用可能になるまでブロックする
BZPOPMAX1つ以上のソート済セットからスコアが最も高いメンバーを削除して取得するまたは、使用可能になるまでブロックする
ZADDソート済セットに1つ以上のメンバーを追加するか、すでに存在する場合はそのスコアを更新する
ZCARDソート済セットのメンバー数を取得する
ZCOUNT指定されたスコアの範囲でソート済セットのメンバー数を取得する
ZINCRBYソート済のメンバーのスコアをインクリメントする
ZINTERSTORE複数のソート済セットを交差させ、結果のソート済セットに新しい値を格納する
ZLEXCOUNT与えられた辞書識範囲内でソート済メンバー数を取得する
ZPOPMAXソート済セットで最高スコアを持つメンバーを削除して取得する
ZPOPMINソート済セットで最低スコアを持つメンバーを削除して取得する
ZRANGEインデックスでソート済セットを取得する
ZRANGEBYLEX辞書式の範囲でソート済セットのメンバーを取得する
ZREVRANGEBYLEX辞書式の範囲でソート済セットのメンバーを上位から下位の文字列の順に取得する
ZRANGEBYSCOREスコアの範囲でソート済のセットのメンバーを取得する
ZRANKソート済セットのインデックスを決定する
ZREMソート済セットから1つ以上のメンバーを削除する
ZREMRANGEBYLEX指定された辞書式範囲でソート済セットの全てのメンバーを削除する
ZREMRANGEBYRANK指定されたインデックス内のソート済セットの全てのメンバーを削除する
ZREMRANGEBYSCORE指定されたスコア内のソート済セットの全てのメンバーを削除する
ZREVRANGEソート済セットをスコアの高い順に取得する
ZREVRANGEBYSCOREスコアの範囲内でソート済セットをスコアの高い順に取得する
ZREVRANKソート済セットのインデックスを決定する。スコアは高い順に並べられる
ZSCOREソート済セット中のメンバーに関連づけられたスコアを取得する
ZUNIONSTORE複数のソート済セットを追加して結果のソート済セットに新しいキーを追加する
ZSCANソートされたセット要素と関連するスコアを段階的に反復する
辞書式スコア

ZRANGEBYLEXコマンドではソート済セットの要素が全て同じスコアで挿入されたと仮定して、範囲を辞書式で取得することができます。
辞書式の範囲の開始と終了を指定する際、「[」または「(」で始まる必要があります。
「[」の場合、後続の文字列を含んだ値を認めますが、「(」の場合は認めません。
また、「-」を指定すること負の方向で無限である文字列を現し、「+」を指定することで正に無限の文字列を現します。すなわち「ZRANGEBYLEX myzset - +」を指定した場合、全ての要素が同じスコアだとして、全てのメンバーを返します。

127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 0
127.0.0.1:6379> ZRANGEBYLEX myzset - +
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379> ZRANGEBYLEX myzset - [f
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> ZRANGEBYLEX myzset - (f
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ZRANGEBYLEX myzset [c (f
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> ZRANGEBYLEX myzset (c (f
1) "d"
2) "e"

ハッシュ

ハッシュは、フィールドと値のペアを使用してオブジェクトを表すことができます。

簡単な例

HSETコマンドを使用してキーに紐づくハッシュ値にフィールドを設定します。
HGETALLコマンドを使用して指定のキーのハッシュの全てのフィールドとその値を取得します。
HGETコマンドを使用することでキーとハッシュのフィールドを指定して、その文字列値を取得します。

127.0.0.1:6379> hset user:1000 username "Joe"
(integer) 1
127.0.0.1:6379> hset user:1000 birthyear 1945
(integer) 1
127.0.0.1:6379> hset user:1000 verified 1
(integer) 1
127.0.0.1:6379> hgetall user:1000
1) "username"
2) "Joe"
3) "birthyear"
4) "1945"
5) "verified"
6) "1"
127.0.0.1:6379> hget user:1000 username
"Joe"
127.0.0.1:6379> hget user:1000 birthyear
"1945"
127.0.0.1:6379> hget user:1000 verified
"1"

ハッシュに関係するコマンド

コマンド名概要
HDEL1つい上のハッシュフィールドを削除する
HEXISTSハッシュフィールドが存在するか確認する
HGETハッシュフィールドの値を取得する
HGETALLハッシュの全てのフィールドと値を取得する
HINCRBYハッシュフィールドの整数値を指定された数だけインクリメントする
HINCRBYFLOATハッシュフィールドのfloat値を指定された数だけインクリメントする
HKEYSハッシュ内の全てのフィールドを取得する
HLENハッシュのフィールド数を取得する
HMGET指定された全てのハッシュフィールドの値を取得する
HMSET複数のハッシュフィールドを複数の値に設定する
HSETハッシュフィールドの文字列値を設定する
HSETNXフィールドが存在しない場合のみ、ハッシュフィールドの値を設定する。
HSTRLENハッシュフィールドの値の長さを取得する
HVALSハッシュの全ての値を取得する
HSCANハッシュフィールドと関連する値を段階的に反復する

ビットマップ

ビット操作を行うコマンド

redisの文字列値はバイナリデータを取り扱うことができます。いくつかのコマンドはそのバイナリのビットを操作することが可能です。

コマンド名概要
BITCOUNT文字列中の1に設定されたビット数を数える
BITFIELD文字列に対して任意のビットフィールド整数演算を行う
BITOP文字列間でビット演算を行う
BITPOS文字列の最初のビットセットまたはビットクリアを見つける
GETBITキーの文字列における指定のオフセットでのビットを取得する
SETBITキーの文字列における指定のオフセットでのビットを設定する

Redisキーの有効期限

Redisのキーには有効期限を設定することができます。特定の時間が経過するとキーはDELコマンドを実行した時のように自動的に破棄されます。

コマンド名概要
EXPIREキーの存在時間を秒で設定する
EXPIREATキーの有効期限をUNIXタイムスタンプとして設定する
PERSISTキーから有効期限を削除する
PEXPIREキーの有効期間をms単位で設定する
PEXPIREATキーの有効期限をmsで指定されたUNIXタイムスタンプとして設定する
TTLキーの生存時間を秒単位で取得する
PTTLキーの存在時間をms単位で取得する

単純なサンプル

有効期限の設定には以下のようにEXPIREコマンドを使用します。

 localhost:6379> set mykey test
 OK
 localhost:6379> expire mykey 5
 (integer) 1
 5秒以内・・・
 localhost:6379> get mykey
 "test"
 5秒経過・・・
 localhost:6379> get mykey
 (nil)

また同じことはSETコマンドのexオプションで指定することもできます。

 localhost:6379> set mykey sample ex 5
 OK
 localhost:6379> get mykey
 "sample"
 localhost:6379> get mykey
 (nil)

有効期限の残り秒数またはミリ秒を取得するにはTTLコマンドまたはPTTLコマンドを使用します。

 localhost:6379> set mykey sample ex 10
 OK
 localhost:6379> pttl mykey
 (integer) 7982
 localhost:6379> ttl mykey
 (integer) 4

Redis-cli

Redis-cliはRedisにコマンドを送信し、サーバーから送信された応答をターミナルから直接読み取ることができるシンプルなプログラムであるRedisコマンドラインインターフェイスです。

https://redis.io/topics/rediscli

redis-cli 6.0.8ではコマンドラインの引数として以下を設定できます。

引数説明
-h サーバーのホスト名 (default: 127.0.0.1).
-p サーバーのポート (default: 6379).
-s サーバーのソケット(hostnameとportを上書きする)
-a サーバーに接続するときに使用するパスワード。 REDISCLI_AUTH環境変数を使用して、このパスワードをより安全に渡すこともできる。(両方が使用されている場合、この引数が優先される)
--user ACLスタイル'AUTH username pass'を送信するために使用される.-aが必要.
--pass 新しい--userオプションと一貫性を保つために使用される-aのエイリアス
--askpassSTDINからマスク付きのパスワードを入力するようユーザーに強制する。もしこの引数が使われた場合, '-a' と REDISCLI_AUTH環境変数は無視される
-u サーバーURI.
-r 特定のコマンドをN回繰り返す
-i -rオプションを使用した場合にコマンドごとに 秒待機する。次のように1秒未満の時間を指定することが可能。例: 0.1.
-n データベースナンバー
-3RESP3 protocol modeでセッションを開始する
-x最後の引数をSTDINから読み込む
-d Multi-bulk delimiter in for raw formatting (default: \n).
-cクラスターモードを有効にする(follow -ASK and -MOVED redirections).
--tls安全なTLS接続を確立します。
--sni TLSサーバー名を表示する
--cacert 検証するCA証明書ファイル。
--cacertdir 信頼できるCA証明書が保存されているディレクトリ。cacertとcacertdirのどちらも指定されていない場合、デフォルトのシステム全体の信頼されたルート証明書の構成が適用される。
--cert 認証に使用するクライアント証明書
--key 認証に使用する秘密鍵ファイル
--raw返信に未加工のフォーマットを使用します(STDOUTがttyでない場合のデフォルト)。
--no-rawSTDOUTがttyでない場合でもフォーマットされた出力を強制します。
--csvCSV形式で出力する
--statserver: mem, clientsなどの統計情報を出力し続ける
--latencyEnter a special mode continuously sampling latency.If you use this mode in an interactive session it runs forever displaying real-time stats. Otherwise if --raw or --csv is specified, or if you redirect the output to a non TTY, it samples the latency for 1 second (you can use -i to change the interval), then produces a single output and exits.
--latency-history--latencyと似ていますが、追跡の遅延は時間とともに変化する。デフォルトの時間間隔は15秒。 -iを使用して変更します。
--latency-distShows latency as a spectrum, requires xterm 256 colors.Default time interval is 1 sec. Change it using -i.
--lru-test Simulate a cache workload with an 80-20 distribution.
--replicaマスターから受信したコマンドを示すレプリカをシミュレートする
--rdb RDBダンプをリモートサーバーからローカルファイルに転送する。
--piperaw Redisプロトコルをstdinからサーバーに転送します。
--pipe-timeout --pipeモードでは、すべてのデータの送信後、秒以内に応答が受信されない場合はエラーで中止する。デフォルトのタイムアウト:30。永久に待機するには0を使用する。
--bigkeys多くの要素(複雑さ)を持つキーを探すRedisキーのサンプル。
--memkeys多くのメモリを消費するキーを探すRedisキーのサンプル。
--memkeys-samples 大量のメモリを消費するキーを探すRedisキーのサンプル。サンプリングするキー要素の数を定義する
--hotkeysホットキーを探すサンプルRedisキー。maxmemory-policyが* lfuの場合にのみ機能します。
--scanSCANコマンドを使用した全てのキーのリスト.
--pattern --scan, --bigkeys or --hotkeys オプションを使用した場合のキーのパターン (default: *).
--intrinsic-latency 固有のシステム遅延を測定するテストを実行する。テストは指定された秒数実行される
--eval でLuaスクリプトを使用してEVALコマンドを送信する
--ldb--evalと共に使用すると、Redis Luaデバッガーが有効になる
--ldb-sync-mode--ldbと同様ですが、同期Luaデバッガーを使用します。このモードでは、サーバーはブロックされ、スクリプトの変更はサーバーのメモリからロールバックされない
--cluster [args...] [opts...]Cluster Managerコマンドと引数
--verboseVerboseモード.
--no-auth-warningDon't show warning message when using password on command line interface.
--helpヘルプの出力
--versionバージョンの出力

実行例

コマンドを指定してredis-cliを実行する例

root@8f9888c8bb76:/data# redis-cli set mykey test
OK
root@8f9888c8bb76:/data# redis-cli get mykey     
"test"

コマンドを複数回繰り返す例

root@8f9888c8bb76:/data#  redis-cli -r 100 lpush mylist x

コマンドのモニターを行う例
monitorコマンドを実行することでRedisの操作を監視できます。

root@8f9888c8bb76:/data#  redis-cli monitor
OK
1600950437.950595 [0 172.17.0.1:48396] "info"
1600950437.955578 [0 172.17.0.1:48396] "set" "testkey2" "test"
1600950437.961197 [0 172.17.0.1:48396] "get" "testkey2"

node.jsでの使用例

Node Redis

Node Redisを使用することでnode.jsからredisの操作が行えます。
https://github.com/NodeRedis/node-redis

インストール方法

npm install --save redis

サンプルコード
以下のサンプルは文字列値を追加して、それを取得するサンプルです。また、redisの操作についてモニタリングをしています。

test1.js
constredis=require('redis')constclient=redis.createClient(6379,'localhost')client.monitor(function(err,res){console.log('client.monitor',err,res);});client.on('monitor',function(time,args,rawReply){console.log('on monitor',time,args,rawReply);});client.set('testkey2',"test",(err,res)=>{console.log(err,res)client.get('testkey2',(error,result)=>{console.log(error,result);client.end(true);})})

IOREDIS

ioredisはredisの機能をフルサポートしており、 Cluster, Sentinel, Streams, Pipeliningなどが使用できます。
またNode RedisではサポートしていないPromisでの記述をサポートしています。

https://github.com/luin/ioredis

2020年9月時点のIOREDISとNode RedisのNPMでのトレンドの比較は以下の通りです。
image.png
https://www.npmtrends.com/ioredis-vs-redis

インストール方法

npm install --save ioredis

サンプルコード

test2.js
constRedis=require("ioredis");constredis=newRedis();letmonitor=null;redis.monitor((err,result)=>{monitor=resultmonitor.on('monitor',(time,args)=>{console.log('on monitor',time,args)})})redis.pipeline().set('mykey','hogehoge').get('mykey',(err,result)=>{console.log('get:',err,result);}).exec((err,result)=>{console.log('exec:',err,result)monitor.disconnect()redis.disconnect()})

redisを使用したsocket.ioのスケールアウトの例

Socket.ioサーバをスケールアウトする(Redisを使った複数プロセス間でのブロードキャスト)
https://qiita.com/takehilo/items/8c773d18ec6cfccd6679

下記のモジュールを使用することでredisを使用したsocket.ioのスケールアウトが可能です。
- socket.io-redis
- socket.io-adapter
- sticky-session

以下のコードは複数プロセスで動作しているsocket.ioを使用したチャットプログラムのサンプルになります。このコードはSocket.ioサーバをスケールアウトする(Redisを使った複数プロセス間でのブロードキャスト)を元に作成しています。

package.json
{"name":"socketio","version":"1.0.0","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\"&& exit 1"},"keywords":[],"author":"","license":"ISC","dependencies":{"cluster":"^0.7.7","express":"^4.17.1","socket.io":"^2.3.0","socket.io-redis":"^5.4.0","sticky-session":"^1.1.2"}}
server.js
constcluster=require('cluster');constio=require('socket.io')();conststicky=require('sticky-session');consthttp=require('http');constredis=require('socket.io-redis');constexpress=require("express");constapp=express();app.use(express.static(__dirname+"/public"));constserver=http.createServer(app);io.adapter(redis({host:'127.0.0.1',port:6379}));io.attach(server);isWorker=sticky.listen(server,3000);if(isWorker){io.on('connection',(socket)=>{console.log(`worker: ${cluster.worker.id}, connected, id: ${socket.id}`);socket.on('message',(user,message)=>{data=`${message} from ${user}`;console.log(data);socket.broadcast.emit('message',user,message);});socket.on('disconnect',()=>{console.log(`disconnected, id: ${socket.id}`);});});}
public/index.html
<!DOCTYPE html><html><head><title>Sample</title><metacharset="UTF-8"/><script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script></head><body><divid="app"><inputv-model:value="user"></input><inputv-model:value="message"></input><buttonv-on:click="send">送信</button></div><script src="/socket.io/socket.io.js"></script><script src="/app.js"></script></body></html>
app.js
constapp=newVue({el:'#app',data:{socket:{},user:'hoge',message:'message'},created:function(){console.log(window.location.origin);this.socket=io.connect(window.location.origin);console.log(this.socket);this.socket.on("message",(user,message)=>{console.log(user,message);})},methods:{send:function(){console.log(this.socket);console.log(this.user,this.message);this.socket.emit("message",this.user,this.message);}}})

Viewing all articles
Browse latest Browse all 9008

Trending Articles