java-redis集合数据操作示例(三)
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集合数据操作示例(三)的更多相关文章
- redis之数据操作详解
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- java-redis列表数据操作示例(二)
接上篇博文<java-redis字符类数据操作示例(一)>,redis连接管理类的代码请跳转查看. 一.列表类型缓存测试类 public class ListTest { /** * 主测 ...
- redis常见数据操作
redis中有5种常见的数据类型,针对这5种数据类型有着相应的数据操作. 1.String(键值对为String - String) set k1 v1 get k1 getset k1 v1 - h ...
- JAVA大集合数据分批次进行切割处理
今天遇到一个大集合里面的数据删除问题, 因为是一个大集合,如果同时传递到数据库,那么就会造成数据库压力 所以分批次的进行批量操作 其实 也可以采用多线程来处理或者多批次加多线程来处理都是可以的 下面的 ...
- Scala 运算符和集合转换操作示例
Scala是数据挖掘算法领域最有力的编程语言之一,语言本身是面向函数,这也符合了数据挖掘算法的常用场景:在原始数据集上应用一系列的变换,语言本身也对集合操作提供了众多强大的函数,本文将以List类型为 ...
- java方式连接数据操作数据库
package com.bdqn.dao.impl; import java.io.IOException;import java.io.InputStream;import java.io.Seri ...
- 用Jedis调用Lua脚本来完成redis的数据操作
1.先完成一个简单的set/get操作 package com.example.HnadleTaskQueue; import redis.clients.jedis.Jedis; import ja ...
- Mysql数据操作《三》多表查询
多表连接查询 复合条件连接查询 子查询 准备表 #建表 create table department( id int, name varchar(20) ); create table employ ...
- java基础集合简介Map(三)下
--Map接口简介 今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢! 可 ...
随机推荐
- PHP 环境搭建及zabbix安装遇到的一些坑.
参考https://segmentfault.com/a/1190000003409708 进行php环境搭建. 下载 php5 http://windows.php.net/download 下载 ...
- oracle04_plsql
PLSQL:Procedural Language SQL (1) plsql的基本结构(a) declare id constant number(2):=2;--常量定义 name varchar ...
- 安装新的int 9中断例程2
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- junit忽略测试方法
JUnit 提供注解 org.junit.Ignore 用于暂时忽略某个测试方法或者说整个类.因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行. 1,方法级别上使用@ignore来注释 ...
- CURL模拟post请求上传文件
贴一段醍醐灌顶的话: 逻辑很简单,设置POST变量$post_data,其中upload指向需要发送的文件.这里要注意,我们之前使用POST都是发送一个字符串,然后在服务器端使用file_get_co ...
- 5分钟编写运行一个RChain合约
今天介绍如何编写和测试一个RChain智能合约,Rholang的语法介绍在https://developer.rchain.coop/tutorial 1.安装docker 这个自己百度一下,安装都是 ...
- [DeeplearningAI笔记]ML strategy_1_2开发测试集评价指标
机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.4 满足和优化指标 Stisficing and optimizing metrics 有时候把你要考 ...
- [DeeplearningAI笔记]神经网络与深度学习4.深度神经网络
觉得有用的话,欢迎一起讨论相互学习~Follow Me 4.2 深层神经网络中的前向传播 4.3 核对矩阵的维数 经验方法论 对于神经网络想增加得到没有bug的程序的概率的方法:需要仔细的思考矩阵的维 ...
- Django的CBV和FBV
一.FBV FBV(function base views) 就是在视图里使用函数处理请求,也是我们最开始接触和使用的方式,普通项目中最常见的方式. urls.py 1 2 3 4 urlpatter ...
- 洛谷 [P2774] 方格取数问题
二分图最大点权独立集 通过题目描述我们可以很明显的看出要通过二分图建模,二分图求最大独立点集很容易,就是建立二分图求n-最小割,然而这里加入了权值,而且权值是在点上的,那么我们对于每个点连一条到源点或 ...