Redis Set

Set是Redis中的数据类型,与Redis的Zset有所区分:

Set中文描述为“无序集合” 特点是:

  1. 集合中的元素是无序的
  2. 集合中的元素不能重复,是唯一的

与ZSet相比缺少了分数(point),所以无法排序。

新增数据

使用add() 方法批量增加数据。

redisTemplate.opsForSet().add("ranks", personalRecord1, personalRecord2);

既然是操作 Set,那么方法自然是 opsForSet() ,每种数据类型都有自己的操作方法。

add() 方法第一个参数是 Key;后面就是 Java 实例对象。

删除数据操作

使用 remove() 方法删除一个数据元素:

redisTemplate.opsForSet().remove("ranks", personalRecord);

remove() 方法第一个参数是 Key;第二个参数是待删除的数据对象。删除与添加是对应的,添加的是自定义对象,删除的时候也要传入相同的自定义对象。(先查询再删除)

千万不要理解为,添加的是 personalRecord 实例对象,然后用 personalRecordId 删除。不能跟 MySQL 混淆了。

修改数据操作

不存在修改这个说法。或者说,修改等同于:先删除旧数据,再加入新数据

基本查询

查询方法不是常见的 getXX 而是 members() :

Set<PersonalRecord> datas = redisTemplate.opsForSet().members("ranks");

通过 Key 查询集合中的所有数据元素。返回值的泛型,就是新增数据的类型,往 Set 缓存里放了什么数据,拿出来就是什么数据。

多集合操作

使用 Set 一般来说并不是用于数据对象的缓存,因为无序,实际上操作很不方便,不能像列表一样精确查询。

使用 Set 多用于集合间的操作。所以,推荐 Set 存储简单的数据,比如 Java 的字符串或数字,而不要在 Set 中存入复杂的 Java 自定义对象。

比如只存入个人战绩的 id 值而不是整个对象。

多集合的操作主要有:

求并集

给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集。大家应该学习过并集的概念。

union() 方法用于求多个集合的并集:

List<String> keys = new ArrayList<>();
keys.add("ranks1");
keys.add("ranks2");
keys.add("ranks3");
Set<Long> unionDatas = redisTemplate.opsForSet().union(keys);

求交集

集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集

intersect() 方法用于求多个集合的交集:

List<String> keys = new ArrayList<>();
keys.add("ranks1");
keys.add("ranks2");
keys.add("ranks3");
Set<Long> interDatas = redisTemplate.opsForSet().intersect(keys);

intersect() 方法返回给定所有给定集合的交集。

不存在的集合 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

求差集

设A,B是两个集合,以属于A而不属于B的元素为元素的集合成为A与B的差集

difference() 方法用于求一个集合与其它集合的差集:

List<String> otherkeys = new ArrayList<>();
otherkeys.add("ranks2");
otherkeys.add("ranks3");
Set<Long> diffDatas = redisTemplate.opsForSet().difference("ranks1", otherkeys);

difference() 方法返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。