본문 바로가기
RediS

레디스 데이터 구조 2 (해시 데이터, 셋 데이터)

by 타마마임팩트_쫀 2018. 3. 19.

해시 데이터

해시 데이터는 문자열 필드와 값으로 이루어진 맵(map)구조로 되어 있다.

해시 데이터는 232-1 개의 필드와 값을 저장한다.


그룹 데이터 저장

127.0.0.1:6379> hmset user1:info name gil-dong email david.kil@test.com age 21

OK

127.0.0.1:6379> hsetnx user1:info email foo@bar.com

(integer) 0

127.0.0.1:6379> hmset user1:info lastlogin 20150319 device android

OK

127.0.0.1:6379> hmget user1:info name email

1) "gil-dong"

2) "david.kil@test.com"

127.0.0.1:6379> hlen user1:info

(integer) 5

127.0.0.1:6379> hdel user1:info device

(integer) 1

127.0.0.1:6379> hlen user1:info

(integer) 4

hmset으로 유저1의 이름, 이메일, 나이를 저장.

hsetnx눈 주어진 키의 필드가 존재하는지 검사하고 저장한다. 이메일이 이미 등록되어 있어 0(실패) 반환.

hmset으로 유저1의 마지막 로그인 일자와 디바이스 정보를 저장.

hmget으로 유저1의 이름과 이메일 확인.

hlen은 해시 데이터의 저장된 필드 수를 조회.

hdel로 유저1의 디바이스 정보를 삭제.


해시에 저장된 데이터의 필드값이 숫자일 때 Hincrby, hincrbyfloat 명령으로 증감처리를 할 수 있다. 

문자열 데이터와는 다르게 해시 명령은 증가 명령만 지원한다. 

숫자의 감소를 처리하기 위해서는 인자에 음수를 입력하면 된다.

hincrbyfloat는 소수점 17자리로 고정.

127.0.0.1:6379> hmset kris:wizard life 1000 mana 1300

OK

127.0.0.1:6379> hincrby kris:wizard life -21

(integer) 979

127.0.0.1:6379> hincrby kris:wizard mana -30

(integer) 1270

127.0.0.1:6379> hincrby kris:wizard mana 25

(integer) 1295

127.0.0.1:6379> hincrbyfloat kris:wizard critical 12.5

"12.5"


해시 데이터에 저장된 모든 키의 목록과 값을 조회할 때는 hgetall을 사용하면 된다. 키의 목록이나 값의 목록만 조회하는 명령은 hkeys, hvals다.

127.0.0.1:6379> hgetall kris:wizard

1) "life"

2) "979"

3) "mana"

4) "1295"

5) "critical"

6) "12.5"

127.0.0.1:6379> hkeys kris:wizard

1) "life"

2) "mana"

3) "critical"

127.0.0.1:6379> hvals kris:wizard

1) "979"

2) "1295"

3) "12.5"


셋 데이터

셋 데이터는 중복을 혀용하지 않는 집합 형태의 자료구조이며, 정렬되어 있지 않다.

셋 데이터는 232-1 개의 값을 저장할 수 있다.

값이 저장될 때 중복에 대한 확인이 일어나므로 NX접미사의 명령이 필요하지 않다.

셋 데이터는 집합 연산(합집합, 교집합, 차집합)이 가능하다.

셋 데이터의 집합 연산은 명령의 수행 비용이 매우 비싸다. (사용하지 마라.)

127.0.0.1:6379> sadd user:1:follows 2

(integer) 1

127.0.0.1:6379> sadd user:2:followers 1

(integer) 1

127.0.0.1:6379> sadd user:3:follows 1

(integer) 1

127.0.0.1:6379> sadd user:1:followers 3

(integer) 1

127.0.0.1:6379> sadd user:1:follows 3

(integer) 1

127.0.0.1:6379> sadd user:3:followers 1

(integer) 1

127.0.0.1:6379> sadd user:2:follows 3

(integer) 1

127.0.0.1:6379> sadd user:3:follower 2

(integer) 1

127.0.0.1:6379> sinter user:1:follows user:1:followers

1) "3"

서로 팔로잉 하고 있는 사용자를 구하는 예이다.

sinter 명령으로 유저1의 팔로우 정보와 팔로워의 교집합(서로 팔로잉 하는 사용자)을 구한다.


셋 테이터의 다양한 조회 명령

127.0.0.1:6379> sadd user:1:friends Scott Sean Simon Hal Hank

(integer) 5

127.0.0.1:6379> sadd user:1:friends Uriah Jack Jake James Jason

(integer) 5

127.0.0.1:6379> sadd user:1:friends Justin Van Vernon Victor Vincent

(integer) 5

127.0.0.1:6379> scard user:1:friends

(integer) 15

127.0.0.1:6379> srem user:1:friends Justin

(integer) 1

127.0.0.1:6379> spop user:1:friends

"Sean"

127.0.0.1:6379> scard user:1:friends

(integer) 13

127.0.0.1:6379> sismember user:1:friends Scott

(integer) 1

127.0.0.1:6379> smove user:1:friends test:set scott

(integer) 0

127.0.0.1:6379> smembers user:1:friends

 1) "Simon"

 2) "Van"

 3) "Vernon"

 4) "Hank"

 5) "James"

 6) "Victor"

 7) "Uriah"

 8) "Hal"

 9) "Jason"

10) "Vincent"

11) "Jack"

12) "Jake"

13) "Scott"

127.0.0.1:6379> smove user:1:friends test:set Scott

(integer) 1

127.0.0.1:6379> smembers user:1:friends

 1) "Simon"

 2) "Van"

 3) "Vernon"

 4) "Hank"

 5) "James"

 6) "Victor"

 7) "Uriah"

 8) "Hal"

 9) "Jason"

10) "Vincent"

11) "Jack"

12) "Jake"

scard 명령은 'cardinality'의 약자로 주어진 키에 저장된 원소 개수를 조회한다.

srem로 유저1의 친구 중 Justin을 제거한다.

spop은 친구 중 임의의 값을 제거 한다. Sean이 삭제 됨.(반환 값이 삭제된 대상)

sismember로 친구 중 Scott이 있는지 확인.

smove로 유저1의 친구 중 scott을 다른 셋 데이터를 생성하고 이동 시키려 했으나 대소문자를 잘못 입력하여 실패.

다시 시도 하여 Scott을 이동 시켰다.


'RediS' 카테고리의 다른 글

레디스 데이터 구조1 (문자열 데이터, 비트연산)  (0) 2018.03.16