Redis set type
✒️ 2026-07-01 23:06 내용 수정
실습 참고 자료
- 인프런의 lettuce를 이용하여 redis 다루어 보기(저자: 신현호) 강의 내용을 참고하여 진행하였다.
- Set은 Set 인터페이스 등을 참고.
- 순서를 보장하지 않으며 중복 데이터를 허용하지 않는 자료구조다.
sadd 메서드
- key에 저장된 set에 멤버를 새로 추가한다.
- set은 중복 데이터를 허용하지 않기 때문에 이미 set에 동일한 멤버가 존재하면 명령은 무시된다.
- key가 존재하지 않으면 멤버를 set에 등록하기 전에 새로운 set을 생성한다.
package myproject.redis.lettuce.set;
import io.github.crewhub.redis.lettuce.CommandAction;
import io.github.crewhub.redis.lettuce.CommandTemplate;
import org.junit.jupiter.api.Test;
import java.util.Set;
public class RedisLettuceSet {
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
};
CommandTemplate.commandAction(action);
}
}
smembers 메서드
- key에 저장된 set의 모든 멤버를 조회한다.
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
// smembers : 추가된 데이터 조회
Set<String> setMembers = redisCommands.smembers(key);
System.out.println(key + " = " + setMembers);
};
CommandTemplate.commandAction(action);
}

scard 메서드
- key에 저장된 set의 멤버 수를 반환한다.
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
// smembers : 추가된 데이터 조회
Set<String> setMembers = redisCommands.smembers(key);
System.out.println(key + " = " + setMembers);
// scard : 저장된 데이터 수 조회
Long scardResult = redisCommands.scard(key);
System.out.println("scardResult = " + scardResult);
};
CommandTemplate.commandAction(action);
}

srem 메서드
- key에 저장된 set의 멤버를 제거한다.
- 만약 key가 존재하지 않으면 빈 set으로 간주하여 0을 반환한다.
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
// smembers : 추가된 데이터 조회
Set<String> setMembers = redisCommands.smembers(key);
System.out.println(key + " = " + setMembers);
// scard : 저장된 데이터 수 조회
Long scardResult = redisCommands.scard(key);
System.out.println("scardResult = " + scardResult);
// srem : Set의 멤버 제거
redisCommands.srem(key, "1", "2");
System.out.println(key + " = " + redisCommands.smembers(key));
};
CommandTemplate.commandAction(action);
}

sismember 메서드
- 멤버가 key에 저장된 set의 멤버인지 확인하여 Boolean 타입을 반환한다.
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
// smembers : 추가된 데이터 조회
Set<String> setMembers = redisCommands.smembers(key);
System.out.println(key + " = " + setMembers);
// scard : 저장된 데이터 수 조회
Long scardResult = redisCommands.scard(key);
System.out.println("scardResult = " + scardResult);
// srem : Set의 멤버 제거
redisCommands.srem(key, "1", "2");
System.out.println(key + " = " + redisCommands.smembers(key));
// sismember : set의 멤버 조회
Boolean sismember = redisCommands.sismember(key, "3");
System.out.println("sismember = " + sismember);
};
CommandTemplate.commandAction(action);
}

smove 메서드
- 한 set에서 다른 set으로 멤버를 이동한다.
- 원자성 동작이다.
- 원본 set이 존재하지 않거나 해당 멤버가 원본 set에 없을 경우엔 동작을 수행하지 않고 0을 반환한다.
- 동작이 수행되면 원본 set에선 해당 멤버를 제거하고 타겟 set에 해당 멤버가 추가된다.
- 이미 타겟 set에 동일한 멤버가 존재한다면 원본 set에서 해당 멤버만 제거한다.
@Test
public void setBasic() {
CommandAction action = redisCommands -> {
String key = "lettuce:set";
// sadd : 데이터 추가
redisCommands.sadd(key, "1", "2", "3");
redisCommands.sadd(key, "3", "4", "5");
redisCommands.sadd(key, "5", "6", "7");
// smembers : 추가된 데이터 조회
Set<String> setMembers = redisCommands.smembers(key);
System.out.println(key + " = " + setMembers);
// scard : 저장된 데이터 수 조회
Long scardResult = redisCommands.scard(key);
System.out.println("scardResult = " + scardResult);
// srem : Set의 멤버 제거
redisCommands.srem(key, "1", "2");
System.out.println(key + " = " + redisCommands.smembers(key));
// sismember : set의 멤버 조회
Boolean sismember = redisCommands.sismember(key, "3");
System.out.println("sismember = " + sismember);
// smove : 특정 멤버를 다른 key로 이동
// 목적지에 key가 없으면 새로운 key를 생성하며 멤버 등록
String newKey = "lettuce:set_new";
redisCommands.smove(key, newKey, "3");
System.out.println(key + " = " + redisCommands.smembers(key));
System.out.println(newKey + " = " + redisCommands.smembers(newKey));
};
CommandTemplate.commandAction(action);
}

집합 연산
- Set의 교집합, 합집합, 차집합 연산은 각각
sinter,sunion,sdiff메서드로 수행할 수 있다.
package myproject.redis.lettuce.set;
import io.github.crewhub.redis.lettuce.CommandAction;
import io.github.crewhub.redis.lettuce.CommandTemplate;
import org.junit.jupiter.api.Test;
import java.util.Set;
public class RedisLettuceSinter {
String mainKey = "lettuce:set:";
String shinKey = "shin";
String jungKey = "jung";
String gangKey = "gang";
@Test
public void setAdvanced() {
CommandAction action = redisCommands -> {
// 멤버 저장
// sadd
redisCommands.sadd(shinKey, "1", "2", "3", "5");
redisCommands.sadd(jungKey, "3", "4", "5", "6");
redisCommands.sadd(gangKey, "4", "5", "7");
// smembers
System.out.println(shinKey + " = " +redisCommands.smembers(shinKey));
System.out.println(jungKey + " = " +redisCommands.smembers(jungKey));
System.out.println(gangKey + " = " +redisCommands.smembers(gangKey));
};
CommandTemplate.commandAction(action);
}
}
교집합 sinter
- key에 저장된 set들의 교집합 결과를 반환한다.
@Test
public void setAdvanced() {
CommandAction action = redisCommands -> {
// 멤버 저장
// sadd
redisCommands.sadd(shinKey, "1", "2", "3", "5");
redisCommands.sadd(jungKey, "3", "4", "5", "6");
redisCommands.sadd(gangKey, "4", "5", "7");
// smembers
System.out.println(shinKey + " = " +redisCommands.smembers(shinKey));
System.out.println(jungKey + " = " +redisCommands.smembers(jungKey));
System.out.println(gangKey + " = " +redisCommands.smembers(gangKey));
// sinter : 교집합
Set<String> sinter = redisCommands.sinter(shinKey, jungKey, gangKey);
System.out.println("sinter = " + sinter);
};
CommandTemplate.commandAction(action);
}
합집합 sunion
- key에 저장된 set들의 합집합 결과를 반환한다.
@Test
public void setAdvanced() {
CommandAction action = redisCommands -> {
// 멤버 저장
// sadd
redisCommands.sadd(shinKey, "1", "2", "3", "5");
redisCommands.sadd(jungKey, "3", "4", "5", "6");
redisCommands.sadd(gangKey, "4", "5", "7");
// smembers
System.out.println(shinKey + " = " +redisCommands.smembers(shinKey));
System.out.println(jungKey + " = " +redisCommands.smembers(jungKey));
System.out.println(gangKey + " = " +redisCommands.smembers(gangKey));
// sinter : 교집합
Set<String> sinter = redisCommands.sinter(shinKey, jungKey, gangKey);
System.out.println("sinter = " + sinter);
// sunion : 합집합
Set<String> sunion = redisCommands.sunion(shinKey, jungKey, gangKey);
System.out.println("sunion = " + sunion);
};
CommandTemplate.commandAction(action);
}
차집합 sdiff
- 첫 번째 key에 저장된 set와 그 이후에 전달한 set와의 차집합 결과를 반환한다.
@Test
public void setAdvanced() {
CommandAction action = redisCommands -> {
// 멤버 저장
// sadd
redisCommands.sadd(shinKey, "1", "2", "3", "5");
redisCommands.sadd(jungKey, "3", "4", "5", "6");
redisCommands.sadd(gangKey, "4", "5", "7");
// smembers
System.out.println(shinKey + " = " +redisCommands.smembers(shinKey));
System.out.println(jungKey + " = " +redisCommands.smembers(jungKey));
System.out.println(gangKey + " = " +redisCommands.smembers(gangKey));
// sinter : 교집합
Set<String> sinter = redisCommands.sinter(shinKey, jungKey, gangKey);
System.out.println("sinter = " + sinter);
// sunion : 합집합
Set<String> sunion = redisCommands.sunion(shinKey, jungKey, gangKey);
System.out.println("sunion = " + sunion);
// sdiff : 차집합
// 첫 키에서 다른 키의 항목을 제외한 멤버 목록을 반환
Set<String> sdiff = redisCommands.sdiff(shinKey, jungKey, gangKey);
System.out.println("sdiff = " + sdiff);
};
CommandTemplate.commandAction(action);
}
