Jedis 操作集合(Set)

Redis 的 Set(集合)是 string(字符串)类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。本文将介绍怎样通过 jedis 库操作 Redis 的 Set 数据类型。

添加成员

将一个或者多个成员添加到键的集合中,方法定义如下:

  • Long sadd(String key, String... members) 将指定的成员添加到存储在键的集合中。

示例:

// 写入一点数据
jedis.sadd("setKey", "value1", "value2");

// 获取数据
Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[value2, value1]

// 写入重复数据,value2 已经存在了
jedis.sadd("setKey", "value2", "value3");
memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[value3, value2, value1]

移除成员

从键的集合中删除一个或多个元素,方法定义如下:

  • Long srem(String key, String... members)  从存储在键的集合中删除指定的成员

示例:

// 准备点数据
jedis.sadd("setKey", "value1", "value2", "value3");

// 删除数据,一次删除两个
jedis.srem("setKey", "value1", "value3");

Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[value2]

扫描集合

扫描键存储集合中的成员,方法定义如下:

  • ScanResult<String> sscan(String key, String cursor) 使用默认参数和指定的游标扫描键存储的集合

  • ScanResult<String> sscan(String key, String cursor, ScanParams params) 使用指定参数和游标扫描键存储的集合

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 迭代集合中所有数据
ScanResult<String> result = jedis.sscan("setKey", "0");
System.out.println(Arrays.toString(result.getResult().toArray()));
// 结果:[v3, v2, v1, A1, A2]

// 匹配符合模式的元素
ScanParams params = new ScanParams();
params.match("v*"); // 匹配所有以 v 开头的元素
params.count(2); // 限制最大返回2个元素
result = jedis.sscan("setKey", "0", params);
System.out.println(Arrays.toString(result.getResult().toArray()));
// 结果:[v3, v2]
System.out.println("cursor=" + result.getCursor()); // 返回新的游标
// 结果:cursor=2

// 由于匹配了三个元素,分别为 v1、v2、v3,前面输出了两个,还有一个没有输出
// 于是,使用最新 result.getCursor() 游标来调用 sscan() 输出最后一个
result = jedis.sscan("setKey", result.getCursor(), params);
System.out.println(Arrays.toString(result.getResult().toArray()));
// 结果:[v1]

集合大小

计算键存储集合的大小,方法定义如下:

  • Long scard(String key) 返回键存储集合的大小,即成员数量

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 获取集合元素个数
long scard = jedis.scard("setKey");
System.out.println("scard=" + scard);
// 结果:scard=5

是否为成员

判断指定的成员是不是键存储集合中的成员,方法定义如下:

  • Boolean sismember(String key, String member)  如果成员是存储在键的集合的成员,则返回 true,否则返回 false。

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 判断 v2 是不是 setKey 的元素
boolean flag = jedis.sismember("setKey", "v2");
if(flag) {
   System.out.println("v2 是 setKey 的成员");
} else {
   System.out.println("v2 不是 setKey 的成员");
}
// 结果:v2 是 setKey 的成员

所有成员

获取键存储集合中的所有成员,方法定义如下:

  • Set<String> smembers(String key)  返回存储在键的集合中所有成员(元素)

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 获取 setKey 集合中所有的成员
Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v3, v2, A1, v1, A2]

移动成员

将键存储集合中的成员移动到其他集合中,方法定义如下:

  • Long smove(String srckey, String dstkey, String member)  将指定的成员从 srckey 处的集合移动到 dstkey 处的集合

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 将 setKey 中的元素 v2 移动到 target 集合
jedis.smove("setKey", "target", "v2");

Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[A1, v1, v3, A2]

memberSet = jedis.smembers("target");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v2]

随机返回且删除成员

随机从键存储的集合删除且返回一个或多个成员,方法定义如下:

  • String spop(String key) 从键存储的集合中删除且返回一个成员

  • Set<String> spop(String key, long count) 从键存储的集合中删除且返回多个成员

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 随机从 setKey 集合中删除一个元素,并返回元素
String value = jedis.spop("setKey");
System.out.println("value=" + value);
// 结果:value=v1

// 随机从 setKey 集合中删除多个元素,并返回元素
Set<String> values = jedis.spop("setKey", 2);
System.out.println(Arrays.toString(values.toArray()));
// 结果:[v3, A2]

Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v2, A1]

随机返回成员

随机从键存储的集合中返回一个成员,但是不删除该成员,方法定义如下:

  • String srandmember(String key)  从键存储的集合中随机返回一个元素,而不删除该元素。

  • List<String> srandmember(String key, int count)  从键存储的集合中随机返回多个元素,而不删除该元素。

示例:

// 准备点数据
jedis.sadd("setKey", "v1", "v2", "v3", "A1", "A2");

// 从 setKey 集合随机返回一个元素
String value = jedis.srandmember("setKey");
System.out.println("value=" + value);
// 结果:value=A1

// 从 setKey 集合随机返回2个元素
List<String> values = jedis.srandmember("setKey", 2);
System.out.println(Arrays.toString(values.toArray()));
// 结果:[v2, v3]

Set<String> memberSet = jedis.smembers("setKey");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[A1, v1, v2, v3, A2]

计算集合差异

用来计算两个、或多个集合的差异,方法定义如下:

  • Set<String> sdiff(String... keys) 返回存储在 key1 的集合与所有集合 key2、...、keyN 之间的差异

  • Long sdiffstore(String dstkey, String... keys) 此命令的工作方式与 SDIFF 完全相同,但结果集不是返回,而是存储在 dstkey 中。

示例:

// 准备点数据
jedis.sadd("setKey1", "v1", "v2", "A2");
jedis.sadd("setKey2", "v1", "A2");

// 获取 setKey1 与 setKey2 集合的差异
Set<String> diff = jedis.sdiff("setKey1", "setKey2");
System.out.println(Arrays.toString(diff.toArray()));
// 结果:[v2]

// 将集合的差异保存到目标集合
long size = jedis.sdiffstore("target", "setKey1", "setKey2");
System.out.println("size=" + size); // 结果:size=1

Set<String> memberSet = jedis.smembers("target");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v3, v2, A1, v1, A2]
// 结果:[v2]

计算集合交集

用来计算两个集合或多个集合之间的交集,方法定义如下:

  • Set<String> sinter(String... keys) 计算指定的所有集合的交集

  • Long sinterstore(String dstkey, String... keys) 计算指定的所有集合的交集,将结果存储到 dstkey 集合

示例:

// 准备点数据
jedis.sadd("setKey1", "v1", "v2", "A2");
jedis.sadd("setKey2", "v1", "A2");

// 获取 setKey1 与 setKey2 集合的交集
Set<String> inter = jedis.sinter("setKey1", "setKey2");
System.out.println(Arrays.toString(inter.toArray()));
// 结果:[v1, A2]

// 将集合的交集保存到目标集合
long size = jedis.sinterstore("target", "setKey1", "setKey2");
System.out.println("size=" + size); // 结果:size=2

Set<String> memberSet = jedis.smembers("target");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v1, A2]

计算集合并集

用来计算两个或多个集合之间的并集,方法定义如下:

  • Set<String> sunion(String... keys) 计算指定的所有集合的并集

  • Long sunionstore(String dstkey, String... keys) 将计算的所有集合的并集结果存储到 dstkey 集合中

示例:

// 准备点数据
jedis.sadd("setKey1", "v1", "v2", "A2");
jedis.sadd("setKey2", "v1", "A2");

// 获取 setKey1 与 setKey2 集合的并集
Set<String> union = jedis.sunion("setKey1", "setKey2");
System.out.println(Arrays.toString(union.toArray()));
// 结果:[v2, v1, A2]

// 将集合的并集保存到目标集合
long size = jedis.sunionstore("target", "setKey1", "setKey2");
System.out.println("size=" + size); // 结果:size=3

Set<String> memberSet = jedis.smembers("target");
System.out.println(Arrays.toString(memberSet.toArray()));
// 结果:[v2, v1, A2]
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号