这篇文章主要讲解了“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>scan01)"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>scan1201)"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>sscanmyset01)"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>sscanmyset31)"0"2)1)"l"2)"k"3)"d"

zset(value & score)

127.0.0.1:6379>zscansortset01)"0"2)1)"tom"2)"89"3)"jim"4)"90"5)"david"6)"100"

hash(key & value)

127.0.0.1:6379>hscanmymap01)"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>scan0count51)"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>scan0matcharticle*1)"120"2)1)"articleMap:63"2)"articleMap:37"3)"articleMap:60"4)"articleMap:80"5)"articleMap:46"6)"articleMap:55"RedisTemplate操作遍历数据库key

@TestpublicvoidscanDbKeys(){template.execute(newRedisCallback<Iterable<byte[]>>(){@OverridepublicIterable<byte[]>doInRedis(RedisConnectionconnection)throwsDataAccessException{List<byte[]>binaryKeys=newArrayList<byte[]>();Cursor<byte[]>cursor=connection.scan(ScanOptions.scanOptions().count(5).build());while(cursor.hasNext()){byte[]key=cursor.next();binaryKeys.add(key);System.out.println(newString(key,StandardCharsets.UTF_8));}try{cursor.close();}catch(IOExceptione){//dosomethingmeaningful}returnbinaryKeys;}});}遍历set

/***saddmysetabcdefghijklmn*/@TestpublicvoidscanSet(){Cursor<String>cursor=template.opsForSet().scan("myset",ScanOptions.NONE);while(cursor.hasNext()){System.out.println(cursor.next());}}遍历zset

/***zaddsortset89tom90jim100david*/@TestpublicvoidscanZSet(){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

/***hsetmymapname"codecraft"*hsetmymapemail"pt@g.cn"*hsetmymapage20*hsetmymapdesc"hello"*hsetmymapsex"male"*/@TestpublicvoidscanHash(){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语法及作用对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!