redis是單線程的,keys查詢鍵相似hbase的全表掃描(也能夠理解爲select *),大數據量時很是耗時,所以官方給出了scan,使用scan相似數據庫分頁,能夠指定查詢多少個元素,官網的說明是scan是一種遍歷,只不過能夠用count指定每次查詢多少個元素java
語法:scan cursor match pattern count numredis
cursor:遊標,默認從0開始,每一次執行scan除了返回查詢結果還會返回遊標的位置,即使某次查詢結果爲空,並不能表明遍歷結束,只有當返回的遊標爲0時,才能表明遍歷結束數據庫
match:默認是 * ,匹配指定的元素數組
count:默認是10,redis的底層實現相似java的hashmap,都是hash表,因此真正存儲數據的是數組,count指定的是每次查詢數組多少個元素安全
綜上:scan查詢count數量的元素返回知足match條件的結果性能
使用Jedis來操做redis大數據
1 @Test 2 public void test2() { 3 Jedis jedis = new Jedis("192.168.101.101"); 4 System.out.println(jedis.ping()); 5
6
7 // 0 單次返回的結果爲0並不表明遍歷結束,只有當返回的cursor爲0時才表明遍歷結束
8 String cursor = ScanParams.SCAN_POINTER_START; 9
10 ScanParams params = new ScanParams(); 11 //默認的count數量爲10,count並不是限定返回結果的數量, 12 // 而是單次遍歷的數組元素數量(redis底層是hash表實現的,因此存放數據的是數組),返回其中匹配的元素 13 //當元素較多,而count設置的比較小時,此時會進行屢次查詢
14 params.count(10); 15 params.match("u*"); 16
17 ScanResult<String> scanResult; 18 boolean flag = true; 19 while (flag) { 20 scanResult = jedis.scan(cursor, params); 21 cursor = scanResult.getCursor(); 22 if (Integer.parseInt(cursor) == 0) { 23 flag = false; 24 } 25 System.out.println(cursor); 26 scanResult.getResult().forEach(i -> System.out.println(i)); 27 } 28
29 jedis.close(); 30 }
相似的還有hscan(hash),zscan(zset),sscan(set),再也不贅述編碼
什麼是二進制安全?好比你用word打開了一張圖片,顯示的是亂碼,若是你修改了這些亂碼,再用圖片查看器打開圖片時你會發現圖片打不開了,這個操做就是非二進制安全的spa
還有一個例子,寫入文件時若是寫入的編碼與文件編碼不一致,寫入以後會產生大量的無心義的亂碼,很容易致使文件沒法正常顯示,c語言默認將空格做爲字符串的結尾,這就致使c保存字符串時會出現內容丟失的問題,redis底層存儲字符串的是sds,雖然使用的是char類型的數組,但裏面保存的倒是字節,此外redis沒有對字符串設定任何的過濾及修改,從這點上看redis是二進制安全的,能夠存儲視頻,音頻,redis的字符串最大長度是512M,擴容的方式相似java中的hashmap,list等都是預先分配多餘的空間,從而減小頻繁的內存分配帶來的性能開銷線程