Redisストレージ、クエリー

5393 ワード

[TOC]

データストア


MySQLデータベースにこのようなテーブルがあるとします.
mysql> desc user_info;

Field
Type
Null
Key
Default
Extra
id
int(11)
NO
PRI
NULL
auto_increment
NAME
varchar(50)
YES
NULL
age
int(11)
YES
NULL
email
varchar(50)
YES
NULL
addr
varchar(100)
YES
NULL
redisでは、name、age、email(組合せ)でクエリーできることを望んでいます.では、redisストレージは次のように計画できます.
hmset user_info.id.{id} name {name} age {age} email {email} addr {addr}

索引

sadd user_info.name.{name} {id1} {id2} {id3}
sadd user_info.age.{age} {id2} {id4} {id6}
sadd user_info.email.{email} {id1} {id3} {id9}

検索


keysファジイクエリ

//    name   keywords   
keys user_info.name.*keywords*

keysは正規マッチングをサポートしていますが、このコマンドをprod環境で使用しないことをお勧めします.これにより、パフォーマンスが低下します.
Warning: consider KEYS as a command that should only be used in production environments with extreme care. It may ruin performance when it is executed against large databases. This command is intended for debugging and special operations, such as changing your keyspace layout. Don't use KEYS in your regular application code. If you're looking for a way to find keys in a subset of your keyspace, consider using SCAN or sets.

setsクエリー

// name  
smembers user_info.name.{name}

// age  
smembers user_info.age.{age}

// email  
smembers user_info.email.{email}

// name, age    
sinter user_info.name.{name} user_info.age.{age}

上のクエリはすべて正確=クエリであることに注意してください.

scanクエリー


SCAN:SCANは現在のデータベースのkeyセットを反復する.
SSCAN:SSCAN反復指定Sets key集合の要素.
ZSCAN:ZSCAN反復はSorted Set key集合の要素を指定する.
HSCAN:HSCAN反復はHash key集合のfield/valueを指定する.
構文:SCAN cursor[MATCH pattern][COUNT count]
countは結果セットを返す数を指定します.デフォルトは10です.redisは毎回count個の結果を返すことを保証しません.
SCANはカーソル(cursor)に基づいており、毎回少量の結果セットしか返さないため、cursorを反復し続け、cursorに0だけ戻る必要があります.
127.0.0.1:6379> scan 0 count 5
1) "10"                                    //      cursor   position
2) 1) "Key_6"
   2) "Key_1"
   3) "Key_4"
   4) "Key_10"
   5) "Key_5"
   6) "Key_7"                              //     count 5,    6   
127.0.0.1:6379> scan 10 count 5
1) "11"                                    //      cursor   position
2) 1) "Key_8"
   2) "Key_3"
   3) "Key_11"
   4) "Key_9"
   5) "Key_2"
127.0.0.1:6379> scan 11 count 5
1) "0"                                    // 0      
2) 1) "Key_12"

Matchここではmatchが実行するプロセスに注意する必要がある:1,redisはscan x COUNT[count]2を実行し,redisは上の結果セットをmatchフィルタリングしclient側に戻る
これは、matchフィルタを使用する場合、クライアント側が受信するたびに受信する結果セットの数が指定した[count]の数よりも少ないことを意味します.
// match     ,     '1' key  
127.0.0.1:6379> scan 0 count 5  match *1*
1) "10"
2) 1) "Key_1"
   2) "Key_10"
127.0.0.1:6379> scan 10 count 5  match *1*
1) "11"
2) 1) "Key_11"
127.0.0.1:6379> scan 11 count 5  match *1*
1) "0"
2) 1) "Key_12"
// SCAN cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> sadd age.22 id_5 id_7 id_9 id_8 id_11 id_12 id_20
(integer) 7
127.0.0.1:6379> sscan age.22 0 count 5
1) "0"
2) 1) "id_7"
   2) "id_5"
   3) "id_11"
   4) "id_8"
   5) "id_9"
   6) "id_20"
   7) "id_12"
// HSCAN key cursor [MATCH pattern] [COUNT count]
127.0.0.1:6379> hmset user.id.1 name 'Troy Zhang' age 30 email '[email protected]' addr 'ChengDu, SiChuan, China' gender 'male' job 'Mobile Developer' phone '110' dept 'WEBOP CD'
OK
127.0.0.1:6379> hscan user.id.1 0
1) "0"
2)  1) "name"
    2) "Troy Zhang"
    3) "age"
    4) "30"
    5) "email"
    6) "[email protected]"
    7) "addr"
    8) "ChengDu, SiChuan, China"
    9) "gender"
   10) "male"
   11) "job"
   12) "Mobile Developer"
   13) "phone"
   14) "110"
   15) "dept"
   16) "WEBOP CD"

Scanの特徴:1,Scanはredis server側で無状態で、いつでも途中で反復を中止することができて、redis server 2に通知する必要はなくて、複数のclientは同時に同じcursorを反復することができます
Scan欠点:1,countは指定された数の結果セットを返すたびに2を保証することができず,返されたkey結果セットが重複する可能性がある
prod環境でまとめると、redisはkeysやsmembersではなくscanを推奨します.
Since these commands allow for incremental iteration, returning only a small number of elements per call, they can be used in production without the downside of commands like KEYS or SMEMBERS that may block the server for a long time (even several seconds) when called against big collections of keys or elements.