redis 시리즈
- redis 게시 및 구독 기능
- redis 메시지 큐
- redis 파이프라인
- redis 스캔 작업
sequence
에 많은 수의 키 또는 키가 있습니다. redis db db에 set, zset, hash의 요소가 많은 경우 일반적인 get all 작업을 사용하면 이 작업으로 인해 redis가 차단되어 다른 작업에 응답하지 못하게 될 가능성이 높으며, 특히 높은 동시성과 대용량 데이터의 맥락에서 이 문제는 특히 심각한 것으로 보입니다. 그렇다면 데이터베이스와 같은 페이징 기능을 가질 수 있습니까? 답은 스캔 작업입니다. 이번 글에서는 주로 redis-cli와 SpringDataRedis에서 어떻게 사용하는지 보여드리겠습니다. [추천: redis 비디오 튜토리얼]
scan 구문
스캔 후 두 부분이 반환됩니다. 첫 번째 부분은 다음 스캔의 매개 변수이고 두 번째 부분은 scan
Action 개체(db)의 항목입니다. , set, zset, hash )
- db(
키
)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"
로그인 후 복사
- set(
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"
로그인 후 복사
- zset(
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"
로그인 후 복사
- hash(
key & value
)
127.0.0.1:6379> hscan mymap 0 1) "0" 2) 1) "name" 2) "codecraft" 3) "email" 4) "pt@g.cn" 5) "age" 6) "20" 7) "desc" 8) "hello" 9) "sex" 10) "male"
로그인 후 복사
SCAN的额外参数
- count(
指定每次取多少条
)
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"
로그인 후 복사
- match(
匹配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"
로그인 후 복사
set(값
)
@Test
public void scanDbKeys(){
template.execute(new RedisCallback<Iterable<byte[]>>() {
@Override
public Iterable<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
List<byte[]> binaryKeys = new ArrayList<byte[]>();
Cursor<byte[]> 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;
}
});
}
로그인 후 복사
@Test public void scanDbKeys(){ template.execute(new RedisCallback<Iterable<byte[]>>() { @Override public Iterable<byte[]> doInRedis(RedisConnection connection) throws DataAccessException { List<byte[]> binaryKeys = new ArrayList<byte[]>(); Cursor<byte[]> 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; } }); }
로그인 후 복사
zset(값 및 점수
)
/**
* sadd myset a b c d e f g h i j k l m n
*/
@Test
public void scanSet(){
Cursor<String> cursor = template.opsForSet().scan("myset",ScanOptions.NONE);
while (cursor.hasNext()){
System.out.println(cursor.next());
}
}
로그인 후 복사
/** * sadd myset a b c d e f g h i j k l m n */ @Test public void scanSet(){ Cursor<String> cursor = template.opsForSet().scan("myset",ScanOptions.NONE); while (cursor.hasNext()){ System.out.println(cursor.next()); } }
로그인 후 복사