redis系列博文,redis连接管理类的代码请跳转查看《java-redis字符类数据操作示例(一)》。

一、集合类型缓存测试类

public class SetTest {
/**
* 主测试方案
*/
@Test
public void test() {
RedisUtil.instance.run(conn -> oper(conn));
Assert.assertTrue(true);
}
/**
* 测试用的key
*/
private final String _key = "simm-set";
/**
* 字符串操作
*
* @param conn
*/
private void oper(ShardedJedis conn) {
System.out.println(MessageFormat.format("key[{0}]存在:{1} ", _key,conn.exists(_key)));
// 集合数据初始化
String[] arr= "AA,AB,AC,AD,AE,AF,AG,BA,BB,BC,BD,BE,BF,BG".split(",");
conn.sadd(_key, arr);
print(conn);
//1.查询元素
//指定个数 count 在redis服务中默认值为10
ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("*").count(2));
String cursor = result.getStringCursor();
System.out.println(MessageFormat.format("游标位置:{0}", cursor));
print(result.getResult());
//匹配内容
result = conn.sscan(_key, "0",new ScanParams().match("A*"));
print(result.getResult());
result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
print(result.getResult());
//2.集合元素删除方法
//2.1.移除
Long effected = conn.srem(_key, "AE","BG","HI");//移除CGH。
System.out.println(MessageFormat.format("成功移除{0}个元素", effected));
print(conn);
//2.2.从集合中弹出一个元素
String pop = conn.spop(_key);
System.out.println(MessageFormat.format("POP: {0}", pop));
print(conn);
//3.判断元素是否存在
System.out.println(MessageFormat.format("A是集合中的元素? {0}", conn.sismember(_key, "AA")));
System.out.println(MessageFormat.format("J是集合中的元素? {0}", conn.sismember(_key, "JQ"))); conn.expire(_key, 1); //设置改key值1s后过期,过期后redis自动清理该缓存
System.out.println(MessageFormat.format("key[{0}]存在:{1} ", _key,conn.exists(_key)));
} private void print(List<String> list){
System.out.print(MessageFormat.format("scan输出,长度[{1}]:", _key,list.size()));
for (String str : list) {
System.out.print(MessageFormat.format("{0} ", str));
}
System.out.println();
} private void print(ShardedJedis conn){
System.out.print(MessageFormat.format("{0}元素输出,长度[{1}]:", _key,conn.scard(_key)));
Set<String> list = conn.smembers(_key);
for (String str : list) {
System.out.print(MessageFormat.format("{0} ", str));
}
System.out.println();
}
}

二、结果输出

  

三、关于sscan命令

  

  match参数用于过滤,count参数用于限制一次迭代返回的集合数目。这个值默认是10。我测试了两种情况,集合元素个数少于10以及大于10。后面给出测试的结果。测试过这个sscan方法后,有点懵逼,网上查找别人的分享,好像也是懵逼的多。显示设置一次迭代的个数,是否能够生效,还受到set元素总个数是否超过10的影响。这块的实现让人费解。就测试后来看,当数据量不是很大,想正确的一次查询所有匹配项的话,请设置一个较大的count参数,这样能保证数据量从少到多的过程中都不会出问题。

  1、初始化集合元素为7个

  // 集合数据初始化
String[] arr= "AA,AB,AC,AD,AE,AF,AG".split(",");
conn.sadd(_key, arr);
print(conn);
//1.查询元素
//指定个数 count 在redis服务中默认值为10
ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("A*").count(2));
String cursor = result.getStringCursor();
System.out.println(MessageFormat.format("游标位置:{0}", cursor));
print(result.getResult());
//匹配内容
result = conn.sscan(_key, "0",new ScanParams().match("A*"));
print(result.getResult());
result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
print(result.getResult());

    测试3种场景,情况如下

    • match("A*").count(2):查询以A开头的元素,限定一次迭代2个元素。结果返回了3个数据。设置一次迭代2个元素,结果返回元素还大于设置的迭代量,卧槽,蛋疼的结果;
    • match("A*"):不显示指定迭代个数,结果返回了所有的匹配项;
    • match("A*").count(100):指定一次迭代上限为100,结果也返回了所有的匹配项。

  2、初始化集合元素为14个

        // 集合数据初始化
String[] arr= "AA,AB,AC,AD,AE,AF,AG,BA,BB,BC,BD,BE,BF,BG".split(",");
conn.sadd(_key, arr);
print(conn);
//1.查询元素
//指定个数 count 在redis服务中默认值为10
ScanResult<String> result = conn.sscan(_key, "0",new ScanParams().match("A*").count(2));
String cursor = result.getStringCursor();
System.out.println(MessageFormat.format("游标位置:{0}", cursor));
print(result.getResult());
//匹配内容
result = conn.sscan(_key, "0",new ScanParams().match("A*"));
print(result.getResult());
result = conn.sscan(_key, "0",new ScanParams().match("A*").count(100));
print(result.getResult());

    测试3种场景,情况如下

    • match("A*").count(2):查询以A开头的元素,限定一次迭代2个元素。结果返回为空。可以理解为这一次的2个迭代元素均不符合过滤条件;
    • match("A*"):不显示指定迭代个数,结果返回了4个匹配项。这样看默认的10个一批迭代的设置起作用了;
    • match("A*").count(100):指定一次迭代上限为100,结果返回了所有的匹配项。看来想一次正确返回所有匹配项,只能直接设置一个较大的迭代值了。

java-redis集合数据操作示例(三)的更多相关文章

  1. redis之数据操作详解

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. java-redis列表数据操作示例(二)

    接上篇博文<java-redis字符类数据操作示例(一)>,redis连接管理类的代码请跳转查看. 一.列表类型缓存测试类 public class ListTest { /** * 主测 ...

  3. redis常见数据操作

    redis中有5种常见的数据类型,针对这5种数据类型有着相应的数据操作. 1.String(键值对为String - String) set k1 v1 get k1 getset k1 v1 - h ...

  4. JAVA大集合数据分批次进行切割处理

    今天遇到一个大集合里面的数据删除问题, 因为是一个大集合,如果同时传递到数据库,那么就会造成数据库压力 所以分批次的进行批量操作 其实 也可以采用多线程来处理或者多批次加多线程来处理都是可以的 下面的 ...

  5. Scala 运算符和集合转换操作示例

    Scala是数据挖掘算法领域最有力的编程语言之一,语言本身是面向函数,这也符合了数据挖掘算法的常用场景:在原始数据集上应用一系列的变换,语言本身也对集合操作提供了众多强大的函数,本文将以List类型为 ...

  6. java方式连接数据操作数据库

    package com.bdqn.dao.impl; import java.io.IOException;import java.io.InputStream;import java.io.Seri ...

  7. 用Jedis调用Lua脚本来完成redis的数据操作

    1.先完成一个简单的set/get操作 package com.example.HnadleTaskQueue; import redis.clients.jedis.Jedis; import ja ...

  8. Mysql数据操作《三》多表查询

    多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create table employ ...

  9. java基础集合简介Map(三)下

    --Map接口简介 今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢! 可 ...

随机推荐

  1. Number()和new Number()的区别以及一种简单实现

    看MDN Beginners文档的时候注意到了这种用法 var n1 = Number(123); , 冒出的第一个疑问就是和 var n2 = new Number(123); 有什么区别呢? 首先 ...

  2. .net core 1.0 中的asp.net identity 基本使用(二)

    一.重写(覆盖)身份验证数据类型 1.修改Models目录中的ApplicationUser.cs类文件,如下 namespace xxxx.Models { //将应用程序用户的属性添加到应用程序 ...

  3. git 文件状态与工作区域

    在上一篇简单讲述了文件状态与工作区域,在这里结合相关git命令详细了解文件的状态变更. 目录 1. 介绍 2. 常用命令 3. 实际操作 1. 介绍 git的文件状态是其git核心内容,了解后对后续的 ...

  4. Linux上常用软件安装和总结

    Linux总结: 以前只顾着撸码,Linux这些一般都是运维玩的,然后也没怎么折腾过,每次上线也都只是发布下,最多也就是启停服务器.最近闲来无事就玩了玩Linux,还挺好的. 这里做一个总结来结束Li ...

  5. 流API--流的基础知识

    流接口--BaseStream接口 流API定义了几个流接口,这些接口包含在java.util.stream中.BaseStream是基础接口,它定义了所有流都可以使用的基本功能.我们来看一下源码: ...

  6. Servlet--HttpServletRequest接口,HttpServletResponse接口

    HttpServletRequest接口 定义 public interface HttpServletRequest extends ServletRequest; 用来处理一个对 Servlet ...

  7. 通过编程为Outlook 2007添加邮件规则

    Outlook 所支持的邮件规则相当有用,我们经常需要针对某些特征的邮件做特殊的处理.例如将其移动到某个特定文件夹,或者删除它等等. Outlook所支持的邮件规则主要两大类:收到邮件时和发送邮件时 ...

  8. C#高性能大容量SOCKET并发(八):通讯协议

    协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能:一种是用Code加结构体,定义字节顺序,好处是性能 ...

  9. 【转】shell学习笔记(三)——引用变量、内部变量、条件测试、字符串比较、整数比较等

    1.env显示当前的环境变量 2.PS1='[\u@\h \w \A] \$' 可以设置bash的命令与提示符. 3.echo $$ 显示当前bash的PID号 4.echo $?显示上一条指令的回传 ...

  10. MonogoDB 练习一

    1.解析文件,仅处理 FIELDS 字典中作为键的字段,并返回清理后的值字典列表 需求: 1.根据 FIELDS 字典中的映射更改字典的键 2.删掉"rdf-schema#label&quo ...