Programming/Error

Redis 데이터 타입, (error) WRONGTYPE Operation against a key holding the wrong kind of value

Jan92 2023. 3. 5. 12:33

(error) WRONGTYPE Operation against a key holding the wrong kind of value

WRONGTYPE Operation against a key holding the wrong kind of value

다음은 Redis 사용 중에 볼 수 있는 오류로 내용처럼 잘못된 타입으로 인해 발생하는 오류인데요.

Redis에서 사용되는 데이터 타입과 각 타입 별 내용 및 데이터를 가져오는 명령어에 대해서 살펴보겠습니다.

 

type <key>

* Redis에서 데이터 타입을 확인하기 위해서는 위 type 명령어를 사용할 수 있습니다.

 

 


1. String

가장 기본적인 Redis 데이터 유형인 'String'입니다.

String 타입의 경우 텍스트, 직렬화된 객체 및 이진 배열을 포함한 바이트 시퀀스를 저장하며, Redis에서 사용되는 String type의 기본적인 크기는 최대 512MB입니다.

 

* 바이트(bytes) 시퀀스: 기계가 처리하는 문자의 형태로 문자를 표현하는 실제 바이트

 

> SET user:56 jan
OK
> GET user:56
"jan"

 

String 타입의 데이터를 가져오기 위해서는 'GET <key>' 형식의 명령어를 사용할 수 있습니다.

 

 


2. Lists

'Lists'는 삽입된 순서대로 정렬된 문자열 목록이며, 스택(stack)이나 큐(queue) 자료구조 구현에 주로 사용됩니다.

 

> LPUSH work:queue:idx 34
(integer) 1
> LPUSH work:queue:idx 56
(integer) 2
> RPOP work:queue:idx
"34"
> RPOP work:queue:idx
"56"

 

Lists 타입을 queue 형식으로 사용할 때는 'RPOP' 명령어를 통해 먼저 들어간 값이 먼저 나오며, stack 형식으로 사용할 때는 'LPOP' 명령어를 통해 나중에 들어간 값이 먼저 나오도록 할 수 있습니다.

 

Lists의 최대 길이는 2^32 -1 (4,294,967,295)입니다.

 

Lists 타입의 데이터를 가져오기 위해서는 'LRANGE <key> <start> <end>' 형식의 명령어를 사용할 수 있습니다.

 

 


3. Sets

'Sets'는 고유한 문자열의 정렬되지 않은 집합입니다. (같은 요소의 중복 저장을 허용하지 않으며, 요소의 저장 순서를 유지하지 않습니다.)

때문에 고유한 값을 찾는 데 주로 사용되는데요.

set 간의 연산을 지원하기 때문에 교집합, 합집합 및 차이(defferences) 같은 일반적인 집합 연산에도 사용됩니다.

 

> SADD user:56:like 35
(integer) 1
> SADD user:56:like 127
(integer) 1
> SADD user:56:like 144
(integer) 1

 

Sets 타입의 최대 길이는 Lists와 마찬가지로 2^32 -1 (4,294,967,295)입니다.

 

key에 대한 Sets 타입의 데이터 전체를 가져오기 위해서는 'SMEMBERS <key>' 명령어를 사용할 수 있습니다.

 

 


4. Hashes

'Hashes'는 필드(field)와 값(value)의 쌍으로 이뤄진 컬렉션으로 구성된 데이터 타입입니다.

쉽게 하나의 객체에 여러 개의 변수를 담을 수 있는 구조로 볼 수 있는데요.

 

user.name=jan
user.gender=man
user.nation=kor

다음과 같은 데이터가 있을 때 user가 key가 되고 name, gender, nation이 필드가 된다고 볼 수 있습니다.

 

> HSET user:56 username jan gender man nation kor
(integer) 3
> HGET user:56 username
"jan"
> HGETALL user:56
"username"
"jan"
"gender"
"man"
"nation"
"kor"

 

Hashes 데이터 타입은 'HGET or HMGET or HGETALL <key>' 형식의 명령어를 통해 단일 또는 전체 데이터를 가져올 수 있습니다.

 

 


5. Sorted sets (zset)

'Sorted sets'는 연관된 점수로 정렬된 고유한 문자열의 집합입니다. 둘 이상의 문자열이 동일한 점수를 갖는 경우에는 문자열 내림차순으로 정렬됩니다.

 

score(점수)를 기반으로 정렬되기 때문에 게임 등의 점수에 따라 데이터를 관리하는 곳에서 많이 사용됩니다.

 

> ZADD gamenumber:31 85 user:56
(integer) 1
> ZADD gamenumber:31 92 user:61
(integer) 1
> ZADD gamenumber:31 77 user:83
(integer) 1
> ZRANGE gamenumber:31 0 100
1) "user:61"
2) "user:56"
3) "user:83"

 

Sorted sets 타입의 경우 type 명령어로 타입을 조회했을 때 'zset'이라는 결과를 볼 수 있으며, 'ZRANGE or ZRANGEBYSCORE <key> <min> <max>' 명령어를 통해 데이터를 조회할 수 있습니다.

 

 


+. Stream, Geospatial indexes, Bitmaps, Bitfields, HyperLogLog

위 5가지 데이터 타입 외 다른 데이터 타입으로는 이벤트 발생에 대한 처리를 위한 'Stream', 지리적 데이터에 사용하기 적합한 'Geospatial indexes', 문자열에서 비트 연산을 수행하기 위한 'Bitmaps', 'Bitfields', 확률적 데이터 구조에 사용하기 위한 'HyperLogLog'가 있는데요.

 

해당 타입들에 대해 조금 더 자세한 내용이나, 전체 데이터 타입들에 대한 자세한 사용법에 대해서는 아래 Redis의 공식 문서를 참고하시면 좋을 것 같습니다.

 

 

 

< Redis 공식 문서 >

https://redis.io/docs/data-types/