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. Django将request对象传入模板配置

    对于很多时候,需要从模板中获取很请求中很多内容,比如当前请求的url,当前的session变量中的某个值,这时候我们可以通过配置可将request对象传递进模板. django1.10版本: sett ...

  2. poweshell批量删除某类型文件

    错误方法 rm *.o" -recurse 按照提示,rm(remove-item)是可以递归删除子文件夹的.但是这个方法确实无效.在他们的示例里面找到说明: --------------- ...

  3. python3 第九章 - 数据类型之Number(数字)

    Python 支持三种不同的数字类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点.Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 ...

  4. python_如何对实例属性进行类型检查?

    案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查 p = Person() p.name = 'xi_xi'         # 必须是str p.age = ...

  5. java精确运算

    public class ArithUtil { /** * 加法 * @param * @return double * @throws Exception * @author zhangyn * ...

  6. Django----模板层

    一.模板层:           python的模板:HTML代码+模板语法      模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. import datetime t=dateti ...

  7. jquery中ajax跨域提交的时候会有2次请求

    我们平时在同域中请求页面什么的时候不会有这种情况,这种情况大多发生在移动端的跨域请求中发生的. 解决方法就是在服务端中加一层过滤HTTP请求的类型,把OPTION等不用的类型过滤掉.就是当请求为非 H ...

  8. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli  提取密码 dz7j 二.定义 ...

  9. CDlinux制作U盘启动盘,打造自己的口袋系统

    工具: 1.8G或以上U盘一枚: 2.CDlinux0.9.7.1镜像文件,注意其他版本不一定能成功(传送门http://pan.baidu.com/s/1o7P6Gu2): 3.UltraISO或U ...

  10. canvas绘制时钟及注释及save和restore的用法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...