共計(jì) 3134 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。
這篇文章主要講解了“redis 的 scan 語(yǔ)法及作用對(duì)象”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“redis 的 scan 語(yǔ)法及作用對(duì)象”吧!
redis 的 scan 操作序
在 redis 的 db 存在大量 key 或者 db 里頭的某個(gè) set、zset、hash 里頭的元素非常多的話,用普通的 get all 操作很可能導(dǎo)致 redis 因?yàn)檫@個(gè)操作阻塞了,導(dǎo)致不能響應(yīng)其他操作,特別是在高并發(fā)、海量數(shù)據(jù)的背景下,這個(gè)問(wèn)題顯得尤其嚴(yán)重。那么能不能像數(shù)據(jù)庫(kù)那樣有個(gè)分頁(yè)的功能呢,答案就是 scan 操作。本文主要展示怎么在 redis-cli 以及 SpringDataRedis 中的使用。【推薦:redis 視頻教程】
scan 語(yǔ)法
scan 之后返回兩部分,第一部分是下次 scan 的參數(shù),第二部分就是 scan 出來(lái)的項(xiàng)
作用對(duì)象 (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 的額外參數(shù)
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 操作遍歷數(shù)據(jù)庫(kù) 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 語(yǔ)法及作用對(duì)象”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì) redis 的 scan 語(yǔ)法及作用對(duì)象這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!