Redis: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
Line 30: Line 30:


=== Zset ===
=== Zset ===
Score 가진 set.
ZSET 은 가중치를 가진 SET 이라고 설명할 수 있다. SET은 일종의 array 개념으로 사용하기에 편리하지만, 다른 한편으로는 검색이 불편하다는 단점이 있다. 만약 수백만개의 Entry 가지고 있는 SET 에서 특정 범위의 내용만을 확인하고 싶다면 어떻게 해야 할까? 이에 대한 해답이 ZSET 이다.
<pre>
<pre>
redis>  ZADD myzset 1 "one"
redis>  ZADD myzset 1 "one"

Revision as of 16:06, 27 January 2016

Overview

Redis 사용법 소개

Data types

Redis 에는 5가지의 데이터 타입이 존재한다(Strings, Lists, Sets, Sorted sets, Hashes)

Strings

일반적인 key-value 이다.

- String 이라고 해서 문자열만 저장할 수 있는게 아니라, 이진 데이터도 저장이 가능하다.(정수, 실수형이 따로 없다). 
- Key 에 넣을 수 있는 데이터의 최대 크기는 512 MB이다.

Lists

Array 형태로 key 1개에 n개의 값을 가지며, 중복 값도 가능하다.

- 배열이라고 생각해도 된다. 
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. 
- 데이터 형의 값은 설정파일에서 정해준 조건보다 큰 경우 linkedlist 아니면 ziplist로 encoding 된다.

Set

Group 형태로 key 1개에 n 개의 중복되지 않는 값을 가진다.

- 정렬되지 않은 집합형으로 key에 중복된 데이터는 존재하지 않는다.
- 추가, 제거 및 존재 체크 시 소모되는 시간이, sets 에 포함되 ㄴ요소의 수와 관계없이 일정하다.
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다.
- 데이터 형의 값은 설정파일에 정해준 조건보다 큰 경우 hashtable 아니면 intset 으로 encoding 된다.

Zset

ZSET 은 가중치를 가진 SET 이라고 설명할 수 있다. SET은 일종의 array 개념으로 사용하기에 편리하지만, 다른 한편으로는 검색이 불편하다는 단점이 있다. 만약 수백만개의 Entry 를 가지고 있는 SET 에서 특정 범위의 내용만을 확인하고 싶다면 어떻게 해야 할까? 이에 대한 해답이 ZSET 이다.

redis>  ZADD myzset 1 "one"
(integer) 1

redis>  ZADD myzset 1 "uno"
(integer) 1

redis>  ZADD myzset 2 "two" 3 "three"
(integer) 2

redis>  ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"

Sorted sets

Group 형태이나 각 member에 score 값을 가진다. keye-member-score

- Sorted sets 는 가잔 진보한 Redis 데이터 형이라고도 한다.
- 요소의 추가, 제거, 업데이트는 매우 빠른 방법으로 진행되는 데, 이는 "요소의 개수의 로그"에 비례하는 시간이 사용된다.
- 랭킹 시스템 등에서 사용되기 좋다.
- sets의 각 요소마다 score 라는 실수 값을 가지고 있는 형태로 score 값으로 오름차순 정렬된다.
- key에 중복된 데이터는 존재하지 않지만 score 값은 중복 가능하다.

Hashes

Obejct 형태의 key-field-value

- list 와 비슷한데, "필드명", "필드값"의 연속으로 이루어져 있다.
- 한 key 에 포함할 수 있는 field-value 쌍의 최대 개수는 4,294,967,295 개이다.
- 데이터 형의 값은 설정파일에서 정해준 조건보다 큰 경우는 hashtable 아니면 zipmap 으로 encoding 된다.

Commands

INFO

Redis 서버 설정 정보를 확인할 수 있다.

> INFO
redis_version:2.4.18
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
...

DEL

DEL key [key ...] 

지정된 key 를 삭제한다.

SET, GET

GET key 
SET key value

Key 지정된 값을 할당하고, 가져온다.

SET 명령어 사용시, 만약 Key 에 이미 다른 값이 설정되어 있다면 타입에 상관없이 덮어쓰기가 된다. Any previous time to live associated with the key is discarded on successful SET operation.

redis>  SET mykey "Hello"
OK
redis>  GET mykey
"Hello"

SET

SADD, SMEMBERS

SADD key member [member ...] 
SMEMBERS key

지정된 key에 member 들을 Sets 타입으로 add/show 한다.

redis 127.0.0.1:6379[1000]> SADD queues "a684cf64-685c-484c-8157-a53db7e7cef7"
(integer) 1
redis 127.0.0.1:6379[1000]> SADD queues "f9c7e9cf-8415-42d7-a6cd-82fa95410b33"
(integer) 1
redis 127.0.0.1:6379[1000]> SADD queues "e5631cf8-6898-486a-beac-36087c917b8a"
(integer) 1

redis 127.0.0.1:6379[1000]> SMEMBERS queues
1) "a684cf64-685c-484c-8157-a53db7e7cef7"
2) "e5631cf8-6898-486a-beac-36087c917b8a"
3) "f9c7e9cf-8415-42d7-a6cd-82fa95410b33"

ZSET

ZREMRANGEBYSCORE


Errors

Cannot allocate memory

Redis 는 기본적으로 In-memory database 이다. 이 말은 모든 데이터베이스 정보들을 메모리에 저장한다는 뜻이다. 그런데, 만약 Redis 에 쌓여가는 데이터는 늘어만가고, 더이상 할당 가능한 메모리가 없다면 어떻게 될까?

속도가 엄청나게 느려진다. 보통은 1초안에 끝나는 검색이 10초 이상이 소요되게 된다.

그리고 로그 파일에는 다음과 같은 로그가 나타나게 된다.

[16451] 18 Jun 13:53:02 # Can't save in background: fork: Cannot allocate memory
[16451] 18 Jun 13:53:02 * 1 changes in 900 seconds. Saving... 

해결방법으로는 이곳<ref>http://pydelion.com/2013/05/27/redis-cant-save-in-background-fork-cannot-allocate-memory/</ref>을 참조하면 된다. 간단히, 아래 명령어를 사용하면 문제를 해결할 수 있다.

$ sysctl -w vm.overcommit_memory=1

하지만 이는 어디까지나, 단편적이고, 일회용적인 해결 방법이다. 재부팅을 하게되면 원래 설정대로 돌아간다. 주의하자.

보다, 근본적인 문제는, In-Memory DB 에서 저장해야 할 데이터는 많은데, 사용가능한 메모리가 부족하다는 것이다. 저장되는 데이터를 줄이거나, 메모리 크기를 늘리는 것이 해답이다.

See also

References

<references />