サーチ…
前書き
Redisキースペースは、データベース内のデータ構造へのキーをマッピングするハッシュテーブルまたはディクショナリと考えることができます。
Redisは、キーを削除する機能、キーのメタデータを調べる機能、キーを検索する機能、キーの特定のプロパティを変更する機能など、キー空間を管理するためにキーを操作する幅広いコマンドを提供しています。
構文
- KEYSパターン
- PERSISTキー
- EXPIREキー秒
- EXPIREATキーのタイムスタンプ
- TTLキー
- PEXPIREキーのミリ秒
- PEXPIREATキーのミリ秒 - タイムスタンプ
- PTTLキー
- UNLINKキー[キー...]
- DELキー[キー...]
- SCANカーソル[MATCHパターン] [カウント数]
備考
Redisキーの有効な文字については、マニュアルで完全に説明しています。
Redisキーはバイナリセーフです。つまり、 "foo"のような文字列からJPEGファイルの内容まで、バイナリシーケンスをキーとして使用できます。空の文字列も有効なキーです。
キーに関する他のいくつかのルール:
非常に長いキーは良い考えではありません。たとえば、1024バイトのキーはメモリだけでなく、データセット内のキーの参照でいくつかの高価なキー比較が必要になる可能性があるためです。手元にあるタスクが大きい値の存在と一致する場合でも、ハッシュに頼ること(SHA1など)は、特にメモリと帯域幅の観点から、より良いアイデアです。
非常に短いキーはしばしば良い考えではありません。代わりに "user:1000:followers"と書くことができれば、 "u1000flw"をキーとして書いてもほとんど意味がありません。後者はより読みやすく、追加されたスペースは、キーオブジェクト自体と値オブジェクトによって使用されるスペースに比べて小さいです。短いキーは明らかにメモリを少し消費しますが、あなたの仕事は正しいバランスを見つけることです。
スキーマを守ろう。たとえば、 "object-type:id"は "user:1000"のように良いアイデアです。 "comment:1234:reply.to"や "comment:1234:reply-to"のように、ドットやダッシュはマルチワードフィールドでよく使われます。
許可されるキーの最大サイズは512 MBです。
実動システムに対してKEYSコマンドを使用する場合は注意が必要です。重大なパフォーマンス上の問題を引き起こす可能性があります。キースペースに対して検索を行う必要がある場合は、 SCANコマンドがより良い選択肢です。
有効なキー
Redisキーはバイナリセーフなので、文字通り何かをキーとして使用できます。唯一の制限は、512MB未満でなければならないということです。
有効なキーの例:
7
++++
`~!@#$%^&*()-_=+
user:10134
search/9947372/?query=this%20is%20a%28test%29%20query
<div id="div64">
Any other string less than 512MB in size.
The raw binary content of an image or other binary file.
An entire multi-line text document.
An entire SQL query.
Any integer, hexadecimal, octal, or binary value.
Anything else you can think of less than 512MB in size.
無効なRedisキー:
Anything larger than 512MB.
キー命名方式
明快さと保守性のために、Redisキーの名前を付けるシステムまたはスキーマを開発することが推奨されることがよくあります。あなたのキーの名前を付けるための共通のシステムと保守可能なシステムの例を以下に示します。
user:10134
user:10134:favorites
user:10134:friends
user:10134:friends-of-friends
user:10134
user:10134/favorites
user:10134/friends
user:10134/friends.of.friends
user/10134
user/10134/favorites
user/10134/friends
user/10134/friends of friends
許可されている間は、大きなキーではより多くのメモリが使用され、ルックアップ時間が遅くなるため、500MBのキーを使用するとパフォーマンスが向上するとは限りません。より良い考え方は、大きなバイナリオブジェクトのSHA-1、SHA-256、またはMD5ハッシュをキーとして使用することです。
image/9517bb726d33efdc503a43582e6ea2eea309482b
image52e9df0577fca2ce022d4e8c86b1eccb070d37bef09dec36df2fabbfa7711f5c
すべてのキーの一覧表示
redis-cliから次のコマンドを実行すると、Redisデータベースのすべてのキーを一覧表示できます。
KEYS *
KEYSのパラメータは、グロブスタイルのパターンマッチング式です。支持パターンの例には、
h?llo matches hello, hallo and hxllo
h*llo matches hllo and heeeello
h[ae]llo matches hello and hallo, but not hillo
h[^e]llo matches hallo, hbllo, ... but not hello
h[a-b]llo matches hallo and hbllo
KEYS *コマンドを使用すると、パフォーマンスに悪影響を与える可能性があるため、本番インスタンスに対しては推奨されません。プロダクションコードのキーを検索するには、SCAN操作を使用します。
TTLとキーの有効期限
キーの期限切れ値は、更新コマンドの外部のユーザによって管理することができる。 Redisでは、TTLコマンドを使用して、ユーザーがキーの現在の有効期間(TTL)を判断できます。
TTL key
このコマンドは、キーのTTLを秒単位で返します。または、特殊な値-1または-2を返します。 -1はキーが永続的(期限切れにならない)であることを示し、-2はそのキーが存在しないことを示します。
期限切れのキーは、PERSISTコマンドを使用して永続化することができます。
PERSIST KEY
EXPIREコマンドを使用して永続キーを期限切れにすることができます。
EXPIRE KEY seconds
Expireは、既存のキーのTTLを変更するためにも使用できます。また、EXPIREATコマンドをUNIXタイムスタンプとともに使用して、有効期限を設定することもできます。
TTL、EXPIRE、およびEXPIREATコマンドには、接頭辞Pが付いたミリ秒バージョンがあります。
キーの削除
Redisは、データベースからキーを削除する2つの関数delとunlinkを提供します。
del関数は、データベースから1つまたは複数のキーを削除します。 delコマンドを実行すると、Redisは現在の実行スレッドで削除されたキーのメモリをすぐに再利用します。 delの実行時間は、すべてのキーから削除された個々の要素の数に比例します。
unlink関数はdelコマンドのように動作し、データベースから1つ以上のキーを削除します。ただし、delコマンドとは異なり、これらのキーで使用されるメモリは、別のスレッドで非同期に再要求されます。
Redis Keyspaceのスキャン
RedisはSCANコマンドを提供して、特定のパターンに一致するデータベース内のキーを反復処理します。 Redisは、SCANコマンドでグロブスタイルのパターンマッチングをサポートしています。
SCANコマンドは、Redisキースペースにカーソルベースのイテレータを提供します。 SCANへの反復呼び出しシーケンスは、ユーザーがカーソル引数を0に設定して呼び出しを開始することから始まります。その呼び出しの結果は、項目のバッチとSCANへの次の呼び出しに供給される更新カーソルです。この繰り返しは、Redisが0のカーソルを返すまで続きます。
次のPython関数は、SCANの基本的な使い方を示しています。
def scan_keys(r, pattern):
"Returns a list of all the keys matching a given pattern"
result = []
cur, keys = r.scan(cursor=0, match=pattern, count=2)
result.extend(keys)
while cur != 0:
cur, keys = r.scan(cursor=cur, match=pattern, count=2)
result.extend(keys)
return result
SCANコマンドは、データベース内のキーを検索するための推奨方法であり、 KEYS *
コマンドよりも推奨されます。