(Redis) 레디스 데이터 구조와 명령어 사용

1. 문자열 데이터

문자열 데이터는 키 하나에 문자열 하나를 저장할 수 있다. 저장 가능한 문자열의 크기는 최대 512MB이다.
레디스가 문자열 데이터를 저장할 때는 인코딩된 문자열과 몇 가지 부가 정보가 포함된 구조체로 변환하여 저장하며 이것을 레디스객체형이라 부른다.

1.1 문자열 데이터의 입력과 조회

레디스는 동시에 여러 키와 데이터를 저장하고 조회하는 mget, mset명령을 제공한다

-> mget 명령어를 통해 key54의 정보를 받아오려 했지만 데이터가 존재하지 않아 nil을 추력했다.

만약 3개의 키를 저장하려 할때, 그중 하나라도 이미 존재한다면 모두를 저장하지 않는 상황을 고려해보자. 어떻게 해야 할까?

3개의 키에 대하여 mget으로 데이터를 조회한뒤 mset으로 저장하는 방법을 생각할수 있다.
그러나 레디스는 이미 이러한 상황을 처리할 수 있는 명령어를 제공한다.

1) msetnx

mset명령과 동일하게 키와 값의 쌍으로 이루어진 데이터를 저장하는데, 차이점은 키와 값의 쌍을 다중으로 입력하는 것이다. msetnx명령은 인자로 N개의 키와 값의 쌍을 요청했을 때 이미 존재하는 값이 하나라도 있다면 입력된 모든 키와 값은 저장하지 않는다.

-> 이전에 수행된 mset 명령으로 nx:key3가 생성되었기 때문에 setnx 명령으로 nx:key3 키의 값이 저장되지 않았다.
비록 nx:key2가 아직 존재하지 않지만 nx:key3 키가 이미 존재하므로 전체 키가 저장되지 않았다.

2) getset

getset 명령은 입력된 값을 저장하고 이전에 저장된 값을 돌려준다.

-> getset 명령어로 이전에 저장된 'old value'의 값을 돌려주고 입력하는 값인 'new value'를 저장한다. 아직 존재하지 않는 newkey를 입력하면 이전에 저장된 값이 없으므로 nil을 돌려준다.


-------------------------------------------------------------------------------------------------

<숫자의 증가와 감소>

1) incrby, decrby

* incrby 명령은 주어진 키에 저장된 숫자를 주어진 값만큼 증가시킨다.
* decrby 명령은 주어진 키에 저장된 숫자를 주어진 값만큼 감소시킨다.


-> 처음 incr 명령이 실행된 후의 값이 1인데 키가 존재하지 않을 경우 자동으로 키를 생성하고 값을 증가시켰다.
 incrby 명령은 마지막 인자의 값만큼 증가시키는데 음수가 입력되었으므로 값의 감소가 이루어졌다.
 decrby 명령의 마지막 인자로 입력된 양수 기호(+)는 아무의미가 없다. 즉, 저장된 값이 인자로 주어진 값만큼 감소하게 된다.
 decryby 명령의 인자로 음수가 입력되었을 때는 음수의 뺼셈 처리가 되어 값이 증가된다.

*숫자의 증감처리에는 최댓값과 최솟값의 제한이 있다.
-> 레디스는 내부적으로 시스템 종속적인 정수형을 가지지 않기 때문에 처리결과는 32비트와 64비트 인스턴스에 관계없이 동일하다.

2) 비트연산

2.1 setbit

입력된 오프셋 위치에 저장된 bit값을 변경한다. setbit 명령의 응답은 setbit명령 수행 이전에 저장된 값이다.

2.2 getbit

setbit 명령과 반대되는 개념으로 입력된 오프셋 위치에 저장된 bit 값을 조회한다.

2.3 strlen

strlen 명령은 주어진 키에 저장된 문자열의 길이를 조회한다. 만약 주어진 키가 존재하지 않으면 0을 돌려준다. strlen 명령은 저장된 데이터의 크기에 상관없이 항상 동일한 응답 시간을 제공하는 특별한 성질을 지닌다.

2.4 bitcount

주어진 키 값의 비트 중 1인 값의 개수를 조회한다. 인덱스 범위는 바이트 단위 인덱스다.




* 그렇다면 비트연산은 어디에 써야 하는 걸까?


예를들어, '사용자가 오늘 로그인하였는지 확인하는 기능'은 어떨까? 관계형 데이터베이스를 사용하여 구현한다면 각 사용자 레코드에 마지막 로그인 일자 필드를 추가하고 사용자가 로그인 할 때마다 해당 필드를 업데이트 하거나, 별도의 로그인 이력 테이블을 만들어서 로그인할 때마다 새로운 레코드를 추가하여 당일 로그인 여부를 확인할 것이다. 
문자열의 각 비트를  on/off스위치로 생각해보자 사용자의 아이디를 숫자로 바꾸어 비트연산의 오프셋값과 대응시키자. 사용자가 로그인을 하면 사용자의 아이디에 해당하는 오프셋의 스위치를 on으로 바꾼다. 

1. 사용자가 로그인 요청을 한다. 
2. 오늘 날짜의 로그인 키를 만든다. ex) login: 20130317
3. 사용자 번호에 해당하는 오프셋에 로그인 상태를 표시하기 위해서 비트를 1로바꾼다.
4. 오늘 로그인한 사용자의 수를 확인한다.


* 주의할 점은 bitcount명령으로 1,000번째 비트부터 2,000번째 비트까지의 비트를 세는 명령을 만들어보자. "bitcount some:key 1000 2000"과 같은 명령을 만들게 될텐데, 이 명령은 원하는 대로 동작하지 않는다. 이 명령은 some:key 키에 저장된 값의 1000번째 바이트부터 2000번째 바이트까지의 비트개수를 조회한다.
레디스 명령에서는 저장된 값의 비트 범위를 조회하는 명령이 없다.


댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기