redis scan count的含義/二進制安全問題

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等都是預先分配多餘的空間,從而減小頻繁的內存分配帶來的性能開銷線程

相關文章
相關標籤/搜索