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. python简单词频统计

    任务 简单统计一个小说中哪些个汉字出现的频率最高 知识点 文件操作 字典 排序 lambda 代码 import codecs import matplotlib.pyplot as plt from ...

  2. ie、firefox、chrome中关于style="display:block" 引发的页面布局错乱的解决办法

    ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:b ...

  3. python操作mysql,增,删,改,查

    import MySQLdb conn = MySQLdb.connect(host='192.168.1.21',user='yangqw',passwd='1',db='free')cur = c ...

  4. string用法总结

    要想使用标准C++中的string类,必须要包含#include <string> 注意是<string>而不是<string.h>,带.h的是C语言中的头文件 s ...

  5. c++ singleton单例模式

    方法1:加锁的经典懒汉实现: class singleton { public: static pthread_mutex_t mutex; static singleton* initance(); ...

  6. awk打印第n个参数到最后一个技巧/将n行组成一列

    打印第n参数到最后一个参数 文本的NF不等,即字段长度不固定,想截取从$3到$NF 第一反应是使用循环 [root@localhost ~]# echo "1 2 3 4 5" | ...

  7. Node.js调用C#代码

    在Node.js的项目中假如我们想去调用已经用C#写的dll库该怎么办呢?在这种情况下Edge.js是一个不错的选择,Edge.js是一款在GitHub上开源的技术,它允许Node.js和.NET c ...

  8. CentOS 7 yum 安装 MySQL5.7

    1.下载 MySQL 官方的 Yum Repository ,官网地址:https://dev.mysql.com/downloads/repo/yum/ 从 MySQL 官网选取合适的 MySQL ...

  9. 一个最简单的cell按钮点击回调

    在cell.h定义 @property(nonatomic,strong)void(^pushType)(NSInteger); 在cell.m按钮点击时  _pushType(1):(举例)     ...

  10. MVVM之旅(1)创建一个最简单的MVVM程序

    这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...