redis的scan语法及作用对象
这篇文章主要讲解了“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
@Test
public void scanSet(){
Cursor<String> cursor = template.opsForSet().scan("myset",ScanOptions.NONE);
while (cursor.hasNext()){
System.out.println(cursor.next());
}
}
遍历zset
@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
@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语法及作用对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341