共计 3134 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要讲解了“redis 的 scan 语法及作用对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“redis 的 scan 语法及作用对象”吧!
redis 的 scan 操作序
在 redis 的 db 存在大量 key 或者 db 里头的某个 set、zset、hash 里头的元素非常多的话,用普通的 get all 操作很可能导致 redis 因为这个操作阻塞了,导致不能响应其他操作,特别是在高并发、海量数据的背景下,这个问题显得尤其严重。那么能不能像数据库那样有个分页的功能呢,答案就是 scan 操作。本文主要展示怎么在 redis-cli 以及 SpringDataRedis 中的使用。【推荐:redis 视频教程】
scan 语法
scan 之后返回两部分,第一部分是下次 scan 的参数,第二部分就是 scan 出来的项
作用对象 (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
RedisTemplate 操作遍历数据库 key
@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;
}
});
}
遍历 set
/**
* 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());
}
}
遍历 zset
/**
* zadd sortset 89 tom 90 jim 100 david
*/
@Test
public void scanZSet(){ Cursor ZSetOperations.TypedTuple String cursor = template.opsForZSet().scan(sortset ,ScanOptions.NONE);
while (cursor.hasNext()){ ZSetOperations.TypedTuple String item = cursor.next();
System.out.println(item.getValue() + : + item.getScore());
}
}
遍历 hash
/**
* hset mymap name codecraft
* hset mymap email pt@g.cn
* hset mymap age 20
* hset mymap desc hello
* hset mymap sex male
*/
@Test
public void scanHash(){ Cursor Map.Entry Object, Object curosr = template.opsForHash().scan(mymap , ScanOptions.NONE);
while(curosr.hasNext()){ Map.Entry Object, Object entry = curosr.next();
System.out.println(entry.getKey()+ : +entry.getValue());
}
}
感谢各位的阅读,以上就是“redis 的 scan 语法及作用对象”的内容了,经过本文的学习后,相信大家对 redis 的 scan 语法及作用对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!