이번 프로젝트에 REDIS 를 쓰기로 해서 어떤 놈인지 몇일 붙잡고 연구한 결과를 wiki 에 정리해보았다.
날짜 |
작성/수정 | 내용 |
2012-05-14 |
김광훈 |
주제 생성 |
아래 내용은 단순 번역 뿐 아니라 직접 연구 및 파악한 내용으로 경우에 따라 잘못된 내용이 있을 수도 있다.(무책임;)
참고사이트 http://redis.io/
연구에 사용한 Redis버전 : 2.4.12
REDIS 소개
- memory db
- no-sql db 로 기본적으로 key 와 value 쌍의 형태로 데이타를 메모리에 저장한다.
- 메모리에 저장된 내용을 지속시키기 위해 파일로 싱크 하는 기능을 제공한다.
Data Types
- redis 에는 5가지 데이타형이 존재하며, 이 5가지 데이타 형을 다루는 명령이 모두 다르다. 예를들어 string 형의 데이타를 저장하는 명령으로 저장한 key 는 hashes 형을 읽는 명령으로 읽을 수 없다.
Strings
- redis 의 가장 기본적인 데이타형 으로 key 에 하나의 값을 저장한다.
- string 이라고 해서 문자열만 저장할 수 있는게 아니라, 이진 데이타도 저장이 가능하다.(참고로 redis 에는 정수형, 실수형 이 따로 없다.)
- 한 key 에 넣을 수 있는 데이타의 최대 크기는 512 megabytes 이다.
- 이 데이타형의 값은 정수인 경우는 int 로 아니면 raw 로 encoding 된다.
Lists
- 배열이라 보면 된다.
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)
- 이 데이타형의 값은 설정파일에서 정해준 조건보다 큰 경우는 linkedlist 아니면 ziplist 로 encoding 된다.
Sets
- 정렬되지 않은 집합 형 이다.
- 말 그대로 집합 이기 때문에 한 key 에 중복된 데이타는 존재하지 않는다. 즉, 동일한 key 에 "abcd" 라는 값을 두 번 추가해도 sets 상에 "abcd" 라는 값은 하나만 존재하게 된다.
- 이 데이타형의 중요한 장점은 요소의 추가, 제거 및 존재체크 시 소모되는 시간이, sets 에 포함된 요소의 수에 관계없이 일정하다는 것이다.
- 한 key 에 넣을 수 있는 요소의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)
- 이 데이타형의 값은 설정파일에서 정해준 조건보다 큰 경우는 hashtable 아니면 intset 로 encoding 된다.
Hashes
- 암호화에서 설명한 그 hash 와는 전혀 상관 없다.
- 객체를 나타내는데 사용 가능한 데이타 형이다.
- 형태는 lists 와 비슷한데 "필드명", "필드값" 의 연속으로 이루어져 있다.
- redis 에서는 최대 100개 정도의 필드를 가지고 있는 hashes 형의 데이타를 저장할 때 매주 작은 메모리 공간을 사용하는 방법을 사용하고 있다.
- 이 얘기는 메모리 상에 서로 다른 hash key 들이 동일한 필드명 을 공유하는 방법을 사용한다는 것일까?
- 한 key 에 포함할 수 있는 field-value 쌍의 최대 개수는 4,294,967,295 개이다. (2^32 - 1)
- 이 데이타형의 값은 설정파일에서 정해준 조건보다 큰 경우는 hashtable 아니면 zipmap 로 encoding 된다.
Sorted sets
- 일단 형태로만 보면 sets 의 각요소마다 score 라는 실수 값을 가지고 있는 형태이다.
- 요소들은 정렬된 형태로 보여지는데 이때 정렬하는 기준이 score 이다. (오름차순)
- sets 와 마찬가지로 동일한 key 에서 각 요소들의 값은 유일하다. 하지만, score 값은 중복될 수 있다.
- 요소의 추가, 제거, 업데이트는 매우 빠른 방법으로 진행되는데 이는 "요소의 개수의 로그" 에 비례하는 시간이 사용된다. 이런 특징으로 이 데이타 형은 다음과 같은 활용에 유용하다.
- score 에 승수 를 넣는다던지 해서 랭킹 시스템 등에 사용하기 좋다.
- 다른 데이타 형의 정렬을 위한 index 값으로 활용할 수 있다. 예를 들어 hashes 로 사용자 데이타를 저장하는데 나이에 따른 정렬이 필요하다 할 경우, sorted sets 에 요소의 값은 사용자ID 를 score 는 나이 값을 넣어주면 된다.
- sorted sets 는 가장 진보한 redis 데이타 형이라고 한다.
- 이 데이타형의 값은 설정파일에서 정해준 조건보다 큰 경우는 skiplist 아니면 ziplist 로 encoding 된다.
Expires
- redis 의 각 key 에는 만기시각을 설정해줄 수 있다. 이는 redis 명령 중 expire 명령으로 설정해줄 수 있다.
- 만기시각이 지난 key 는 자동적으로 메모리에서 제거된다.
- 메모리가 full 된 상태에서 LIMITS 설정에서 선택한 정책에 따라 만기시각이 지정되지 않거나 만기시각이 남은 key 라도 삭제될 경우가 있다.
Persistence (지속성)
- redis 는 메모리 기반 DB 이기 때문에 전원이 꺼지면 데이타가 모두 날라가게 된다. 이에 파일에 메모리상의 데이타를 저장해두고 redis 서버 실행시 다시 그 파일에서 데이타를 읽어와 메모리상에 올리는 기능을 제공하는데 이를 Persistence (지속성) 라고 한다.
- redis 는 RDB 와 AOF 의 두가지 지속성을 제공한다.
- 두 가지 지속성은 하나만 선택해야 하는 것은 아니고 두 가지를 모두 사용 가능하다.
- 두 가지 지속성을 모두 사용하도록 설정한 상태에서 redis-server 를 실행하면 AOF 를 이용해 메모리에 데이타를 올리게 된다.
- 보통 두 가지 지속성을 다 쓰는게 좋다고 한다. 복구가 필요한 시점에 더 적합하고 안전한 방법을 선택해 복구 하면 될 듯 하다.
RDB
- 메모리상의 데이타를 모조리 파일로 덤프를 뜨게 된다.
- command 중 bgsave(비동기적) or save(동기적) 를 실행하면 이 지속성으로 파일을 쓰게할수 있다.
- 설정파일에서 SNAPSHOTTING 부분이 이 지속성과 관련된 부분이다.
- 저장 파일은 보통 .rdb 를 확장자로 쓴다.
- 프로세스
- redis 는 fork 로 자식 프로세스를 생성한다.
- 자식 프로세스는 임시 rdb 파일에 data 를 쓴다.
- 자식 프로세스가 임시 rdb 파일에 data 쓰기를 마치면, 임시 rdb 파일로 옛날 rdb 파일을 덮어 씌운다.
- 장점
- 특정 시점의 백업 및 복구에 유리하다.
- redis-server 디스크에 저장하는 시점까지 disk i/o 가 일어나지 않으므로 성능을 극대화 할수 있다.
- AOF 에 비해 더 빨리 메모리 에 data 를 올리고 redis-server 를 시작 할수 있다.
- 단점
- 사고 발생시 백업이 일어나는 시점들 사이에 일어나는 변경사항이 손실된다.
- 백업시 fork() 로 자식 프로세스를 생성해서 백업 작업을 시행하는데 이때 데이타가 크다면 순간적으로 많은 cpu 부하가 발생할 수 있다.
AOF
- 실행한 명령들을 계속 파일에 추가해나가는 방식. mysql 의 바이너리로그 와 비슷하다고 볼 수 있다.
- command 중 BGREWRITEAOF 을 실행하면 이 지속성으로 파일을 쓰게할 수 있다.
- 설정파일에서 APPEND ONLY MODE 부분이 이 지속성과 관련된 부분이다.
- 저장 파일은 보통 .aof 를 확장자로 쓴다.
- AOF 는 설정파일에서 파일을 쓰는 시점에 대해 3가지 옵션을 제공하는데 보통 기본값인 everysec 를 사용하면 된다.(자세한 것은 설정파일의 appendfsync 부분 참고)
- Log rewriting
- 쓰기 내용이 많아져서 불필요할정도로 aof 파일이 커진 경우 BGREWRITEOF 명령의 실행에 의해 데이타 내용을 살릴수 있는 짧은 명령을 쓰게 된다.
- redis 2.2 버전에선 수동으로 BGREWRITEAOF 명령을 실행해야했지만, 2.4 버전 부터는 자동으로 실행된다고 한다. * 자세한내용은 설정파일을 확인하도록
- AOF 손상 확인 방법 : aof 파일을 쓰는 중 정전등의 문제로 파일이 손상될 수 있다. 이 때 redis-check-aof 툴로 복구가 가능하다.
- aof 파일을 복사한다.
- redis-check-aof --fix <aof복사본파일> 을 실행해 복사본 파일을 수정(복구)한다.
- (옵션사항)diff -u 명령으로 두 파일을 비교한다.
- 수정된 파일을 이용해 redis-server 를 다시 시작한다.
- 장점
- 사고 발생시 손실되는 데이타가 최소화된다.
- 정전등의 문제로 aof 파일에 문제가 생긴다 해도 redis-check-aof 로 aof 파일의 복구가 가능하다.
- aof 파일은 포맷이 단순하여, 문제가 있는 쿼리만 삭제하고 복구에 사용한다던가 하는 작업이 가능하다.
- 단점
- rdb 파일에 비해 보통 사이즈가 커지게 된다.
- AOF 는 fsync 정책에 따라 RDB 보다 느릴수 있다.(아무래도 RDB 보다 쓰기가 많이 일어나게 되므로)
- "과거에 우리(redis 개발진)는 aof 파일을 이용 동일한 data 로 복구하지 못하는 버그를 발견한적이 있는데, 아직 사용자들로부터 해당 버그가 발생한 경우를 보고 받은적은 없다." 라고 한다.
REDIS protocol specification
- redis 클라이언트와 서버간에 주고 받는 명령 및 응답의 규약 을 설명한다.
- 요청 프로토콜
- AOF 파일의 포맷 역시 이 규약이 사용된다.
- 간단하고, 컴퓨터에서 빠른 처리(파싱)이 가능하며, 사람이 충분히 이해할수 있는 쉬운 형태다
- network layer 에서 client 에서 server 로 보내는 각 명령은 \r\n (CRLF) 로 끝나야 한다.
- 형식 (아래서 < > 는 실제 입력하는게 아니라 키워드를 구분하기 위해 넣은 값임. 아래는 한 command 에 대한 포맷이다.
*<number of arguments><CR><LF> $<number of bytes of argument 1><CR><LF> <argument data><CR><LF> $<number of bytes of argument 2><CR><LF> <argument data><CR><LF> ... $<number of bytes of argument N><CR><LF> <argument data><CR><LF> 실제 형태는 아래와 같은 식이 된다. *3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n
- 응답
- 첫 문자 : 응답문은 5가지 형태가 있는데, 5가지 형태에 따라 첫 문자가 다음과 같이 결정된다.
- "+" status reply (한줄로 끝나는 응답인 경우)
- "-" error reply (에러 메시지인 경우)
- ":" integer reply (하나의 정수로 답하는 경우)
- "$" bulk reply 인 경우. 요청 프로토콜 참고
- "*" 여러줄의 bulk reply 인 경우. 요청 프로토콜 참고
- 첫 문자 : 응답문은 5가지 형태가 있는데, 5가지 형태에 따라 첫 문자가 다음과 같이 결정된다.
pipe 입력
- 텍스트 파일안의 명령들을 pipe 를 이용 redis-cli 에보내고 싶을때 방법. 주로 텍스트 파일 상의 대량의 명령들을 효율적으로 실행할 때 사용한다.
- 텍스트 파일은 다음 예제 샘플 처럼 명령들을 쭉 써주면 되는데 중요한건 줄바꿈이 \r\n 로 되야 한다는 것이다.
set key0 value0 set key1 value1 set key2 value2 set key3 value3 set key4 value4
- redis 2.6-rc4 와 redis 2.4.14 이상 일때 redis-cli 에서 자체적으로 pipe 입력 기능을 지원한다.
- cat data.txt | redis-cli --pipe
- 버전이 낮은 경우는 아래와 같이 편법으로 가능하지만, 실패코드 등을 알수 없다는 단점이 있음.
- (cat data.txt; sleep 10) | nc localhost 6379 > /dev/null
설정파일
기본 설정
- daemonize no
- redis 서버를 데몬으로 실행하려면 daemonize yes 로 바꿔줘야 한다.
- pidfile /var/run/redis.pid
- 이 설정파일을 이용해 띄운 redis 서버 의 pid(process id) 가 위 경로에 텍스트 파일 형태로 저장된다. 이를 이용
- kill -9 `cat /var/run/redis.pid`
- 같은 식으로도 redis server 를 강제 종료 시킬수 있다.(사고 상황 테스트 등)
- redis 서버를 여러개 띄울 수 있으니 경로에서 redis.pid 란 파일 이름 부분을 적당히 수정해 주자.
- 이 설정파일을 이용해 띄운 redis 서버 의 pid(process id) 가 위 경로에 텍스트 파일 형태로 저장된다. 이를 이용
- port 6379
- redis-server 는 기본적으로 6379 포트를 쓰도록 되어 있다. 위 부분을 수정하면 다른 포트 번호로 실행할 수 있다.
- bind 127.0.0.1
- 샘플상태에서 위 줄은 주석처리 되어 있을 것이다. 랜카드가 하나인 환경이라면 그냥 주석 상태로 두면 된다.
- 랜카드가 2개 이상인 경우 어느 랜카드(ip)에서 서버가 대기할지 설정해주면 된다.
- timeout 0
- 클라이언트에서 서버에 접속할 때 timeout 값으로 초 단위다. 일단 0 으로 놔두고 환경에 따라 값을 바꿔주면 될듯.
- loglevel verbose
- 남기는 로그의 단계 설정
- debug > verbose > notice > warning 순으로 더 많은 정보를 남긴다(debug 가 가장많은 정보 남김).
- 기본값인 verbose 정도로 하는게 적당하다.
- logfile stdout
- 로그파일의 위치를 나타냄.
- 기본값인 stdout 로 할 경우 표준출력으로 로그를 남기기되는데 만약 이 설정에서 데몬 모드로 서버 실행시 /dev/null 로 출력되어 로그는 어디에도 안 남게된다.
- stdout 를 적당한 파일 경로로 수정해서 로그가 파일에 남도록 하는게 좋다. 다만 이 설정만으로는 로그 파일을 일자별로 못 만들고 통짜 파일 하나로 만들어야 한다.
- 로그 파일을 날자별로 만드는 간한단 아이디어 (문득 떠오른건데 잘 될지는 해봐야 한다.)
- 설정한 로그파일의 경로가 /data/logs/redis/redis.log 라고 할때
- /data/logs/redis/redis.log 를 실제 파일로 만드는 것이 아니라 날자가 붙은 로그파일 의 심볼릭링크로 만든다. (ex: ln -s /data/logs/redis/redis_20120515.log /data/logs/redis/redis.log)
- crontab 을 이용 매일 0 시에 redis.log 의 심볼릭 링크의 원본 파일을 해당 날자가 붙은 로그파일로 바꿔버린다. 이때 심볼릭 파일이 유실되는 순간을 위해 다음과 같은 식으로 처리한다.
- ln -s /data/logs/redis/redis_20120516.log /data/logs/redis/redis_tmp.log
- mv /data/logs/redis/redis_tmp.log /data/logs/redis/redis.log
- databases 16
- redis 는 select 명령으로 DB 를 변경할 수 있는데 이때 DB 는 문자로 된 이름을 가지는게 아니라 0 부터 시작하는 index 값을 가지게 된다.
- 이 DB 를 최대 몇 개 가질수 있는지 설정해주는 부분이다. 16 이라면 0 ~ 15 까지의 DB 를 가지게 된다.
- 따로 select 명령을 사용하지 않을 경우 0 번 DB 가 선택되며 만약 7번 DB 를 선택하려면 다음과 같이 명령을 실행하면 된다.
- select 7
SNAPSHOTTING (RDB 지속성 설정)
- save 60 10000
- redis 서버가 메모리의 내용을 rdb 파일로 자동으로 덤프 하는 시점과 관련된 설정이다.
- 위 줄은 60초 동안 10000 건 이상의 keys 가 변경되었다면 메모리 상의 데이타를 모두 rdb 파일로 덤프 하라는 뜻 이다.
- save <초> <변경된key수> 는 여러 줄로 설정 가능하다. 이를 이용 자동 rdb 덤프 정책을 설정해줄수 있다.
- save <초> <변경된key수> 설정을 아예 안해줄 경우 서버는 rdb 파일로 덤프를 자동으로 뜨지 않게 된다.(클라이언트 단에서 bgsave 나 save 명령을 내려야 덤프를 뜨게 된다.)
- rdb 파일로 덤프하는 것은 메모리의 내용을 통째로 파일로 복사하는 것으로 순간적인 부하를 주게 되므로 위 설정을 조절해줘야 한다.
- 테스트나 개발시 덤프 파일이 빨리 써지는 것을 보려면 저 값을 줄이면 되고 (save 10 1 같은 식으로)
- 실제 서비스에서는 너무 자주 동기화가 일어나게 되면 안된다.
- rdbcompression yes
- rdb 파일로 덤프할 때 텍스트 부분을 압축하여 rdb 파일의 사이즈를 줄인다. 사용하지 않으려면 no 를 설정해준다.
- 압축을 하는 만큼 약간의 부하가 걸리지만 요즘 장비의 성능에서는 허용할 만한 수준으로 가능하면 사용하는것이 좋다.(서비스가 커지면 덤프 파일 크기가 장난 아니게된다)
- 시스템 부하가 걱정된다면 일단 yes 로 쓰다가 부하가 걸린다면 no 로 변경하는것이 좋을듯 하다.
- dbfilename dumb.rdb
- 덤프할 때 rdb 파일의 경로.
- 또한 redis 서버를 실행할 때 이 부분이 설정되어 있다면, 이 파일에 있는 내용을 메모리에 올리게 된다.
- 설사 save 설정을 사용하지 않는 상태라 해도 이 줄은 사용이 가능하다. 즉 레플리카 셋을 구성했을 경우 다음과 같은 활용이 가능하다.
- 마스터노드 에서 쓴 내용이 슬레이브노드에 복제됨
- 슬레이브노드에서 save 를 통해 rgb 파일을 덤프함
- 마스터노드에서 서버를 다시 실행할 때 슬레이브노드에서 덤프한 rgb 파일을 이용 메모리 에 db 내용을 살림
- dir ./
- dbfilename 로 설정해준 rdb 파일이 저장되는 디렉토리. 이걸 왜 분리시켜놨는지 모르겠다는 -_-;
- 어쨓든 기본값은 서버를 실행한 경로에 rdb 파일이 남게 되어 있는데, 이대로 두지 말고 rdb 파일을 저장하는 디렉토리를 따로 만들어서 절대 경로로 써주도록 하자.
REPLICATION (레플리카 셋 구성 설정)
- 레플레카 셋과 관련, 마스터노드 쪽 설정파일에서는 SECURITY 영역의 requirepass 부분 설정 말고는 해줄게 없다.(물론 방화벽 설정은 다른 차원의 문제). 즉 아래 내용들은 모두 슬레이브노드 에서만 설정해주면 되는 부분이다.
- slaveof
- 마스터노드의 ip 와 포트번호를 적어주면된다. 레플리카 셋을 구성하지 않거나 마스터노드라면 그냥 주석처리된 채로 두면 된다.
- masterauth <master-password>
- 마스터노드의 설정파일에서 requirepass 부분이 설정되어 있는 경우, 슬레이브노드의 설정파일에선 이 부분에 마스터노드의 패스워드를 적어줘야 한다.
- slave-serve-stale-data yes
- 마스터노드와의 연결이 끊겼을 경우 슬레이브노드로 들어오는 명령에 어떻게 대처할지 설정해주는 부분
- yes : 슬레이브노드에서 읽기나 쓰기 명령을 모두 받고 처리해준다.
- no : 슬레이브노드로 들어오는 모든 명령에 에러상태를 되돌려준다. 쉽게 말해 읽기 쓰기 모두 처리 안해준다.
- 마스터노드와의 연결이 끊겼을 경우 슬레이브노드로 들어오는 명령에 어떻게 대처할지 설정해주는 부분
- repl-ping-slave-period 10
- 슬레이브노드에서는 주기적으로 마스터노드에 ping 명령을 날려 마스터노드와의 접속상태를 확인하는데 그 주기(초단위)를 설정하는 부분. 기본값은 10초 이다.
- repl-timeout 60
- 이 값은 대량의 I/O 와 data 에 대한 timeout 을 설정해주는 부분인데, repl-ping-slave-period 값 보다 크게 설정해줘야 한다.
- 단위는 초단위 이고 기본값은 60초 이다.
SECURITY (보안 관련 설정)
- requirepass foobared
- 패스워드를 설정해주는 부분. foobared 를 원하는 패스워드로 변경하면 된다.
- 패스워드를 사용하지 않으려면 이 줄을 주석 처리 하면된다.
- 패스워드가 설정된 경우 redis 서버에 접속한 후에 다음 명령으로 인증을 받아야 명령 사용이 가능하다
- auth <패스워드>
- rename-command CONFIG ""
- redis 명령을 다른 이름으로 바꿔주거나 아예 사용을 못하도록 설정하는 부분이다.
- 예를 들어 SET 라는 명령을 SET2 라고 변경하려면 다음과 같이 하고
- rename-command SET "SET2"
- CONFIG 라는 명령을 아예 못 쓰게 막으려면 다음과 같이 해준다.
- rename-command CONFIG ""
LIMITS (접속 및 메모리 사용 설정)
- maxclients 128
- redis 서버에서 클라이언트의 접속을 동시에 몇 개 까지 받아들일지 설정하는 부분.
- 0 으로 할 경우 무제한으로 접속을 받아들인다.
- 설정된 수를 초과하여 클라이언트 접속이 시도되는 경우 에러를 반환해준다.
- maxmemory
- 서버에서 사용할 물리적 메모리 양을 결정한다. 이 메모리양에는 실제 데이타는 물론 각종 설정 상태를 기억하는 부분 까지 포함된다.
- 그냥 숫자만 쓰면 바이트 단위가 되며, 다음과 같은 표기도 가능하다.
- 1k : 1000 bytes
- 1kb : 1024 bytes
- 1m : 1000000 bytes
- 1mb : 1024*1024 bytes
- 1g : 1000000000 bytes
- 1gb : 1024*1024*1024 bytes
- maxmemory-policy volatile-lru
- maxmemory 에서 설정한 메모리 를 초과해서 데이타를 쓰려고 할 경우의 정책 설정 부분으로 아래와 같은 옵션이 있다.
- volatile-lru : (기본값) 만기시각이 설정된 key 들 중에서 LRU algorithm 에 의해 key 를 골라 삭제
- allkeys-lru : LRU algorithm 에 의해 key 를 골라 삭제
- volatile-random : 만기시각이 설정된 key 들 중에서 랜덤하게 key 를 골라 삭제
- allkeys-random : 랜덤하게 key 를 골라 삭제
- volatile-ttl : 만기시각이 설정된 key 들 중에서 만기시각이 가장 가까운 key 를 골라 삭제
- noeviction : 어떤 key 도 삭제하지 않고 error on write operations 를 돌려준다.
- LRU algorithm : Least Recently Used 로 최근에 가장 적게 사용한 메모리 공간을 비워버리고 활용하는 오라클 메모리 관리 방법
- maxmemory 에서 설정한 메모리 를 초과해서 데이타를 쓰려고 할 경우의 정책 설정 부분으로 아래와 같은 옵션이 있다.
- maxmemory-samples 3
- LRU algorithm 이나 만기시각으로 key 를 골라낼때 정확하게 조건에 맞는 key 를 골라내는게 아니라, 효율을 위해 몇개인가 key 들을 선택해 그 중에 최근에 덜 사용한 key 를 골라내는 방식을 사용한다. 이때 그 몇개인가 골라내는 key 들의 수를 설정해주는 부분.
- 내 예상으로는 값이 클 수록 더 빨리 버릴 키를 골라낼수 있을 것 같다. 정확히 확인하려면 엄청 많은 데이타를 메모리에 올려 메모리를 풀 상태로 만든 뒤 이 값이 1일 때와 큰값(10000000 정도?) 인 경우에 새 key 값이 설정되는 시간을 비교해야 알 수 있을거 같다.
APPEND ONLY MODE (AOF 지속성 설정)
- RDB 지속성 설정과는 달리, AOF 지속성 설정은 메모리->파일 쓰기 와 파일->메모리 읽기를 따로 설정할 수 없다.
- appendonly no
- aof 모드를 쓸지 여부를 설정. 사용할 경우는 yes 로 바꿔준다.
- appendfilename /usr/local/redis/dump/master_appendonly.aof
- aof 파일의 풀 경로. rdb 설정과는 달리 경로와 파일명을 따로 쓰지 않는다.
- appendfsync everysec
- aof 파일에 쓰는 주기를 결정하는 설정. 다음과 같이 3가지가 있다.
- always : 매 명령마다 파일에 쓴다. 이는 너무 잦은 I/O 로 시스템에 부하를 줄 수 있다.
- everysec : 매 초마다 파일에 쓴다. 기본값이며 가장 무난하다.
- no : 파일에 쓸 내용들을 OS 의 출력버퍼에 집어 넣고, 파일에 쓰는 시점은 OS 에 맡겨버린다.
- 그냥 everysecond 쓰고 1초안에 손실되는 내용 포기하는게 갑 인듯 하다. always 는 성능에 문제를 줄 수 있다.
- aof 파일에 쓰는 주기를 결정하는 설정. 다음과 같이 3가지가 있다.
- no-appendfsync-on-rewrite no
- redis 서버의 동작 중 디스크에 큰 파일을 쓰는 작업이 두가지 있는데 Log rewritng 과 bgsave 이다.
- apendfsync 옵션으로 always 나 everysec 를 사용중인 상태에서 "Log rewritng" 이나 "bgsave" 를 하게 되면 서로 disk I/O 에 방해가 될 수 있게 된다.
- 이를 방지하는 옵션이 이 설정인데 yes 로 할 경우 "Log rewritng" 이나 "bgsave" 을 하는 중에는 aof 파일에 쓰기를 하지 않게된다.
- 지연 문제가 발생하지 않으면 그냥 기본값인 no 로 쓰고, 문제가 생기면 yes 를 쓰라고 한다.
- yes 로 할경우 최악의 시나리오일때 30초 이상의 변경내용을 잃어버릴 수 있다고 한다.(보통은 사고가 발생해도 aof 지속성 사용시 1초 미만의 변경내용을 잃게된다)
- auto-aof-rewrite-percentage 100
- 최근 Log rewriting 이 일어났을때 aof 파일 크기에 비해 현재 aof 파일 크기가 여기서 설정해준 % 보다 커야 Log rewriting 이 일어난다고 한다.
- 이 설정에 앞서 최소한 aof 파일의 크기가 auto-aof-rewrite-min-size 에 설정해준 값보다는 큰게 우선조건이다.
- 근데 여러가지로 테스트 해보았지만 이 수치가 어떻게 적용되는지 정확하게 모르겠다. 그냥 기본설정으로 써도 무리는 없을 듯.
- Log rewritng 을 사용하지 않으려면 이 값을 0 으로 하면 된다.
- auto-aof-rewrite-min-size 64mb
- Log rewriting 이 일어나기 위한 aof 파일의 최소 크기. 일단은 그냥 써보자
SLOW LOG
- 연구 안함
- slowlog-log-slower-than 10000
- slowlog-max-len 128
VIRTUAL MEMORY (가상메모리 설정)
- 연구 안함
- vm-enabled no
- vm-max-memory 0
- vm-page-size 32
- vm-pages 134217728
- vm-max-threads 4
- set-max-intset-entries 512
ADVANCED CONFIG
- string 형을 제외한 4개의 데이타형은 포함하고 있는 요소의 개수나, 가장 긴 요소의 길이에 따라 인코딩방식(key 의 값을 저장하는 방식)이 달라진다. 이에 관한 설정을 해주는 부분이다.
- hash-max-zipmap-entries 512
- hash 에 포함된 필드의 종류가 이 값보다 크면 hashtable 로 아니면 zipmap 으로 encoding 된다.
- hash-max-zipmap-value 64
- hash 에 포함된 필드의 값중 가장 긴 값의 길이가 이 값보다 크면 hashtable 로 아니면 zipmap 으로 encoding 된다.
- list-max-ziplist-entries 512
- list 에 포함된 요소의 개수가 이 값보다 크면 linkedlist 로 아니면 ziplist 로 encoding 된다.
- list-max-ziplist-value 64
- list 에 포함된 요소중 가장 긴 요소의 길이가 이 값보다 크면 linkedlist 로 아니면 ziplist 로 encoding 된다.
- set-max-intset-entries 512
- set(집합 형) 에 포함된 요소의 개수가 이 값보다 크거나 정수가 아닌 요소가 하나라도 포함되어 있다면 hashtable 로 아니면 intset 으로 encoding 된다.
- zset-max-ziplist-entries 128
- zset(정렬된집합 형) 에 포함된 요소의 개수가 이 값보다 크면 skiplist 로 아니면 ziplist 로 encoding 된다.
- zset-max-ziplist-value 64
- zset(정렬된집합 형) 에 포함된 요소중 가장 긴 요소의 길이가 이 값보다 크면 skiplist 로 아니면 ziplist 로 encoding 된다.
- activerehashing yes
- hash table 의 rehashing 을 돕기위해 CPU 시간 100 밀리초 마다 1 밀리초를 사용하도록 설정하는 옵션. 이라고 하는데 잘 모르겠다.
- CPU 시간 1%을 이용해 메모리의 반환을 조금 더 빨리 해주도록 하는 옵션인거 같다. 일단 yes 로 두자.
INCLUDES
- 설정파일을 통짜로 하지 않고 여러 조각의 파일로 나누어 쓸 경우 include 를 사용한다.
- include /path/to/local.conf
- 포함시킬 설정 파일의 경로
redis command
Keys 관련
DEL key [key ...]
- 설명 : key 들을 삭제해준다.
- 파라미터
- key : 삭제할 key 들을 공백으로 구분해 써준다.
- 리턴값 : 실제로 삭제한 키들의 개수를 반환
DUMP key
- 설명 : redis 2.6.0. 이상부터 지원되는 명령. key 에 저장된 값을 redis 에서 사용하는 포맷으로 직렬화 시켜 출력해준다. 이 직렬화된 값은 RESTORE 명령으로 다시 원래 값으로 되돌릴 수 있다.
- 파라미터
- key : 값을 직렬화 시킬 key
- 리턴값 : 직렬화된 값
EXISTS key
- 설명 : 메모리에 key 가 존재하는지 체크
- 파라미터
- key : 체크할 key
- 리턴값 : key 가 존재하면 1, 아니면 0
EXPIRE key seconds
- 설명 : key 에 만기시각을 설정해준다.
- 파라미터
- key : 만기시각을 설정해줄 key
- seconds : 지금부터 몇 초후에 만기시킬지 값
- 리턴값 : 만기시각 설정에 성공하면 1, 실패하면 0
EXPIREAT key timestamp
- 설명 : key 에 만기시각을 설정해준다.
- 파라미터
- key : 만기시각을 설정해줄 key
- timestamp : 만기시킬 unixtimestamp
- 리턴값 : 만기시각 설정에 성공하면 1, 실패하면 0
KEYS pattern
- 설명
- 패턴에 맞는 키를 찾아서 출력해준다.
- 노트북 정도의 성능에서 100만개 키를 가진 DB 를 검색하는데 40밀리초 정도가 소요된다고 한다.(즉 충분히 빠르다)
- 그렇다고 해도 이 명령을 서비스 상에서 사용하려면 극도로 주의해야 한다. 예상할 수 있겠지만 아주 큰 DB 에서 패턴에 맞는 key 들을 찾아내면 성능에 영향을 줄 수 있다.
- 서비스 에서 key 들을 검색해야 하는 명령이 필요하다면 차라리 sets 등을 활용하는게 나을 것이다.
- 파라미터
- pattern : key 를 검색할 패턴으로 아래 예들을 참고
- h?llo matches hello, hallo and hxllo
- h*llo matches hllo and heeeello
- h[ae]llo matches hello and hallo, but not hillo
- pattern : key 를 검색할 패턴으로 아래 예들을 참고
- 리턴값 : 찾은 key 들의 목록
MIGRATE host port key destination-db timeout
- 설명
- 이 명령은 한 redis 서버 에서 다른 redis 서버로 한 key 를 옮기는 명령이다.
- 2.6.0 부터 지원한다.
- 내부적으로 다음과 같은 액션이 일어난다.
- 출발지 redis 서버에서 DUMP+DEL
- 목적지 redis 서버에서 RESTORE
- 파라미터
- host : 목적지 redis 서버 host
- port : 목적지 redis 서버 port 번호
- key : 옮길 key
- destination-db : 목적지 redis 서버 의 DB index
- timeout : timeout
- 리턴값 : status reply 참고. 성공시는 OK 를 리턴한다.
MOVE key db
- 설명 : key 를 다른DB(다른 index의 DB) 로 옮긴다.
- 파라미터
- key : 옮길 key
- db : 목적지 DB 의 index
- 리턴값 : 옮기는데 성공하면 1, 아니면 0
OBJECT subcommand [arguments [arguments ...]]
- 설명 : key 와 관련된 redis 객체의 내부를 검사 해주는 명령. 이라고 되어 있는데 key 에 저장된 데이타에 대한 row 한 레벨의 정보 몇 가지를 확인하는 명령으로 보인다. 일단 이런 명령이 있다는 정도만 알아두면 될 듯.
- 파라미터 : subcommand 에 따라 용도가 다르다.
- OBJECT REFCOUNT key : key 의 값을 참조하는 수를 구해준다는데 아직까진 1 밖에 못 본 상태.
- OBJECT ENCODING key : key 의 값이 인코딩 방식.
- Strings : raw or int
- Lists : ziplist orlinkedlist
- Sets : intset or hashtable
- Hashes : zipmap or hashtable
- Sorted Sets : ziplist or skiplist
- OBJECT IDLETIME key : key 가 유휴 상태였던 시간. 아마 메모리상에서 읽히지 않았던 시간 같은데 정확한 내부 구현이나 값은 모르겠다.
- 리턴값 :
PERSIST key
- 설명 : 만기시각을 없애 버림
- 파라미터
- key : 만기시각을 없앨 key
- 리턴값 : 성공하면 1, 아니면 0
PEXPIRE key milliseconds
- 설명 : key 에 만기시각을 밀리초 단위로 설정해준다.(2.6.0 이상 지원)
- 파라미터
- key : 만기시각을 설정해줄 key
- milliseconds : 지금부터 몇 밀리초후에 만기시킬지 값
- 리턴값 : 만기시각 설정에 성공하면 1, 실패하면 0
PEXPIREAT key milliseconds-timestamp
- 설명 : key 에 밀리초 단위로 만기시각을 설정해준다.(2.6.0 이상 지원)
- 파라미터
- key : 만기시각을 설정해줄 key
- milliseconds-timestamp : 만기시킬 unixtimestamp 의 밀리초 환산값
- 리턴값 : 만기시각 설정에 성공하면 1, 실패하면 0
PTTL key
- 설명 : 해당 key 가 만기되기까지 남은 밀리초 값(2.6.0 이상 지원)
- 파라미터
- key : 체크할 key
- 리턴값 : 구한 밀리초 값. 못 구한경우 -1
RANDOMKEY
- 설명 : 현재 DB 에서 랜덤하게 key 를 하나 구해준다.
- 파라미터 : 없음
- 리턴값 : 구한경우 구한 key, 빈 DB 인 경우 nil
RENAME key newkey
- 설명 : key 이름을 변경해준다. 만약 newkey 가 이미 존재하는 key 라면 덮어씌워 버리게 된다.
- 파라미터
- key : 원래 key 이름
- newkey : 새 key 이름
- 리턴값 : 성공하면 OK, 실패하면 에러메시지
RENAMENX key newkey
- 설명 : key 이름을 변경해준다. 만약 newkey 가 이미 존재하는 key 라면 실패한다.
- 파라미터
- key : 원래 key 이름
- newkey : 새 key 이름
- 리턴값 : 성공시 1, 실패시 0
RESTORE key ttl serialized-value
- 설명 : DUMP 명령으로 구한 직렬화된 값을 다시 메모리 상에 올림
- 파라미터
- key : 직렬화된 값을 복구해서 넣을 key 이름
- ttl : 만기시각 초단위 값. 0으로 하면 만기시작 설정안함
- serialized-value : DUMP 명령으로 구한 직렬화된 값
- 리턴값 : 성공하면 OK, 실패하면 에러메시지
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
- 설명 : list, set, sorted set 형의 key 에 포함된 요소들을 파라미터들로 정해준 조건대로 정렬해서 보여준다.
- 파라미터
- key : 요소들을 보여줄 key
- [BY pattern] : (이 key 외의) 다른 key 값들을 이용해서 이 key 의 요소들을 정렬하고 싶을때 사용. 예를 들어
- mylist 라는 list 형의 key 에 "kweok", "kim", "park", "jung", "lee" 라는 요소들이 있고
- count_kim 이라는 string 형의 key 에 100 이라는 값이 있고
- count_lee 이라는 string 형의 key 에 82 이라는 값이 있고
- count_park 이라는 string 형의 key 에 55 이라는 값이 있고
- count_jung 이라는 string 형의 key 에 47 이라는 값이 있을 때,
- mylist 의 요소들을 count_* 에 해당하는 key 들의 값에의해 정렬하고 싶다면
- sort mylist by count_* 라고 실행 해주면 된다.
- 정렬안하기 : 정렬에 대한 오버헤드 없이 SORT 명령을 쓰기 위해서는 BY nosort 라고 해주면 된다.
- [LIMIT offset count] : 정렬 결과에서 일부만 보고 싶을때 offset count 값을 넣어준다.
- [GET pattern [GET pattern ...]] : 요소의 값 말고 해당 요소를 key 이름에 포함하고 있는 key 의 값을 출력하고 싶을때 사용. GET 은 여러 필드를 표현하기 위해 여러번 사용 가능한데, GET # 이라 할 경우 원래 요소의 값이 보여진다. 예를 들어
- userids 라는 list 형의 key 에 "10", "17", "21", "22", "27" 이라는 요소들이 있고
- string 형인 username_10, username_17, username_22 라는 key 들에 각각 "Huni Kim", "Suwon Lee", "James Park" 라는 값들이 있으며
- string 형인 age_10, age_21, age_22, age_27 라는 key 들에 각각 34, 27, 16, 24 라는 값들이 있다면
- sort userids get # get username_* get age_* 같이 실행하면 다음과 같이 구해진다.
- "10" <-- userids 의 첫번째 요소
- "Huni Kim" <-- username_10 의 값
- "34" <-- age_10 의 값
- "17"" <-- userids 의 두번째 요소
- "Suwon Lee" <-- username_17 의 값
- (nil) <-- age_17 의 값
- "21"" <-- userids 의 세번째 요소
- (nil) <-- username_21 의 값
- "27" <-- age_21 의 값
- "22"" <-- userids 의 네번째 요소
- "James Park" <-- username_22 의 값
- "16" <-- age_22 의 값
- "27"" <-- userids 의 다섯번째 요소
- (nil) <-- username_27 의 값
- "24" <-- age_27 의 값
- [ASC|DESC] : 정렬결과를 오름차순으로 보려면 ASC(기본값), 내림차순으로 보려면 DESC 를 넣어준다.
- [ALPHA] : 정렬은 기본적으로 수(정수 와 실수) 기준으로 하게 되며 수가 아닌경우 0 으로 처리 된다. 이때 문자열 기준으로 정렬하고 싶으면 ALPHA 를 포함시키면 된다.
- [STORE destination] : 정렬 결과를 출력하지 않고 destination 로 정해준 key 에 넣어준다.
- 리턴값 :
TTL key
- 설명 : 해당 key 가 만기되기까지 남은 초 값
- 파라미터
- key : 체크할 key
- 리턴값 : 구한 초 단위값. 못 구한경우 -1
TYPE key
- 설명 : 해당 key 의 데이타 형을 구해준다.
- 파라미터
- key : 데이타형을 구할 key
- 리턴값 : key 의 데이타 형을 구한 경우 "string", "list", "set", "zset" or "hash". 못 구한 경우 "none"
Strings Data Type 관련
APPEND key value
- key 의 값 뒤에 value 를 추가해준다.
SETRANGE key offset value
- key 에 저장된 문자열의 offset 부분부터 value 값을 덮어 씌워버린다.
GETRANGE key start end
- key 에 저장된 문자열의 start ~ end 범위의 부분 문자열을 구해준다.(substring 이라는 함수와 비슷하다.)
STRLEN key
- key 에 저장된 문자열의 길이를 구해준다.
DECR key
- key 에 저장된 정수 값에서 정수 1을 빼준다.
DECRBY key decrement
- key 에 저장된 정수 값에서 정수 decrement을 빼준다.
INCR key
- key 에 저장된 정수 값에 1을 더해준다.
INCRBY key increment
- key 에 저장된 정수 값에 정수 increment 를 더해준다.
INCRBYFLOAT key increment
- key 에 저장된 실수 값에 increment 를 더해준다. (2.6.0 이상 지원)
SET key value
- key 에 value 를 저장한다.
SETNX key value
- key 에 value 를 저장한다. 단 key 에 이미 값이 저장되어 있는 경우 실패한다.
SETEX key seconds value
- key 에 value 를 저장하면서 만기시각을 seconds 초 후로 설정한다.
PSETEX key milliseconds value
- key 에 value 를 저장하면서 만기시각을 milliseconds 밀리초 후로 설정한다. (2.6.0 이상 지원)
MSET key value [key value ...]
- 복수개의 key 들에 각각의 value 를 저장해준다.
MSETNX key value [key value ...]
- 복수개의 key 들에 각각의 value 를 저장해준다. 단 나열한 key 중에 이미 값이 저장되어 있는 key 가 하나라도 있다면 모든 set 은 실패한다.
GETSET key value
- key 에 value 를 저장하고, 원래 있던 값을 구해준다.
GET key
- key 의 값을 구해준다.
MGET key [key ...]
- 복수개의 key 들의 값들을 구해준다.
SETBIT key offset value
- key 의 offset 번째 비트에 value(0 or 1) 을 셋해준다.
- offset 과 해당하는 bit 의 값의 관계이다.
offset | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | ... |
bit값(10) | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 128 | 64 | 32 | ... |
key value | \x80 | \x40 | \x20 | \x10 | \x08 | \x04 | \x02 | \x01 | \x00\x80 | \x00\x40 | \x00\x20 | ... |
GETBIT key offset
- SETBIT 명령으로 값이 정해진 key 의 offset 번째 bit 값(0 or 1) 을 구해준다. 자세한건 SETBIT 명령 참고
Hashes Data Type 관련
Lists Data Type 관련
Sets Data Type 관련
Sorted Sets Data Type 관련
Pub/Sub 관련
- 이기능은 대화방 이나 메신저를 만들때 사용하는 부분 같다.(예상임)
- 다음과 같은 테스트를 해보았다.
- 동일한 redis 서버에 3개의 클라이언트를 접속 시켰다. 편의상 1번 2번 3번 클라이언트라 칭하겠다.
- 1번 클라이언트에는 subscribe ch1 ch2 ch3 이라는 명령을 실행했다. (ch1, ch2, ch3 이라는 채널에서 들어오는 메시지를 기다리란 뜻)
- 2번 클라이언트에는 subscribe ch1 ch4 라는 명령을 실행했다. (ch1, ch4 라는 채널에서 들어오는 메시지를 기다리란 뜻)
- 3번 클라이언트에서 publish ch1 "hi hi hi" 라고 하자 1번, 2번 클라이언트에 "hi hi hi" 라는 메시지가 떴다.
- 3번 클라이언트에서 publish ch2 "hello~" 라고 하자 1번 클라이언트에만 "hello~" 라는 메시지가 떴다.
- 3번 클라이언트에서 publish ch3 "world" 라고 하자 1번 클라이언트에만 "world" 라는 메시지가 떴다.
- 3번 클라이언트에서 publish ch4 "good !!" 라고 하자 2번 클라이언트에만 "good !!" 라는 메시지가 떴다.
- redis-cli 에서는 subscribe 나 psubscribe 실행한 후에 더이상 명령을 입력받지 않게 되므로 unsubscribe 나 punsubsribe 를 어떻게 입력하는가 하는 의문이 들 수 있다. telnet 등으로 해당 redis 서버에 접속해서 subscribe 명령을 입력해보면 listen 상태가 되어서도 unsubscribe 명령이 입력가능한 것을 확인할 수 있다.
SUBSCRIBE channel [channel ...]
- 나열한 channel 들에 해당하는 채널들로 들어오는 메시지를 대기(listen) 하는 명령.
PSUBSCRIBE pattern [pattern ...]
- 나열한 pattern 들에 일치하는 채널들로 들어오는 메시지를 대기(listen) 하는 명령.
PUBLISH channel message
- channel 이라는 채널에 message 를 메시지로 보낸다. channel 에 해당하는 채널에서 listen 중인 클라이언트 들 모두에게 메시지가 전달된다.
UNSUBSCRIBE [channel [channel ...]]
- channel 들 에서의 listen 을 취소한다.
PUNSUBSCRIBE [pattern [pattern ...]]
- pattern 에 매칭되는 채널 들에서의 listen 을 취소한다.
Transactions 관련
- redis 에서 제공하는 트랜잭션은 좀 쓰기가 애매하다.
- 일단 트랜잭션 에 대한 롤백이 되지 않는다.
- 트랜잭션 실행 중에 어떤 명령이 실패해도 뒤에 명령들은 그대로 실행이 되어버린다.
MULTI
- 트랜잭션의 준비를 알리는 명령. MULTI 명령 후에 입력한 명령 들은 EXEC 명령이 실행되기 전까지 실행되지 않고 큐에 쌓인다.
EXEC
- 트랜잭션을 실행시키는 명령. MULTI 명령 후에 입력한 명령들은 EXEC 명령이 실행되면 차례대로 실행된다.
DISCARD
- MULTI 명령 후, EXEC 실행전에 이 명령을 실행하면 큐에 쌓인 명령들을 지워버린다. MULTI 역시 실행안한 상태가 된다.
WATCH key [key ...]
- ????
UNWATCH
- watch 중인 key 들의 watch 를 취소함.
Scripting 관련
- Lua Script 를 실행해주는 명령 들인데 redis 2.6.0 에서부터 지원한다.
Connection 관련
AUTH password
- 접속한 redis 서버에 패스워드가 걸려있는 경우, 이 명령으로 인증을 받아야 명령 사용이 가능하다.
- 패스워드 설정은 설정파일의 requirepass 부분을 변경해주면 된다.
ECHO message
- message 를 그대로 출력해준다. 접속이 정상적으로 되었는지 등을 확인할 때 사용.
PING
- 접속상태를 확인하게 입력해보는 명령. 정상적으로 접속되어있다면 PONG 이라는 문자열을 출력해준다.
QUIT
- redis 서버와의 접속을 끊는다.
SELECT index
- 사용할 DB 의 index 를 선택한다. index 의 시작은 0 이며, 따로 SELECT 명령을 사용하지 않을 경우 0 번 DB 가 선택되어 있게 된다.
- DB 의 index 로 사용가능한 최대 값은 설정파일의 databases 부분의 값을 변경하면 된다.
Server 관련
SAVE
- 동기적으로 RDB 파일을 쓰게한다.
BGSAVE
- 비동기적으로 RDB 파일을 쓰게한다.
BGREWRITEAOF
- 비동기적으로 AOF 파일을 쓰게한다.
CONFIG GET parameter
- 설정 parameter 의 값을 보여준다.
- parameter 에 패턴도 입력이 가능하다. 즉 CONFIG GET * 라고 실행하면 모든 설정값들을 확인할 수 있다.
CONFIG SET parameter value
- 설정 parameter 의 값을 value 로 설정한다.
CONFIG RESETSTAT
- INFO 명령에 의해 구해진 통계를 재설정 하는 명령. 이라는데 뭐에 쓰는건지 모르겠다.
DEBUG OBJECT key
- key 의 디버깅 정보를 보여주는데, 문서에 보면 클라이언트 단에서 사용하면 안된다고 되어 있다(그럼 왜 만들어둔거야;) 이 명령 대신 OBJECT 명령을 사용하라고 한다.
DEBUG SEGFAULT
- 잘못된 메모리 접근을 통해 접속해 있는 redis 서버를 crash 시켜 버린다.
- 말그대로 접속해 있는 redis 서버를 죽여버리게 된다. 서버 프로세스가 kill 되어버린다.
- 버그 상황을 테스트 하기 위해 제공되는 명령으로 당연히 서비스 중인 서버에 사용하면 안된다.
MONITOR
- 접속한 redis 서버에 들어오는 모든 명령들을 실시간으로 확인할 수 있게 된다.
INFO
- 현재 redis 서버의 정보 및 통계 를 알려준다.
- 메모리 사용량, redis 서버 작동시간, key 들에 대한 정보, 최근 파일 동기화(지속성) 관련 정보 등을 알 수 있다.
- 모니터링 툴을 만든다면 이 명령 결과를 이용해야 할 것이다.
LASTSAVE
- 마지막으로 save 나 bgsave 가 일어난 시각을 unix timestamp 값으로 알려준다.
- 즉 RDB 지속성 에 의해 파일 쓰기가 일어난 최근 시각을 알려주는 명령
DBSIZE
- 현재 사용중인(select 명령으로 선택된) DB 에 저장되어 있는 모든 key 의 개수를 알려준다.
FLUSHALL
- 모든(select 된것만이 아니라) database 에서 모든 key 를 삭제해버린다.
- 당연한 얘기지만 사용에 주의하자
FLUSHDB
- 현재 select 된 DB 의 모든 key 들을 삭제해버린다.
SHUTDOWN [NOSAVE] [SAVE]
- 데이타 손실 없이 redis 서버를 안전하게 종료시킨다. 구체적으로 다음과 같은 일이 일어난다.
- 모든 클라이언트를 stop 시킨다.
- (설정파일에 save 설정이 한 줄 이라도 있다면)RDB 파일을 쓴다.
- (설정파일에 aof 사용이 활성화 되어 있다면)AOF 파일을 쓴다.
- redis 서버를 종료시킨다.
- 문서에는 NOSAVE 나 SAVE 를 파라미터로 쓸수 있다고 되어 있는데, redis-cli 상에서 써보면 파라미터 개수 자체가 안 맞다면서 에러가 난다. 어쨓든 문서상에 설명은 다음과 같다.
- SHUTDOWN NOSAVE : 설정파일에 RDB 나 AOF 설정이 어떻게 되어있던간에 디스크에 쓰는 과정 생략하고 종료해버린다.
- SHUTDOWN SAVE : 설정파일에 save 설정이 전혀 없더라도(물론 dbfilename 설정은 되어 있어야하겠지?) RDB 파일 쓰기를 하고 종료한다.
SLAVEOF host port
- 현재 접속한 redis 서버를 다른 redis 서버(host 와 port 로)의 (레플리카셋의)slave 로 만든다.
- 만약 이미 다른 master node 의 slave node 로 있는 서버에서 이 명령을 실행하면, 옛날 master node 와의 연결은 끊어지고 새로 입력한 node 를 master 로 삼게 된다.
- SLAVEOF 명령은 현재 연결되어 있는 master node 와의 연결을 끊는데도 사용할 수 있는데 다음처럼 실행하면 된다.
- SLAVEOF NO ONE
SLOWLOG subcommand [argument]
- 확인못함
SYNC
- 복제에 사용되는 내부 명령어(즉 건들필요 없단 건데, 그럼 뭐하러 외부에 꺼내놨나 --;)
TIME
- 현재 서버의 시간을 구해준다. (2.6.0 이상 지원)
'기술노트' 카테고리의 다른 글
윈도우즈에서 SVN 저장소 GIT 로 옮기기 (0) | 2015.02.23 |
---|---|
Predis pipeline 효용 연구 (0) | 2012.06.12 |
아파치 및 이클립스 등 에서 사용자 정의 확장자 추가하기 (0) | 2012.05.31 |