Redis: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
== Overview == | == Overview == | ||
Redis 사용법 소개 | Redis 사용법 소개 | ||
== Data types == | |||
Redis 에는 5가지의 데이터 타입이 존재한다(Strings, Lists, Sets, Sorted sets, Hashes) | |||
=== Strings === | |||
일반적인 key-value 이다. | |||
<pre> | |||
- String 이라고 해서 문자열만 저장할 수 있는게 아니라, 이진 데이터도 저장이 가능하다.(정수, 실수형이 따로 없다). | |||
- Key 에 넣을 수 있는 데이터의 최대 크기는 512 MB이다. | |||
</pre> | |||
=== Lists === | |||
Array 형태로 key 1개에 n개의 값을 가지며, 중복 값도 가능하다. | |||
<pre> | |||
- 배열이라고 생각해도 된다. | |||
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. | |||
- 데이터 형의 값은 설정파일에서 정해준 조건보다 큰 경우 linkedlist 아니면 ziplist로 encoding 된다. | |||
</pre> | |||
=== Sets === | |||
Group 형태로 key 1개에 n 개의 중복되지 않는 값을 가진다. | |||
<pre> | |||
- 정렬되지 않은 집합형으로 key에 중복된 데이터는 존재하지 않는다. | |||
- 추가, 제거 및 존재 체크 시 소모되는 시간이, sets 에 포함되 ㄴ요소의 수와 관계없이 일정하다. | |||
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. | |||
- 데이터 형의 값은 설정파일에 정해준 조건보다 큰 경우 hashtable 아니면 intset 으로 encoding 된다. | |||
</pre> | |||
=== Sorted sets === | |||
Group 형태이나 각 member에 score 값을 가진다. keye-member-score | |||
<pre> | |||
- Sorted sets 는 가잔 진보한 Redis 데이터 형이라고도 한다. | |||
- 요소의 추가, 제거, 업데이트는 매우 빠른 방법으로 진행되는 데, 이는 "요소의 개수의 로그"에 비례하는 시간이 사용된다. | |||
- 랭킹 시스템 등에서 사용되기 좋다. | |||
- sets의 각 요소마다 score 라는 실수 값을 가지고 있는 형태로 score 값으로 오름차순 정렬된다. | |||
- key에 중복된 데이터는 존재하지 않지만 score 값은 중복 가능하다. | |||
</pre> | |||
=== Hashes === | |||
Obejct 형태의 key-field-value | |||
<pre> | |||
- list 와 비슷한데, "필드명", "필드값"의 연속으로 이루어져 있다. | |||
- 한 key 에 포함할 수 있는 field-value 쌍의 최대 개수는 4,294,967,295 개이다. | |||
- 데이터 형의 값은 설정파일에서 정해준 조건보다 큰 경우는 hashtable 아니면 zipmap 으로 encoding 된다. | |||
</pre> | |||
== Commands == | == Commands == | ||
Line 86: | Line 131: | ||
보다, 근본적인 문제는, In-Memory DB 에서 저장해야 할 데이터는 많은데, 사용가능한 메모리가 부족하다는 것이다. 저장되는 데이터를 줄이거나, 메모리 크기를 늘리는 것이 해답이다. | 보다, 근본적인 문제는, In-Memory DB 에서 저장해야 할 데이터는 많은데, 사용가능한 메모리가 부족하다는 것이다. 저장되는 데이터를 줄이거나, 메모리 크기를 늘리는 것이 해답이다. | ||
== See also == | |||
* http://lovedb.tistory.com/151 - [Redis] Redis 데이터 타입 | |||
== References == | == References == |
Revision as of 16:06, 26 October 2015
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 된다.
Sets
Group 형태로 key 1개에 n 개의 중복되지 않는 값을 가진다.
- 정렬되지 않은 집합형으로 key에 중복된 데이터는 존재하지 않는다. - 추가, 제거 및 존재 체크 시 소모되는 시간이, sets 에 포함되 ㄴ요소의 수와 관계없이 일정하다. - 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. - 데이터 형의 값은 설정파일에 정해준 조건보다 큰 경우 hashtable 아니면 intset 으로 encoding 된다.
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 서버 설정 정보를 확인할 수 있다.
$ redis-cli info redis_version:2.4.18 redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.4 process_id:27469 run_id:8626642f1b1a872c20f4b183f399589ba054c5e6 uptime_in_seconds:4 uptime_in_days:0 lru_clock:857251 used_cpu_sys:0.00 used_cpu_user:0.06 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 connected_clients:1 connected_slaves:0 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 used_memory:5297376 used_memory_human:5.05M used_memory_rss:6316032 used_memory_peak:5293384 used_memory_peak_human:5.05M mem_fragmentation_ratio:1.19 mem_allocator:jemalloc-3.2.0 loading:0 aof_enabled:0 changes_since_last_save:0 bgsave_in_progress:0 last_save_time:1434635870 bgrewriteaof_in_progress:0 total_connections_received:1 total_commands_processed:0 expired_keys:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 vm_enabled:0 role:master db0:keys=526,expires=0 db1000:keys=95,expires=0
set
Key 지정된 값을 할당한다. 만약 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"
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
- http://lovedb.tistory.com/151 - [Redis] Redis 데이터 타입
References
<references />