테스트 진행시 레디스의 사용한 메모리를 측정하려면 INFO 명령어를 활용하면 된다.

실행하기 전에 FLUSHALL 메모리를 먼저 초기화한다. 

$ redis-cli FLUSHALL


$ redis-cli INFO memory

# Memory

used_memory:575552

used_memory_human:562.06K

used_memory_rss:32047104

used_memory_peak:32080496

used_memory_peak_human:30.59M

used_memory_lua:40960

mem_fragmentation_ratio:55.68

mem_allocator:libc


$ node test.js


$ redis-cli INFO memory

# Memory

used_memory:14424128

used_memory_human:13.76M

used_memory_rss:41230336

used_memory_peak:37663136

used_memory_peak_human:35.92M

used_memory_lua:40960

mem_fragmentation_ratio:2.86

mem_allocator:libc




사용한 메모리는 13,848,576이다.

14424128 - 575552=13,848,576


이 원리를 이용하여 레디스에서 사용한 메모리를 뽑는 간단히 만들었다.



memory-used.sh 파일이다. 원리는 위의 레디스 실행 코드 기반이다.

#!/bin/sh


ok=`redis-cli FLUSHALL`

echo "redis memory flush all : ${ok}"


before=`redis-cli INFO memory | grep 'used_memory:' | awk -F: '{print $2}'`

b=`echo "${before//[$'\t\r\n ']}"`


echo "test start"

node test.js

echo "test end"


after=`redis-cli INFO memory | grep 'used_memory:' | awk -F: '{print $2}'`

a=`echo "${after//[$'\t\r\n ']}"`


used=$(expr $a - $b)


echo "redis used memory ${used}"





실행하기. 

$ ./memory-used.sh

redis memory flush all : OK

test start

test end

redis used memory 13848576







Posted by '김용환'
,



redis 서버 실행시 ziplist 관련 설정을 커맨드 라인에 옵션을 통해서 변경가능하다.


$ redis-server --hash-max-ziplist-entries 5 --hash-max-ziplist-value 5 


$ redis-server --list-max-ziplist-entries 5 --list-max-ziplist-value 5 


$ redis-server --set-max-intset-entries 5


$ redis-server  --zset-max-ziplist-entries 5 --zset-max-ziplist-value 5





* 이제 테스트를 위해서 ziplist 관련 entry 또는 value 값을 모두 5로 낮춘다.


$ redis-server --hash-max-ziplist-entries 5 --hash-max-ziplist-value 5  --list-max-ziplist-entries 5 --list-max-ziplist-value 5  --set-max-intset-entries 5 --set-max-intset-entries 5 --zset-max-ziplist-entries 5 --zset-max-ziplist-value 5






* String 데이터 타입 

int : 64 비트 signed integer를 표현할 때

embstr : 40 바이트보다 작은 문자열을 표현할 때

raw : 40 바이트보다 큰 문자열을 포함할 때


테스트 코드
127.0.0.1:6379> SET s1 1
OK
127.0.0.1:6379> OBJECT ENCODING s1
"int"
127.0.0.1:6379> SET s2 "abc"
OK
127.0.0.1:6379>  OBJECT ENCODING s2
"embstr"
127.0.0.1:6379> SET s3 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
OK
127.0.0.1:6379>  OBJECT ENCODING s3
"raw"


* List
ziplist: List 크기가 list-max-ziplist-entries 값(5) 보다 작고, 각 List 값이 list-max-ziplist-value(5 바이트)보다 적은 바이트를 사용할 때
linkedlist: List 크기가 list-max-ziplist-entries 값(5)보다 크거나, 각 List  list-max-ziplist-value(5바이트)보다 클 때.


127.0.0.1:6379> LPUSH l1 a b
(integer) 4
127.0.0.1:6379> OBJECT ENCODING l1
"ziplist"
127.0.0.1:6379> LPUSH l2 a b c d e f g
(integer) 9
127.0.0.1:6379> OBJECT ENCODING l2
"linkedlist"
127.0.0.1:6379> LPUSH l3 "test test test"
(integer) 2
127.0.0.1:6379> OBJECT ENCODING l3
"linkedlist"
127.0.0.1:6379> LPUSH l4 "t"
(integer) 1
127.0.0.1:6379> OBJECT ENCODING l4
"ziplist"



* Set
intset: Set의 모든 요소가 integer이고, Set 개수가 set-max-intset-entries 설정보다 작을 때
hashtable: Set의 하나의 요소라도 integer가 아니거나, Set 개수가 set-max-intset-entries 설정보다 클 때

127.0.0.1:6379> SADD s1 1 2
(integer) 2
127.0.0.1:6379> OBJECT ENCODING s1
"intset"
127.0.0.1:6379> SADD s2 1 2 3 4 5 6 7 8 9 10
(integer) 10
127.0.0.1:6379> OBJECT ENCODING s2
"hashtable"
127.0.0.1:6379> SADD s3 a b c
(integer) 3
127.0.0.1:6379> OBJECT ENCODING s3
"hashtable"



* Hash
ziplist: Hash의 필드 개수가 hash-max-ziplist-entries(5)보다 크지 않고, Hash의 각 필드 이름과 값이 hash-max-ziplist-value(5바이트)보다 작을 때
hashtable: Hash 크기 또는 Hash의 값이 각각 hash-max-ziplist-entries와 hash-max-ziplist-value보다 클 때


127.0.0.1:6379> HMSET h1 a 1 b 2
OK
127.0.0.1:6379> OBJECT ENCODING h1
"ziplist"
127.0.0.1:6379> HMSET h2 a 1 b 2 c 3 d 4 e 5 f 6
OK


* Sorted Set
ziplist: Sorted Set의 개수가 set-max-ziplist-entries 설정보다 작고, Sorted Set의 엘리먼트 값이 모두 zset-max-ziplist-value(5바이트) 설정보다 작을 때
skiplist와 hashtable : Sorted Set 개수 또는 Sorted Set의 개별 값이 set-max-ziplist-entries와 zset-max-ziplist-value(5바이트) 설정보다 클 때

127.0.0.1:6379>  ZADD z1 1 a
(integer) 1
127.0.0.1:6379> OBJECT ENCODING z1
"ziplist"
127.0.0.1:6379> ZADD z2 1 asdfasdfasfasdf
(integer) 1
127.0.0.1:6379> OBJECT ENCODING z2
"skiplist"








Posted by '김용환'
,

[redis] MIGRATE 커맨드

Redis 2016. 1. 15. 01:01


로컬에 3.0.2 (6379포트) 레디스를 실행하고,

2.8.19(6378포트) 레디스를 실행했다. 총 로컬에 2개의 로컬 redis를 실행했다.


MIGRATE 커맨드는 주어진 키를 수신할 레디스 서버로 옮긴다. 

원자적 커맨드라서, 키를 옮길 때는 두 레디스 서버는 블럭된다. 내부적으로 dump, restore, del 커맨드의 조합 명령어이다.



6379 포트의 레디스에 특정 키를 저장하고,

6378 포트의 레디스에 해당 키를 MIGRATE 커맨드로 복사하는 예제이다.


6379 포트의 레디스의 redis-client

127.0.0.1:6379> set b 1

OK

127.0.0.1:6379> MIGRATE 127.0.0.1 6378 b 0 1000

OK

127.0.0.1:6379> set a 10

OK

127.0.0.1:6379> MIGRATE 127.0.0.1 6378 a 0 1000 COPY

OK



6378 포트의 레디스의 redis-client에서 a,b를 확인하면 복사된 것을 확인할 수 있다.

127.0.0.1:6378> get b

"1"

127.0.0.1:6378> get a

"10"

127.0.0.1:6378> TTL a

(integer) -1




6379 포트의 레디스의 redis-client(3.0.2)에서 하위 버전의 redis(2.8.19)로는 MIGRATE.. COPY는 동작되지만, REPLACE는 동작되지 않는다.

127.0.0.1:6379> MIGRATE 127.0.0.1 6378 a 0 1000 REPLACE

(error) ERR Target instance replied with error: ERR wrong number of arguments for 'restore' command



그리고, 목적 DB에 동일 키가 있으면 에러가 발생한다.

127.0.0.1:6379> MIGRATE 127.0.0.1 6378 a 0 1000 COPY

(error) ERR Target instance replied with error: ERR Target key name is busy.


원본 DB에 키가 없어도 에러가 발생한다.

127.0.0.1:6379> MIGRATE 127.0.0.1 6378 b 0 1000

NOKEY











Posted by '김용환'
,

[redis] PERSIST 커맨드

Redis 2016. 1. 14. 10:06



레디스의 PERSIST 커맨드는 타임 아웃을 제거한다.


예시



127.0.0.1:6379> SET a 1

OK

127.0.0.1:6379> expire a 10

(integer) 1

127.0.0.1:6379> TTL a

(integer) 8

127.0.0.1:6379> TTL a

(integer) 7

127.0.0.1:6379> PERSIST a

(integer) 1

127.0.0.1:6379> TTL a

(integer) -1

127.0.0.1:6379> get a

"1"




Posted by '김용환'
,



레디스의 SET 커맨드는 다음 문법을 가진다.


SET key value [EX seconds|PX milliseconds] [NX|XX]


EX: 만료 시간을 초로 설정한다.

PX: 만료 시간을 밀리초로 설정한다.

NX: 키가 존재하지 않으면 키만 설정한다.

XX: 키가 이미 존재하면 키만 설정한다.



EX, PX 테스트


127.0.0.1:6379> SET a 1 EX 1

OK

127.0.0.1:6379> GET a

(nil)

127.0.0.1:6379> SET a 1 PX 2000

OK

127.0.0.1:6379> TTL a

(integer) 0

127.0.0.1:6379> GET a

(nil)




* NX


키가 존재한 상태에서 NX를 사용하면, 기존 값을 계속 저장한다.


127.0.0.1:6379> SET a 1

OK

127.0.0.1:6379> SET a 2 NX

(nil)

127.0.0.1:6379> GET a

"1"


키가 존재하지 않은 상태에서 NX를 사용하지 않으면 새 값을 저장한다.


127.0.0.1:6379> GET x

(nil)

127.0.0.1:6379> SET x 2 NX

OK

127.0.0.1:6379> GET x

"2"



* XX (키가 있는 경우만 SET한다.)


키가 존재하지 않은 상태에서 XX로 설정하면 아무 것도 진행되지 않다. 


127.0.0.1:6379> GET z

(nil)

127.0.0.1:6379> SET z 5 XX

(nil)

127.0.0.1:6379> GET z

(nil)



키가 존재하면 XX로 설정하면 값이 변경된다.


127.0.0.1:6379> SET y 1

OK

127.0.0.1:6379> SET y 3 XX

OK

127.0.0.1:6379> GET y

"3"




'Redis' 카테고리의 다른 글

[redis] MIGRATE 커맨드  (0) 2016.01.15
[redis] PERSIST 커맨드  (0) 2016.01.14
[Redis] TTL 커맨드와 PTTL 커맨드  (0) 2016.01.14
[redis] EXPIRE와 EXPIREAT 커맨드  (0) 2016.01.14
[redis] RANDOMKEY 커맨드  (0) 2016.01.14
Posted by '김용환'
,


키-값을 설정시 키의 만료 시간을 주기 위해,  EXPIRE(EXPIREAT) 커맨드와 SET 커맨드의 EXPIRE(EX, PX, NX, XX) 옵션을 사용할 수 있다.

언제 데이터가 사라질지 모르니, 확인하고 싶을 때 TTL 커맨드와 PTTL 커맨드를 사용한다.


SET with EX 커맨드와 TTL커맨드 예시이다.


127.0.0.1:6379> SET aaaa value EX 10

OK

127.0.0.1:6379> TTL aaaa

(integer) 7

127.0.0.1:6379> TTL aaaa

(integer) 5

127.0.0.1:6379> TTL aaaa

(integer) 4

127.0.0.1:6379> TTL aaaa

(integer) 3

127.0.0.1:6379> TTL aaaa

(integer) 2

127.0.0.1:6379> TTL aaaa

(integer) 1

127.0.0.1:6379> TTL aaaa

(integer) 1

127.0.0.1:6379> TTL aaaa

(integer) -2

127.0.0.1:6379> GET aaaa

(nil)






SET 커맨드와 EXPIRE 커맨드를 이용한 후 TTL 커맨드를 사용한 예시이다.


127.0.0.1:6379> SET aaaa value

OK

127.0.0.1:6379> EXPIRE aaaa 100

(integer) 1

127.0.0.1:6379> TTL aaaa

(integer) 97

127.0.0.1:6379> TTL aaaa

(integer) 96

127.0.0.1:6379> TTL aaaa

(integer) 62

127.0.0.1:6379> TTL aaaa

(integer) -2

127.0.0.1:6379> GET aaaa

(nil)

127.0.0.1:6379>




PTTL은 밀리초(ms) 단위로 보여준다.


127.0.0.1:6379> SET aaaa value

OK

127.0.0.1:6379> EXPIRE aaaa 100

(integer) 1

127.0.0.1:6379> PTTL aaaa

(integer) 95233

127.0.0.1:6379> PTTL aaaa

(integer) 93521




'Redis' 카테고리의 다른 글

[redis] PERSIST 커맨드  (0) 2016.01.14
[redis] SET key value [EX seconds|PX milliseconds] [NX|XX]  (0) 2016.01.14
[redis] EXPIRE와 EXPIREAT 커맨드  (0) 2016.01.14
[redis] RANDOMKEY 커맨드  (0) 2016.01.14
[Redis] CLIENT KILL 커맨드  (0) 2016.01.14
Posted by '김용환'
,




EXPIRE 커맨드는 주어진 키의 타임아웃을 초 단위로 설정한다. 

키는 특정 초가 지난 후 삭제된다. 음수의 타임아웃은 키를 바로 삭제한다


127.0.0.1:6379> MSET a 1 b 2 c 3

OK

127.0.0.1:6379> EXPIRE a

(error) ERR wrong number of arguments for 'expire' command

127.0.0.1:6379> EXPIRE a 5

(integer) 1

127.0.0.1:6379> GET a

"1"


# 5초 뒤에 보면, 키가 만료되었다.


127.0.0.1:6379> GET a

(nil)



expire실행시 키에 -1을 넣으면 바로 삭제된다. (del 커맨드와 동일하게 작동한다.)


127.0.0.1:6379> GET b

"2"

127.0.0.1:6379> EXPIRE b -1

(integer) 1

127.0.0.1:6379> GET b

(nil)



EXPIREAT 커맨드는 유닉스 타임스탬프를 기반으로 타임아웃을 설정한다. 타임스탬프가 과거가 되면 즉시 키를 삭제한다.


127.0.0.1:6379> GET c

"3"

127.0.0.1:6379> EXPIREAT c 1111

(integer) 1

127.0.0.1:6379> GET c

(nil)

'Redis' 카테고리의 다른 글

[redis] SET key value [EX seconds|PX milliseconds] [NX|XX]  (0) 2016.01.14
[Redis] TTL 커맨드와 PTTL 커맨드  (0) 2016.01.14
[redis] RANDOMKEY 커맨드  (0) 2016.01.14
[Redis] CLIENT KILL 커맨드  (0) 2016.01.14
[Redis] FLUSHALL 커맨드  (0) 2016.01.14
Posted by '김용환'
,

[redis] RANDOMKEY 커맨드

Redis 2016. 1. 14. 08:50


RANDOMKEY 커맨드는 존재하는 키 이름을 랜덤하게 리턴한다.

 

127.0.0.1:6379> set a 1

OK

127.0.0.1:6379> set b 1

OK

127.0.0.1:6379> set c 1

OK

127.0.0.1:6379> RANDOMKEY

"a"

127.0.0.1:6379> RANDOMKEY

"a"

127.0.0.1:6379> RANDOMKEY

"a"

127.0.0.1:6379> RANDOMKEY

"b"

127.0.0.1:6379> RANDOMKEY

"c"



Posted by '김용환'
,


CLIENT KILL 커맨드는 클라이언트 연결을 종료한다. IP, 포트, ID, 타입으로 클라이언트 연결을 종료할 수 있다.


1번 터미널에서 redis 클라 실행

2번 터미널에서도 redis 클라 실행


1번 터미널에서 CLIENT LIST 커맨드를 실행한다.

127.0.0.1:6379> CLIENT LIST

id=3 addr=127.0.0.1:65265 fd=6 name=LOVE-1 age=989 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

id=5 addr=127.0.0.1:49515 fd=7 name= age=74 idle=7 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=dbsize

127.0.0.1:6379>

127.0.0.1:6379>


여기서 2번 터미널을 킬한다.

127.0.0.1:6379> CLIENT KILL ADDR 127.0.0.1:49515

(integer) 1

127.0.0.1:6379> CLIENT LIST

id=3 addr=127.0.0.1:65265 fd=6 name=LOVE-1 age=1010 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

127.0.0.1:6379>


분명 연결은 끊어졌지만, 2번 터미널에서는 엔터치면서 보면 특별히 disconnected라고 뜨지 않는다. (사실은 끊어진 상태이다.)

2번 터미널에서 레디스 커맨드를 실행하면, 그제서야 서버와 연결이 된다.


127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> DBSIZE

(integer) 0



1번 터미널에서 클라이언트 목록을 확인할 수 있다. 

127.0.0.1:6379> CLIENT LIST

id=3 addr=127.0.0.1:65265 fd=6 name=LOVE-1 age=1027 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

id=6 addr=127.0.0.1:49579 fd=7 name= age=1 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=dbsize



CLIENT KILL은 ID를 이용해서 사용할 수 있다.


127.0.0.1:6379> CLIENT KILL ID 6

(integer) 1

127.0.0.1:6379> CLIENT LIST

id=3 addr=127.0.0.1:65265 fd=6 name=LOVE-1 age=1364 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client


type도 줄 수 있다. 영향 받는 클라이언트가 없으면 0을 리턴한다.

127.0.0.1:6379> CLIENT KILL TYPE slave

(integer) 0



'Redis' 카테고리의 다른 글

[redis] EXPIRE와 EXPIREAT 커맨드  (0) 2016.01.14
[redis] RANDOMKEY 커맨드  (0) 2016.01.14
[Redis] FLUSHALL 커맨드  (0) 2016.01.14
[Redis] CLIENT LIST 커맨드 / CLIENT SETNAME 커맨드  (0) 2016.01.14
[Redis] DBSIZE 커맨드  (0) 2016.01.14
Posted by '김용환'
,

[Redis] FLUSHALL 커맨드

Redis 2016. 1. 14. 08:35


FLUSHALL 커맨드는 레디스의 모든 키를 삭제한다.


127.0.0.1:6379> HSET myhash field value

(integer) 1

127.0.0.1:6379> KEYS *

1) "myhash"

127.0.0.1:6379> DBSIZE

(integer) 1

127.0.0.1:6379> FLUSHALL

OK

127.0.0.1:6379> KEYS *

(empty list or set)

127.0.0.1:6379> DBSIZE

(integer) 0


'Redis' 카테고리의 다른 글

[redis] RANDOMKEY 커맨드  (0) 2016.01.14
[Redis] CLIENT KILL 커맨드  (0) 2016.01.14
[Redis] CLIENT LIST 커맨드 / CLIENT SETNAME 커맨드  (0) 2016.01.14
[Redis] DBSIZE 커맨드  (0) 2016.01.14
[redis] info 커맨드  (0) 2016.01.14
Posted by '김용환'
,