• redis scan count的含义/二进制安全问题


    redis是单线程的(4.0之前),keys查询键类似hbase的全表扫描(也可以理解为select *),大数据量时非常耗时,因此官方给出了scan,使用scan类似数据库分页,可以指定查询多少个元素,官网的说明是scan是一种遍历,只不过可以用count指定每次查询多少个元素

    语法:scan cursor match pattern count num

    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打开了一张图片,显示的是乱码,如果你修改了这些乱码,再用图片查看器打开图片时你会发现图片打不开了,这个操作就是非二进制安全的

    还有一个例子,写入文件时如果写入的编码与文件编码不一致,写入之后会产生大量的无意义的乱码,很容易导致文件无法正常显示,c语言默认将空格作为字符串的结尾,这就导致c保存字符串时会出现内容丢失的问题,redis底层存储字符串的是sds,虽然使用的是char类型的数组,但里面保存的却是字节,此外redis没有对字符串设定任何的过滤及修改,从这点上看redis是二进制安全的,可以存储视频,音频,redis的字符串最大长度是512M,扩容的方式类似java中的hashmap,list等都是预先分配多余的空间,从而减少频繁的内存分配带来的性能开销

  • 相关阅读:
    023.抓到“拔粪青年”
    JQuery给元素动态增删类或特性
    HTML元素的基本特性
    ASP.NET MVC中如何在客户端进行必要的判断
    ASP.NET MVC如何在页面加载完成后ajax异步刷新
    C#如何根据DataTable生成泛型List或者动态类型list
    C#sql语句如何使用占位符
    在html借助元素特性存储信息
    ASP.NET MVC中如何以ajax的方式在View和Action中传递数据
    如何根据集合动态构建复选框选择控件
  • 原文地址:https://www.cnblogs.com/tele-share/p/11449502.html
Copyright © 2020-2023  润新知