Redis值数据类型——set
4.4.1 概述
- 核心特性
- 元素唯一性
集合中的每个元素都是唯一的,不会重复存储。
- 无序性集
合中的元素没有固定顺序,无法通过下标定位元素。
- Set 与 List 类型对比
维度 | 集合类型(Set) | 列表类型(List) |
存储内容 | 至多 2^32−1 个字符串 | 至多 2^32−1 个字符串 |
有序性 | ❌ 无(元素无固定顺序) | ✅ 有(元素按插入顺序排列) |
唯一性 | ✅ 是(元素不可重复) | ❌ 否(元素可以重复) |
- 底层实现与性能
- 底层实现
使用值为空的散列表(hash table)实现。
- 性能特点
添加、删除、判断元素是否存在等操作的时间复杂度均为 O(1),效率极高。
- 常用操作
- 基础操作
向集合中添加 / 删除元素、判断元素是否存在。
- 集合运算
支持多个集合之间的交集、并集、差集计算,可用于实现共同关注、共同好友等业务场景。
4.4.2 命令
- 增加/删除元素
SADD key member [member ...] SREM key member [member ...]返回值为成功增加和删除的元素个数。
- 获得集合中的所有元素
SMEMBERS key- 判断元素是否在集合中
判断元素是否在集合中,无论集合中有多少元素都可以极速的返回结果。
返回值1为在,0不在。
SISMEMBER key member4.4.3 方法
- List类型核心操作
Redis 命令 | StringRedisTemplate 方法 | 返回值说明 |
sadd set a b c | opsForSet().add(setKey, "a", "b", "c") | Long 类型,成功新增的元素数量 |
srem set c d | opsForSet().remove(setKey, "c", "d") | Long 类型,成功删除的元素数量 |
smembers set | opsForSet().members(setKey) | Set 类型,集合所有元素 |
sismember set a | opsForSet().isMember(setKey, "a") | Boolean 类型,元素是否存在 |
- 总结
- add() 和 remove() 支持传入多个元素(用逗号分隔),直接对应 Redis 命令的 [member ...] 语法,无需循环单个操作。
- SpringBoot 中操作 Redis Set 类型的核心套路是 stringRedisTemplate.opsForSet().xxx();
- 代码
package com.qcby.springbootredis; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.StringRedisTemplate; import java.util.Set; @SpringBootTest public class SetTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test public void testSetBasicOperation() { // 定义 Set 集合的 key,和你的示例保持一致 String setKey = "set"; try { // ========== 1. 新增元素(对应 SADD 命令) ========== // 示例1:sadd set a b c Long addCount1 = stringRedisTemplate.opsForSet().add(setKey, "a", "b", "c"); System.out.println("sadd set a b c → 返回新增元素数:" + addCount1); // 输出 3 // 示例2:sadd set a(a已存在,无新增元素) Long addCount2 = stringRedisTemplate.opsForSet().add(setKey, "a"); System.out.println("sadd set a → 返回新增元素数:" + addCount2); // 输出 0 // ========== 2. 删除元素(对应 SREM 命令) ========== // 示例:srem set c d(c存在被删除,d不存在) Long removeCount = stringRedisTemplate.opsForSet().remove(setKey, "c", "d"); System.out.println("srem set c d → 返回删除元素数:" + removeCount); // 输出 1 // ========== 3. 获取集合中所有元素(对应 SMEMBERS 命令) ========== Set<String> allMembers = stringRedisTemplate.opsForSet().members(setKey); System.out.println("smembers set → 集合所有元素:" + allMembers); // 输出 [b,a](顺序可能不同,Set 无序) // ========== 4. 判断元素是否在集合中(对应 SISMEMBER 命令) ========== // 示例1:sismember set a(a存在) Boolean isMemberA = stringRedisTemplate.opsForSet().isMember(setKey, "a"); System.out.println("sismember set a → 是否存在:" + (isMemberA ? 1 : 0)); // 输出 1 // 示例2:sismember set h(h不存在) Boolean isMemberH = stringRedisTemplate.opsForSet().isMember(setKey, "h"); System.out.println("sismember set h → 是否存在:" + (isMemberH ? 1 : 0)); // 输出 0 } catch (Exception e) { e.printStackTrace(); } } }