레디스에서 hsah는 필드 - 값 쌍을 가진 아이템의 집합이다. 레디스에서 데이터가 key-value 쌍으로 저장되는 것처럼, 하나의 hash 자료 구조 내에서 아이템은 필드-값 쌍으로 저장된다. 필드는 하나의 hash 내에서 유일하며, 필드와 값 모두 문자열 데이터로 저장된다.
Redis 활용예제 - 이벤트 아이템 뽑기
위의 사진처럼 이벤트형 뽑기를 본적이 많을 것이다. 이러한 뽑기 기능을 관계형 데이터베이스에서 구현하려면 어떻게 해야할까?
아마 최소 두개의 테이블이 필요할 것이다. item 정보를 담고있는 item 테이블과 이벤트성 아이템을 저장하는 event 테이블이다.
유저가 아이템 뽑기를 진행하면 event 테이블에서 item 테이블과 join해 데이터를 가져와야 한다. 실제 서비스를 하다보면 더 복잡해 질수도 있는 구조에 100번 뽑기를 진행한다면 데이터베이스에 100번 접속해야 하는것이다.
그렇다면 Redis Hash 를 사용하여에 먼저 정보를 저장해 보자
이벤트 기간동안 많이 조회 될 예정인 아이템들을 미리 캐시해두고 대비한다면 데이터베이스 과부하를 줄일 수 있지 않을까.
HSET item:1 Name 목장갑
HSET item:1 Ability 10
HSET item:2 Name 키보드
HSET item:2 Ability 999
SADD event:item item:1 item:2 item:3 ...
랜덤아이템 추출
SRANDMEMBER event:item 1 //랜던으로 하나만 출력하기
item:4
//랜덤으로 두개 출력하기
SRANDMEMBER event:item 2
item:1
item:3
//랜덤으로 중복 허용하기
SRANDMEMBER event:item -2
item:2
item:2
이렇게 랜덤으로 뽑은 아이템 아이디를 가지고 아이템 정보를 가지고 온다면 요청이 많이 발생하는 이벤트 상품이라도 데이터베이스 과부하를 줄일 수 있다.
추가 랜덤 레디스 추출
//Redis Hash 필드 랜덤 뽑기
HRANDFIELD
//sorted set 랜덤 뽑기
ZRANDMEMBER