redis 《scan命令》
此命令十分奇特建议参考文档:http://redisdoc.com/database/scan.html#scan
222222222222222并非每次迭代都要使用相同的 COUNT
值。
用户可以在每次迭代中按自己的需要随意改变 COUNT
值, 只要记得将上次迭代返回的游标用到下次迭代里面就可以了。
其实就是每次使用游标的时候 把上次的cursor放到jedis.scan(cursor,params);里面
引子上文连接描述: 并发执行多个迭代 在同一时间, 可以有任意多个客户端对同一数据集进行迭代, 客户端每次执行迭代都需要传入一个游标, 并在迭代执行之后获得一个新的游标, 而这个游标就包含了迭代的所有状态, 因此, 服务器无须为迭代记录任何状态。 中途停止迭代 因为迭代的所有状态都保存在游标里面, 而服务器无须为迭代保存任何状态, 所以客户端可以在中途停止一个迭代, 而无须对服务器进行任何通知。 即使有任意数量的迭代在中途停止, 也不会产生任何问题。 使用错误的游标进行增量式迭代 使用间断的(broken)、负数、超出范围或者其他非正常的游标来执行增量式迭代并不会造成服务器崩溃, 但可能会让命令产生未定义的行为。 未定义行为指的是, 增量式命令对返回值所做的保证可能会不再为真。 只有两种游标是合法的: 在开始一个新的迭代时, 游标必须为 0 。 增量式迭代命令在执行之后返回的, 用于延续(continue)迭代过程的游标。 迭代终结的保证 增量式迭代命令所使用的算法只保证在数据集的大小有界(bounded)的情况下, 迭代才会停止, 换句话说, 如果被迭代数据集的大小不断地增长的话, 增量式迭代命令可能永远也无法完成一次完整迭代。 从直觉上可以看出, 当一个数据集不断地变大时, 想要访问这个数据集中的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。
返回值 SCAN 命令、 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都返回一个包含两个元素的 multi-bulk 回复: 回复的第一个元素是字符串表示的无符号 64 位整数(游标), 回复的第二个元素是另一个 multi-bulk 回复, 这个 multi-bulk 回复包含了本次被迭代的元素。 SCAN 命令返回的每个元素都是一个数据库键。 SSCAN 命令返回的每个元素都是一个集合成员。 HSCAN 命令返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成。 ZSCAN 命令返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
11111111111111111 MATCH 选项 和 KEYS
命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern>
参数来实现。
String cursor = ScanParams.SCAN_POINTER_START;
// ScanParams params = new ScanParams();
// params.count(10); 类似分页每次查询多少个元素
// params.match("*a*"); 匹配 带有a的key
//
// ScanResult<String> scan = jedis.scan(cursor,params);
// 1. 设置IP地址和端口 Jedis jedis = new Jedis("localhost",6379); jedis.auth("123456"); ScanResult<String> scan = jedis.scan("0"); String stringCursor = scan.getStringCursor(); System.out.println("第一次获取游标:"+stringCursor); System.out.println("第一次遍历游标获取的值"); List<String> result = scan.getResult(); for (String str :result){ System.out.println(""+str+"\t"); } System.out.println("华丽分割线》》》》》》》》》》》》》》》》》》》"); System.out.println("用第一次获取游标:"+stringCursor+"作为第二次游标的开始"); ScanResult<String> scan0 = jedis.scan(stringCursor); List<String> result0 = scan0.getResult(); String stringCursor1 = scan0.getStringCursor(); System.out.println("第二次获取游标:"+stringCursor1); System.out.println("第二次遍历游标获取的值"); for (String str :result0){ System.out.println(str+"\t"); } System.out.println("用第二次获取游标:"+stringCursor1+"作为第三次游标的开始"); System.out.println("华丽分割线》》》》》》》》》》》》》》》》》》》"); ScanResult<String> scan1 = jedis.scan(stringCursor1); List<String> result1 = scan1.getResult(); String stringCursor2 = scan1.getStringCursor(); System.out.println("第三次获取游标:"+stringCursor2+"为0说明整个数值集合遍历完成"); for (String str :result1){ System.out.println(""+str+"\t"); } // 4.释放资源 jedis.close();
一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰