redisのscan操作
5330 ワード
redisシリーズ redisのパブリケーション購読機能 redisメッセージキュー redisのpipeline redisのscan動作 シーケンス
redisのdbにkeyやdbの中のset,zset,hashの中の要素が大量に存在すると,通常のget all操作ではredisがこの操作でブロックされ,他の操作に応答できない可能性が高く,特に高同時,大量のデータを背景に,この問題は特に深刻に見える.では、データベースのようにページング機能があるかどうか、答えはscan操作です.ここでは主にredis-cliおよびSpringDataRedisでの使用方法を示します.
scan構文
scanの後に2つの部分を返して、第1の部分は次回のscanのパラメータで、第2の部分はscanの出た項です
作用オブジェクト(db、set、zset、hash) db( set( zset( hash(
SCANの追加パラメータ count( match(
RedisTemplate操作
データベースを巡るkey
遍歴set
遍歴zset
hashを巡る
リファレンス redis-scan Not able Scan using redis template redis scanによるデータの反復 Redis Scan反復器遍歴動作原理(一)-基礎
redisのdbにkeyやdbの中のset,zset,hashの中の要素が大量に存在すると,通常のget all操作ではredisがこの操作でブロックされ,他の操作に応答できない可能性が高く,特に高同時,大量のデータを背景に,この問題は特に深刻に見える.では、データベースのようにページング機能があるかどうか、答えはscan操作です.ここでは主にredis-cliおよびSpringDataRedisでの使用方法を示します.
scan構文
scanの後に2つの部分を返して、第1の部分は次回のscanのパラメータで、第2の部分はscanの出た項です
作用オブジェクト(db、set、zset、hash)
key
) 127.0.0.1:6379> scan 0
1) "120"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "counter:__rand_int__"
4) "articleMap:60"
5) "tagSet:tag5"
6) "articleMap:80"
7) "messageCache~keys"
8) "mymap"
9) "articleMap:46"
10) "articleMap:55"
127.0.0.1:6379> scan 120
1) "28"
2) 1) "articleMap:17"
2) "tagSet:tag1"
3) "articleMap:18"
4) "articleMap:81"
5) "\xac\xed\x00\x05t\x00\btest-cas"
6) "articleMap:51"
7) "articleMap:94"
8) "articleMap:26"
9) "articleMap:71"
10) "user-abcde"
value
) 127.0.0.1:6379> sscan myset 0
1) "3"
2) 1) "m"
2) "j"
3) "c"
4) "h"
5) "f"
6) "i"
7) "a"
8) "g"
9) "n"
10) "e"
11) "b"
127.0.0.1:6379> sscan myset 3
1) "0"
2) 1) "l"
2) "k"
3) "d"
value & score
) 127.0.0.1:6379> zscan sortset 0
1) "0"
2) 1) "tom"
2) "89"
3) "jim"
4) "90"
5) "david"
6) "100"
key & value
) 127.0.0.1:6379> hscan mymap 0
1) "0"
2) 1) "name"
2) "codecraft"
3) "email"
4) "[email protected]"
5) "age"
6) "20"
7) "desc"
8) "hello"
9) "sex"
10) "male"
SCANの追加パラメータ
) 127.0.0.1:6379> scan 0 count 5
1) "240"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "counter:__rand_int__"
4) "articleMap:60"
5) "tagSet:tag5"
key
) 127.0.0.1:6379> scan 0 match article*
1) "120"
2) 1) "articleMap:63"
2) "articleMap:37"
3) "articleMap:60"
4) "articleMap:80"
5) "articleMap:46"
6) "articleMap:55"
RedisTemplate操作
データベースを巡るkey
@Test
public void scanDbKeys(){
template.execute(new RedisCallback>() {
@Override
public Iterable doInRedis(RedisConnection connection) throws DataAccessException {
List binaryKeys = new ArrayList();
Cursor cursor = connection.scan(ScanOptions.scanOptions().count(5).build());
while (cursor.hasNext()) {
byte[] key = cursor.next();
binaryKeys.add(key);
System.out.println(new String(key, StandardCharsets.UTF_8));
}
try {
cursor.close();
} catch (IOException e) {
// do something meaningful
}
return binaryKeys;
}
});
}
遍歴set
/**
* sadd myset a b c d e f g h i j k l m n
*/
@Test
public void scanSet(){
Cursor cursor = template.opsForSet().scan("myset",ScanOptions.NONE);
while (cursor.hasNext()){
System.out.println(cursor.next());
}
}
遍歴zset
/**
* zadd sortset 89 tom 90 jim 100 david
*/
@Test
public void scanZSet(){
Cursor> cursor = template.opsForZSet().scan("sortset",ScanOptions.NONE);
while (cursor.hasNext()){
ZSetOperations.TypedTuple item = cursor.next();
System.out.println(item.getValue() + ":" + item.getScore());
}
}
hashを巡る
/**
* hset mymap name "codecraft"
* hset mymap email "[email protected]"
* hset mymap age 20
* hset mymap desc "hello"
* hset mymap sex "male"
*/
@Test
public void scanHash(){
Cursor> curosr = template.opsForHash().scan("mymap", ScanOptions.NONE);
while(curosr.hasNext()){
Map.Entry
リファレンス