Database/Redis

관계형 데이터 사용 in redis(feat. SORT)

최-코드 2024. 10. 7. 16:41

상황 : 기존의 관계형 데이터를 사용할 때는 예를 들어 좋아요 순을 위한 Sorted Set에 member에 따른 id값을 저장하고, 이 id값을 이용해 hash에 접근하여 데이터를 가져왔다. 즉, 항상 두 개의 개별적인 요청이 필요했다.

 

해결책 : SORT 명령어를 이용하면 하나의 요청으로 관계형 데이터를 사용할 수 있다. -> but 상황에 따라 해결책이 아닐 수 있음

 

SORT 

  • 이 명령어는 set, sorted set, list에서만 사용할 수 있다.
  • 정렬 목적으로도 사용될 수 있지만, 주 목적은 정렬이 아니다. 관계형 데이터의 데이터를 한 번에 가져오는 것이 주 목적이다.
  • 주의할 점으로는 Sorted Set에서 기본적인 SORT 명령어를 사용할 땐 score 기준이 아닌, member 기준으로 된다.
  • GET 옵션을 주지 않으면 set의 경우 member만을 출력하게 된다.
# 정렬할 user ID 목록 저장
LPUSH user:ids 1 2 3 4 5
# 각 사용자 점수 저장 (가상의 점수 데이터)
HSET user:1 score 90 name "Alice"
HSET user:2 score 70 name "Bob"
HSET user:3 score 85 name "Charlie"
HSET user:4 score 60 name "David"
HSET user:5 score 95 name "Eve"

 

SORT <key> 

  • <key>를 정렬해준다. 이 때 정렬이 되는 기준은 숫자이어야 한다.
  • 문자일 경우 정렬이 되도록 하려면 ALPHA 옵션을 붙여주면 된다.
  • LIMIT 옵션 또한 붙여줄 수 있다.
  • BY 옵션을 붙여주어서 정렬할 기준을 설정할 수 있다.
    • 이 때, 해쉬 타입과 연동하여 <prefix>:*->(key)와 같이 설정할 수 있다.
    • *에 들어가는 내용은 정렬 기준으로, set의 경우 member의 값이 하나하나 들어가게 된다.
    • 예를 들어 ex라는 member가 있을 때 prefix:ex 키의 (key)와 연결된 value값을 가져와 정렬을 진행한다.
    • 키워드로 BY nosort를 하면 정렬을 안하므로 더 빠르게 연산이 수행된다. 보통 sorted set은 정렬되어 있으므로 이 타입일 때 사용한다.
    • 추가적으로 ASC, DESC 키워드를 붙이면 정렬 순서를 변경할 수 있다.
    • ex) SORT user:ids BY user:*->score => 4 2 3 1 5
  • GET 옵션을 붙여주어서 출력할 내용을 정할 수 있다.
    • 이 옵션이 주어지면 GET에 설정된 것만 출력해준다.
    • 이거도 마찬가지로 해쉬 타입과 연동하여 <prefix>:*->(key)와 같이 설정할 수 있다. (key)와 연동된 value 값을 가져와서 출력해준다.
    • 여러 GET 옵션을 붙여주어서 여러 값을 출력할 수 있다. 이 때 들여쓰기가 추가되어야 한다. 아니면 서로 다른 명령어로 이해하게 된다.
    • 키워드로 GET #을 하면 member의 값도 출력해준다.
    • ex) SORT user:ids BY user:*->score GET user:*->name GET user:*->score => David 60 Bob 70 Charlie 85 Alice 90 Eve 95