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]