(2)

안녕하세요, 케이치입니다.


지난 레디스 데이타 타입 포스팅을 보셨다면 아시겠지만 레디스는 기본적으로 다섯 가지의 데이타 타입을 지원합니다.


이번 포스팅에서는 레디스 데이타 타입 별 명령어 목록 및 기능 제 1편으로 스트링 타입에 대한 설명을 하려합니다.


Redis Strings

레디스 스트링 타입은 제일 기본적인 타입입니다. Memcached의 유일한 데이터 타입인 스트링을 지원하기 때문에 레디스를 새로 배우는 사람들에게도 어렵지 않죠. 뭐 스트링은 모든 프로그래밍 언어에서 제공하는 개발자들이 가장 많이 사용하는 타입 중에 하나니까요.

레디스의 키가 바로 스트링이기 때문에 값을 스트링 타입으로 저장한다는 것은 하나의 스트링을 또다른 스트링에 매핑한다는 의미입니다. 스트링 데이타 타입은 정말 많은 용도로 사용될 수 있습니다. 예를들어 HTML 일부나 페이지 전체를 캐싱할 수도 있죠.

스트링 타입을 다루는 예제를 한번 보면서 더 알아보도록 하죠. 

레디스 프롬프트 창에서 아래처럼 입력해보세요.

> set mykey somevalue
OK
> get mykey
"somevalue"

위 예제는 SET 명령어를 이용하여 mykey라는 키에 somevalue라는 값을 매핑시킵니다.  여기서 중요한 점은 SET 명령어는  동일한 키가 이미 존재한다면 그 키에 해당하는 값을 덮어쓴다는 것입니다. 그 값이 어떤 타입이냐는 상관없이 무조건 덮어쓰니 주의하시기 바랍니다. 다시말하면 SET 명령어는 자바 프로그래밍의 = 과 같이 특정 키에 특정 값을 할당해주는 기능을 합니다.

키에 할당할 수 있는 값은 어떠한 스트링이라도 가능합니다. 바이너리 데이타 역시 가능하죠. JPEG 이미지의 바이너리 데이타도 저장이 가능합니다. 하지만 여기서 또 중요한 점이 있습니다. 어떤 값이든 그 크기가 512MB를 넘을 수는 없다는 것이죠.

SET 명령어에 옵션을 줄 수도 있습니다. 예를들어 이미 해당 키가 존재하면 실패하도록 할 수도 있고 그 반대로 이미 키가 존재할 때에만 SET하도록 할 수도 있습니다. 아래와 같이 말이죠.

> set mykey newval nx
(nil)
> set mykey newval xx
OK

스트링이 레디스의 정말 기본적인 값을 나타내는 데이터 형식이지만 여러 실용적인 기능들이 있습니다. atomic increment 가 그 한 예입니다. atomic increment가 뭔지 잘 모르신다면 atomic이 뭘 의미하는지 찾아보시면 될겁니다. 여기서 그에 대한 설명은 하지 않겠습니다.

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

 INCR 명령어는 스트링으로 저장된 값을 숫자형태로 변환한 뒤 1을 증가시킵니다. 그리고 그렇게 증가된 값을 다시 스트링 형태로 저장합니다. 이와 비슷하게 INCRBYDECR 그리고 DECRBY 와 같은 명령어들을 레디스는 제공하고 있습니다. 이 명령어들은 내부적으로 모두 동일하게 동작합니다. 아주 미묘한 차이만 있을 뿐이죠.

INCR 가 atomic이라는게 무슨 의미냐구요? 여러명의 사용자가 동일한 키에 대해서 INCR명령어를 요청한다고 했을 때, 요청한 사용자들이 절대로 race condition에 빠질 수 없다라는 의미입니다. 즉, 사용자 1 이 10이라는 값을 읽고, 사용자 2 역시 동일한 키에 대해서 10이라는 값을 읽은 뒤 두 사용자가 1씩 값을 증가시켰을 때 최종 결과가 11이 될 수 없다는 것이죠. 최종 결과는 항상 무조건 절대로 12 가 된다는 것을 레디스는 보장해주고 있습니다. 쉽게말하면 값을 읽고, 1 증가하고, 다시 저장하는 과정이 모두 한명의 사용자가 요청했을 때 이루어지고 그 사이에 다른 사용자가 끼어들 수 없다는 말이죠.

이 외에도 스트링을 다루기 위한 여러 명령어들이 있습니다.  GETSET 명령어는 키에 존재하는 값을 읽고 새로운 값을 세팅한뒤 읽어들인 기존값을 반환합니다. 이 명령어는 방문자수를 기록할 때 사용할 수 있겠죠. 일별로 방문자수를 기록을 해야한다면 자정이 되었을 때 GETSET 명령어로 오늘 방문자수를 읽어오고 0으로 세팅해주면 되는거죠.

여러개의 키-값 페어를 저장하거나 조회하고 싶을 때에는 MSET 와 MGET 명령어를 사용하면 됩니다.

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30" 

MSET은 한번에 여러 키-값 페어를 저장하는 명령어이고

 MGET 은 값의 배열을 반환합니다.

Altering and querying the key space ( 키 변경, 조회, 삭제 하기 )

레디스는 키와 관련된 여러 명령어들을 제공합니다. 키 이름 변경( 이것은 위에서 보셨죠? ), 키 목록 조회 및 존재여부 파악, 또는 삭제하기와 같은 명령어들을 말이죠.

 EXISTS 명령어는 1 또는 0 을 반환합니다. 키가 존재하거나 존재하지 않을때 말이죠.

그리고 DEL 명령어는 해당 키와 그 키에 할당된 값을 삭제합니다.

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

위 예제를 보시면 각 명령어가 어떻게 동작하는지 쉽게 이해가 되실겁니다.

이 명령어들 외에도 무수히 많은 key space 관련 명령어들이 있습니다. 위 두 명령어와 함께 자주 사용되는 명령어 중 하나가 바로  TYPE 명령어입니다. 이 명령어는 특정 키에 저장되어있는 값의 타입을 반환합니다. 아래 예제를 보시죠.

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

처음에 set mykey x 로 키 mykey에 값 x를 등록했습니다. 그리고 type mykey 로 mykey에 저장된 값 x의 타입을 조회해 보니 string이 나왔네요. 그 다음엔 mykey를 삭제했습니다. 그리고 다시 조회를 해보니 none 이라고 나왔네요. 해당 키에 저장된 값이 없다는 얘기겠죠.

Redis 키에 TTL (Time To Live)설정하기 

이건 단지 스트링 타입 뿐만 아니라 모든 타입에 적용되는 것이긴 합니다만 다른 타입의 데이터를 얘기하기 전에 짚고 넘어가야 할 것 같습니다. 기본적으로 키에 타임아웃 시간을 설정할 수 있습니다. 설정된 타임아웃 시간이 지나면 자동으로 키는 삭제됩니다. 이때 삭제되는것은 사용자가 직접 DEL 명령어로 삭제하는 것과 완전히 동일하게 삭제가 되는 것입니다.

 Redis expires 와 관련하여 아래 내용을 숙지하시기 바랍니다.

  • 기본적으로 밀리초 단위로 동작한다.
  • 초 단위 또는 밀리 초 단위로 만료되기 까지의 시간을 설정할 수 있다.
  • 만료일시와 관련된 정보는 디스크에 복제되어 저장되고 레디스 서버가 멈춰도 재기동 될때 현재 일시와 비교하여 삭제한다.

만료일시를 지정하는 방법은 아주 쉽습니다. 아래 예제를 한번 보시죠.

> set key some-value
OK
> expire key 5
(integer) 1
> get key (위 명령어를 입력하자마자 바로 실행)
"some-value"
> get key (5초 뒤에 실행)
(nil)

위 예제는 어떤 값을 저장한 뒤 5초로 만료시간을 지정해주고 두 번의 GET 을 호출할 때 만료시간에 따라 값이 조회가 되는지 안되는지를 확인해본 것입니다. 5초 뒤에 만료되라고 지정해주었으니 5초 뒤에는 nil이라고 뜨는 것을 확인할 수 있었습니다. 

여기서는 EXPIRE 명령어를 이용해서 만료일시를 지정해주었는데 만약에 이 만료일시를 없애기 위해서는 PERSIST 명령어를 사용할 수 있습니다. 그리고 EXPIRE명령과 동일한 기능을 SET 명령어의 옵션을 이용해서 적용할 수도 있습니다.

> set key 100 ex 10
OK
> ttl key
(integer) 9

위 예제는 키 key에 값 100을 저장하는데 10초 후에 만료되어 파기하라는 옵션을 덧붙였습니다. 그리고나서  TTL 명령어로 키 key의 만료되기 전까지의 시간(초)을 조회를 해보니 9가 나왔네요. (참고로 TTL은 Time To Live 의 약자입니다.)

초 단위가 아닌 밀리초 단위로 설정을 하려면, PEXPIRE 와 PTTL 명령어를 참고하시면 됩니다. 또는 PEXPIRE대신 SET 명령어의 옵션을 이용할 수도 있습니다.



위 내용은 레디스 공식 문서에 나와있는 내용을 스터디 할 겸 개인적으로 번역한 내용입니다. 


💻 Programming

[Redis] 레디스 키와 관련 명령어

Redis keys

Redis 에서 사용하는 key는 binary safe합니다. 

바이너리 세이프 하다는 말은 키 이름으로 어떠한 바이너리 시퀀스를 사용해도 무방하다는 말입니다. 

예를들어 JPEG파일을 저장하기 위한 키로 "foo"를 사용해도 됩니다.

또한 빈 스트링도 유효한 키로 인식합니다.


키와 관련된 또 다른 규칙은 아래와 같습니다:

  • 너무 긴 이름을 가진 키는 좋지 않습니다. 예를들어 1024 바이트 짜리 키는 매우 안좋은 것입니다. 왜냐면 메모리도 많이 잡아먹을 뿐만 아니라 키를 찾는데도 시간이 오래 걸릴 수 있기 때문입니다. 따라서 메모리 측면이나 bandwidth 측면에서 봤을 때 긴 키값이 해당 키와 관련된 값이나 서비스와 관련된 좋은 이름이라 할지라도 SHA1 등의 해시알고리즘을 통해서 길이를 줄여서 사용하는 것을 추천합니다.
  • 너무 짧은 키 역시 좋지 않습니다. "user:1000:followers"라는 키 대신에 "u1000flw" 라고 키를 정하면 나중에 키만보고 이것이 무엇에 관련된 키인지 파악하기가 쉽지 않게 됩니다. 가독성이 떨어지는 것이죠. 짧은 키가 아무리 더 적은 메모리를 사용할지라도 큰 차이가 나지 않는다면 적당히 길이를 늘려서 가독성있는 키를 만드는 것이 더 좋습니다.
  • 스키마에 집중하세요. 예를들어, "user:1000"처럼 "object-type:id" 식의 키 명명규칙은 좋은 예 입니다. 마침표(.)나 대쉬(-)를 이용하여 여러 단어를 연결하는 것도 좋습니다. "comment:1234:reply.to" 또는 "comment:1234:reply-to" 처럼 말이죠.
  • 키 하나를 저장하할 수 있는 최대 사이즈는 512 MB 입니다. 설마 키 저장하는데 이렇게 많은 메모리를 사용할 일은 없겠죠?


자 그러면 이제 Redis 에서 제공하는 키 관련 명령어의 사용법 및 종류에 대해서 간단하게 알아보겠습니다.

우선 문법은 아래와 같습니다.

Syntax (문법)

redis 127.0.0.1:6379> {명령어} {키}

{명령어} 자리에는 키 관련 명령어가 들어가면됩니다. 아래 예제를 같이 살펴볼까요?

Example (예제)

redis 127.0.0.1:6379> SET study:redis redis OK redis 127.0.0.1:6379> DEL study:redis (integer) 1

위 예제에서 DEL, SET 은 명령어 입니다. 그리고 study:redis 가 바로 key입니다. 

처음에는 SET 명령어로 study:redis라는 키에 redis라는 값을 입력을 했습니다. 

그리고나서 DEL명령어로 해당 키를 삭제를 했습니다. 키를 삭제하면 키에 매핑되어있는 값에 접근할 방법이 없어지겠죠. 

키를 삭제할 때 키가 존재하고 정상적으로 삭제가 되었다면 (integer) 1 가 출력될 것이고, 아니면 (integer) 0 가 출력될 것입니다.

Redis keys commands ( 레디스 키 명령어 )

아래 테이블은 키와 관련된 기본적인 명령어를 몇 개만 간추려 본 것입니다.:

No.

명령어 및 설명

1DEL key
이 명령어는 키가 존재한다면 삭제를 합니다
2

DUMP key 
해당 키에 저장된 값의 serialized version을 반환합니다.

3

EXISTS key 
키가 존재하는지 여부를 반환합니다.

4

EXPIRE key seconds
지정한 시간(초)가 지나면 해당 키를 삭제할 수 있도록 만료기간을 지정합니다.

5

EXPIREAT key timestamp 
특정한 시간에 키가 삭제될 수 있도록 Unix timestamp 포맷으로 특정 시각을 지정합니다.

6

PEXPIRE key milliseconds 
키의 만료기간을 밀리초 단위로 설정합니다.

7

PEXPIREAT key milliseconds-timestamp 
키의 만료 시각을 유닉스 밀리초 타임스탬프 포맷으로 지정합니다.

8

KEYS pattern 
특정 패턴과 일치하는 모든 키 목록을 조회합니다.

9

MOVE key db 
해당 키를 다른 db로 이동합니다.

10

PERSIST key 
키에 설정된 만료일시를 삭제합니다.

11

PTTL key 
해당 키가 만료되기까지의 시간을 밀리초 단위로 반환합니다.

12

TTL key 
해당 키가 만료되기 까지의 시간을 조회합니다.

13RANDOMKEY 
랜덤키 하나를 반환합니다.
14

RENAME key newkey 
키 이름을 새로운 키로 변경합니다.

15RENAMENX key newkey 
키 이름을 새로운 키로 변경합니다. (단, 새로운 키와 동일한 이름의 키가 존재하지 않을 경우에만)
16

TYPE key 
키에 저장된 데이터의 타입을 조회합니다.