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]