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等都是预先分配多余的空间,从而减小频繁的内存分配带来的性能开销线程