redis的scan语法及作用对象

86次阅读
没有评论

共计 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 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计3134字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)