개요
프로젝트 개발에서 사용하는 Redis에서 SET 타입의 Key에 1000개가 넘는 값을 저장하는 케이스가 있었다. 기능 개발 후 디버깅 중 해당 Key 내부의 값에 특정 값이 포함되는지 확인할 일이 생겼는데, Redis cli 자체적으로는 제공하지 않는 기능이라 리눅스 기능을 활용하여 해결했던 내용을 기록한다.
목적
우리는 이번 포스트에서 Redis 에 저장된 Key 중 ELECTION 이라는 Key에 저장된 값들 중 0103456이라는 값을 포함한 값들을 찾고, 만약 존재한다면 그중 특정 값을 삭제하고자 한다. 해당 목적을 기억하고 포스트를 읽으면 좀 더 도움이 될 것 같다.
Redis-cli 제공 기능
SMEMBERS 명령어
Redis 에서는 SET 타입의 Key에 어떤 value들이 있는지를 조회할 수 있는 SMEMBERS 명령어를 제공한다. 해당 명령어는 Redis cli에서 아래와 같이 사용 가능하다.
redis-cli> SMEMBERS [KEY]
여기서 조회할 KEY 이름을 ELECTION이라고 가정한다면, SMEMBERS ELECTION 와 같이 입력하면 아래와 같이 해당 SET 내부의 값들을 리스트로 쭉 조회할 수 있다.
Redis-cli 내부에서 PIPE(|) 활용
결과 값으로 위 사진처럼 모든 값들을 나열해 주기 때문에, 개수가 많은 경우 일일이 어떤 값이 있는지 육안으로 확인이 어렵다. 따라서 위 값들 중 0103456 이라는 값을 포함하는 값이 있는지 확인해 보려고 리눅스의 파이프를 사용해 보았지만 적용되지 않았다.
위처럼 지원하지 않는 형식이라는 리턴 값이 나오기 때문에 관련된 redis-cli 명령어가 있는지 찾아보았지만 SET의 값들 중 특정 문자열을 포함하는 값을 검색하는 기능은 제공되지 않았다.
Linux pipe 활용
해결 방법은 의외로 간단했다. 위에서 소개한 SMEMBERS 명령어를 redis-cli 내부에서 수행할 수도 있지만, 바깥(리눅스 쉘)에서 해당 명령어를 수행하며 인자로 넘겨주면 해당 리턴값을 반환한다. 따라서 리눅스에서 SMEMBERS를 통해 리스트를 조회하고 Pipe를 통해 필터링하면 원하는 목적을 달성할 수 있었다.
# 사용법
[redis-cli script 경로]/redis-cli -p [redis port] SMEMBERS [key] | grep [찾을 값]
# 실제 활용법
./redis-cli -p 6379 SMEMBERS ELECTION | grep "0103456"
위와 같이 리눅스 shell 에서 명령어를 수행하면 아래와 같이 ELECTION이라는 key에 0103456문자열을 포함하는 값들의 리스트를 조회할 수 있다.
Linux pipe 활용하여 찾은 값 삭제
위의 과정을 통해 특정 값이 있는지를 찾은 이유는 해당 값이 존재한다면 삭제하기 위함이었다. 위에서 조회된 값들 중 12084_01034561792라는 값을 삭제했어야 했는데 redis에서는 SET의 값을 삭제하기 위한 SREM명령어를 제공한다.
SREM [key] [value]
삭제할 값(12084_01034561792) 을 알았으니 위 명령어를 redis-cli에서 수행해도 되지만, 앞서 cli 외부에서 수행할 수 있는 방법을 활용했으니 동일하게 리눅스 shell에서 해당 명령어를 수행하여 삭제할 수 있었다.
# 사용법
[redis-cli script 경로]/redis-cli -p [redis port] SREM [key] [삭제할 값]
# 실제 활용법
./redis-cli -p 6379 SREM ELECTION "12084_01034561792"
위 명령어 수행 시 아래와 같이 삭제된 값의 개수를 리턴해주고 삭제가 완료되게 된다.
정리
이전까지 Redis 관련 작업을 할 때는 Redis-cli에서 기본적으로 제공하는 함수가 있는지부터 찾고 그것에 의존적으로 사용을 했었다. 하지만 리눅스 기능도 함께 활용한다면 Redis-cli 에서 직접적으로 제공하는 기능이 존재하지 않는다고 하더라도, 그것을 활용하여 원하는 목적을 달성할 수 있다.
앞으로도 Redis-cli 에서 제공하지 않는 기능이 있다면, 리눅스 Shell 의 기능과 조합하여 해결할 수 있는 방법을 찾는다면 대부분의 목적은 달성할 수 있을 것 같다.
'TIL' 카테고리의 다른 글
스프링부트 @ConfigurationProperties 매핑 오류(null) (2) | 2024.10.15 |
---|---|
Spring Boot에서 Multipart 파일 업로드 시 파일 크기 제한 오류(MaxUploadSizeExceededException ) (0) | 2024.09.30 |
[Java] Stream API의 효율적인 사용법과 주의할 점 (0) | 2024.09.25 |
[Java] BigDecimal을 이용한 정확한 소수 계산 (4) | 2024.09.22 |
자바 객체의 equals()와 hashCode() 오버라이드 시 주의할 점 (1) | 2024.09.22 |
댓글