라벨이 Redis인 게시물 표시

(Redis)레디스 운영 시 고려사항

1. 메모리 크기 레디스는 메모리에 데이터를 저장하기 때문에 레디스가 사용할 메모리의 크기를 지정하는것은 성능과 가장 밀접한 관련이 있다. 실제로 저장되는 데이터의 크기는 redisObject와 키가 저장된 크기를 뺀 나머지가 된다. 저장되는 데이터가 작은 크기의 문자열이라면 redisObject를 저장하기 위한 오버헤드가 더 크게 된다. 이럴 떄는 문자열을 숫자로 바꾸어 저장하거나, 다른 데이터형을 사용하면 더 많은 데이터를 저장할 수 있다. 만약 레디스에 저장될 데이터의 크기를 산정하지 못하여 redis.conf와 maxmemory 설정에 값을 지정할 수 없게 되었다고 하자. 그러면 레디스에 데이터가 계속 추가되어 물리 메모리를 모두 사용하게 된다. 이때 운영체제에서는 애플리케이션이 시스템에서 사용 가능한 물리 메모리 보다 더 많은 메모리를 사용하려고 할 때 스왑이라는 가상 메모리 공간을 하드디스크에 생성하여 사용하는데, 이 영역을 스왑공간이라 부른다. 이떄 스왑 공간이 충분하지 않으면 운영체제는 메모리에서 동작 중인 프로세스를 제거하여 사용가능한 메모리의 영역을 확보하게 된다. 이와 같이 동작 중인 프로세스를 죽이는 리눅스의 프로그램을  OOM킬러라고한다. 그러므로 OOM킬러를 피하려면 충분한 스왑공간을 확보해야한다. 그런데 데이터가 저장되기 시작하면 레디스의 응답시간은 수십 배에서 수백 배까지 늘어나게 된다. 만약 응답시간이 중요한 서비스라면 반드시 redis.conf의 maxmemory 설정에 설치된 물리 메모리 크기 이내의 값을 지정하여야 한다. 일반적으로 운영체제는 설치된 메모리 크기의 두 배를 스왑공간으로 할당한다. 여기서 말하는 두 배는 메모리가 충분하지 못했던 과거의 기준이다. 메모리의 가격이 저렴해지고 엔트리급 서버 시스템이 16GB이상의 메모리를 갖는 지금은 기준이 조금 달라졌다. 레드햇 엔터프라이즈의 가상 메모리 설정 가이드 문서에 따르면 시스템에 설치된 물리 메모리의 크기에 따라서 다른 값을 ...

(Redis) 레디스의 확장과 분산기법

레디스에 스케일 아웃을 처리하기 위한 방법으로 두 가지 기법을 제공한다. 읽기분산을 위한 복제(Replication)와 쓰기 분산을 위한 샤딩(Sharding)이 이에 해당된다. 1. 복제 복제는 동일한 데이터를 다중의 노드에 중복하여 저장하는 것을 말한다. 레디스는 복제를 위해 마스터와 슬레이브의 복제의 개념을 사용한다. 마스터는 복제를 위한 데이터의 원본 역할을 한다. 슬레이브는 마스터 노드에 데이터 복제 요청을 하고 데이터를 수신하여 데이터를 동기화 한다. 통상적으로 레디스 인스턴스 하나가 처리할 수 있는 TPS는 1만~2만이다. 또한 대부분의 레디스 명령은 읽기와 쓰기에 따른 성능편차가 없다. 복제는 슬레이브 노드가 마스터 노드의 데이터를 실시간으로 복제하여 데이터의 동기화를 유지한다. 슬레이브 노드가 시작할 때 마스터 노드에게 복제를 요청하고 최초 복제가 완료된 이후는 변경 사항만 업데이트 한다. 레디스의 복제는 마스터노드가 슬레이브노드의 정보를 가지지 않고, 슬레이브 노드가 마스터 노드의 위치만 알고있으면 복제를 할 수 있다. 1-1. 단일 복제 마스터노드와 슬레이브 노드 하나로 구성된다. 마스터 노드에 변경이 발생하면 실시간으로 슬레이브 노드에 데이터 변경사항이 기록된다. 하지만 슬레이브 노드에 변경이 발생하면 마스터 노드는 해당 변경 사항을 감지하지 못한다. 슬레이브 노드에서 데이터 변경이 일어나는 순간 데이터의 정합성이 무너지게 되므로 슬레이브 노드에서는 데이터의 변경을 수행하지 않아야 한다. 1-2. 다중 복제 단일 복제만으로는 필요한 읽기 성능을 만족하지 못할때 다중 복제를 고려할 수 있다. 단일 복제 구조의 클러스터에 슬레이브 노드를 추가하기 위해서는 마스터 노드의 위치정보를 슬레이브 노드에 설정하고 인스턴스를 실행하면 노드 추가가 완료된다. 이와 같이 단일 복제 상태에서 여러 대의 슬레이브 노드를 추가한 것을 다중 복제라고 한다. 마스터 노드의 재시작이 필요하지 않다. ...

(Redis) 레디스 데이터구조와 명령어 사용2

1. 해시데이터 1) hmset 명령은 주어진 필드와 값의 쌍을 해시 데이터에 저장한다. 즉, 주어진 모든 키와 값들을 저장하는데, 인자로 입력되는 필드와 값의 쌍은 다중입력이 가능하다. 2) hsetnx 주어진 필드가 존재하지 않을 떄 저장한다. 만약 주어진 필드가 존재한다면 값은 저장되지 않는다. 3) hmget 주어진 필드 목록을 주어진 키에서 조회한다. 4) hlen 주어진 키에 저장된 필드의 개수를 조회한다. 주어진 키의 데이터형이 해시가 아니면 오류를 돌려준다. 4) hdel 주어진 키에 저장된 필드를 제거한다. <숫자의 증감>  해시에 저장된 데이터의 필드값이 숫자일 때 hincrby, hincrbyfloat 명령으로 증감처리를 할 수 있다. 문자열 데이터에서 지원하는 숫자 증감 명령들과는 다르게 해시명령은 증가 명령만 을 지원한다. 숫자의 감소를 처리하기 위해서는 명령의 인자에 음수를 입력하면 된다. 1) hincrby 주어진 키에 저장된 필드에 숫자 증감처리를 한다. 만약 주어진 키가 존재하지 않으면 새로운 해시데이터를 생성한다. 2) hincrbyfloat 주어진 키에 저장된 필드에 숫자 증감처리를 한다. 단, 지정값은 배정밀도 flaot값이어야 하며, 소수점은 17자리로 고정되어 있다. <해시데이터의 키 목록 조회> 해시데이터 저장된 모든 키의목록과 모든 값의 목록을 조회할 때는 hgetall을 사용하면 된다. 키의 목록이나 값의 목록만을 조회하는 명령은 hkeys, hvals다. 2. 셋 데이터 <정렬된 셋 데이터> * 가중치 변경 1) zincrby 주어진 키에 저장된 셋 데이터 중 지정된 요소의 가중치를 입력된 값만큼 증가시킨다. 2) zrank 주어진 키에 저장된 셋 데이터 중 지정된 지정된 요소의 순위를 조회한다. 조회되는 순위는 0부터 시작하며, 정렬은 가중치 오름차순이다. 예를들어, 5개...

(Redis) 레디스 데이터 구조와 명령어 사용

이미지
1. 문자열 데이터 문자열 데이터는 키 하나에 문자열 하나를 저장할 수 있다. 저장 가능한 문자열의 크기는 최대 512MB이다. 레디스가 문자열 데이터를 저장할 때는 인코딩된 문자열과 몇 가지 부가 정보가 포함된 구조체로 변환하여 저장하며 이것을 레디스객체형이라 부른다. 1.1 문자열 데이터의 입력과 조회 레디스는 동시에 여러 키와 데이터를 저장하고 조회하는 mget, mset명령을 제공한다 -> mget 명령어를 통해 key54의 정보를 받아오려 했지만 데이터가 존재하지 않아 nil을 추력했다. 만약 3개의 키를 저장하려 할때, 그중 하나라도 이미 존재한다면 모두를 저장하지 않는 상황을 고려해보자. 어떻게 해야 할까? 3개의 키에 대하여 mget으로 데이터를 조회한뒤 mset으로 저장하는 방법을 생각할수 있다. 그러나 레디스는 이미 이러한 상황을 처리할 수 있는 명령어를 제공한다. 1) msetnx mset명령과 동일하게 키와 값의 쌍으로 이루어진 데이터를 저장하는데, 차이점은 키와 값의 쌍을 다중으로 입력하는 것이다. msetnx명령은 인자로 N개의 키와 값의 쌍을 요청했을 때 이미 존재하는 값이 하나라도 있다면 입력된 모든 키와 값은 저장하지 않는다. -> 이전에 수행된 mset 명령으로 nx:key3가 생성되었기 때문에 setnx 명령으로 nx:key3 키의 값이 저장되지 않았다. 비록 nx:key2가 아직 존재하지 않지만 nx:key3 키가 이미 존재하므로 전체 키가 저장되지 않았다. 2) getset getset 명령은 입력된 값을 저장하고 이전에 저장된 값을 돌려준다. -> getset 명령어로 이전에 저장된 'old value'의 값을 돌려주고 입력하는 값인 'new value'를 저장한다. 아직 존재하지 않는 newkey를 입력하면 이전에 저장된 값이 없으므로 nil을 돌려준다. --------------------------------...

(Redis) 레디스 성능 측정

서비스에 새로운 솔루션을 도입하려면 당연히 성능 측정히 수반된다. 얼마나 많은 요청을 한꺼번에 처리할 수 있는지와 요청하나를 처리한ㄴ데 걸리는 시간(레이턴시) 등을 측정하여 도입여부를 결정하고 도입할 하드웨어 사양을 결정한다. 레디스에서는 redis-benchmark라는 매우 강력한 도구를 자체 제공한다. 2. 응답시간 측정 운영중인 레디스가 정상적으로 작동하느지, 얼마나 빨리 응답하는 확인하는 방법이다. -latency 옵션을 사용면 원하는 정보를 얻을 수 있다. * latency 옵션은 명령이 서버로 전달되고 나서부터 응답이 돌아오기까지의 시간을 측정하는데 사용한다. 3. 주기적인 통계정보 조회 메모리 상태, 저장된 키의 개수와 같은 서버의 통계정보를 주기적으로 확인해야 한다면 별도의 프로그램을 개발하기보다는 간단한 리눅스 셸명려과 '크론탭'을 사용하는 편이 낫다.

(Redis) 기본 명령어

이미지
1. 문자열 명령 set 키 value 로 입력 예) set user:name "kris" 여기서 레디스에서는 user:name 키에 사용된 세미콜론(:) 이 거슬릴 수도 있지만, 하지만 레디스는 키 이름에는 별다른 제한이 없다. 심징 바이트 배열도 키로 사용할 수 있다. 그러나 관례상 콜론은 키에 의미를 부여하는 구분자로 사용된다 * append 명려어는 set에 저장된 마지막 키에 해당하는 value값에 새로운 문자열을 이어서 붙이는 효과이다. 예를들어 append user:name "jeong"를 하게 되면 get user:name의 값은 "krisjeong"가 된다. 1-1 incr명령어 * incr명령은 저장된 데이터의 값을 1씩 증가시킨다. 예) set login:counter "0"      incr login:counter      incr login:counter      incr login:counter     get login:counter의 값은 "3"이 나온다. 단, 저장된 값이 숫자일 때만 해당된다. *decr 명령은 키값을 1 감소시킨다.단, 저장된 값이 숫자일 떄만 해당한다. 2. 리스트 명령 레디스의 리스트 데이터는 논리적으로 링크드 리스트의 구현이다. * lpush 명령은 지정된 리스트의 맨 앞쪽에 입력된 요소를 저장한다. * lrange 명령은 지정된 리스트의 시작인덱스붜 종료인덱스 범위의 요소를 조회한다. -> 세번쨰 lpush 명령어를 주의 깊게 보자. 이처럼 레디스의 특정명령은 때에 따라 여러개의 키와 값으로 구성된 인자를 입력받을 수 있다. 이때 해당 명령의 수행시간은 입력된 인자 갯수에 비례하여 처리되므로 O(n) 처리 시간으로 표기할 수 있다. 그러나 저장된 데이터의 양과는 무관하게 개별적인 입력 연산은 O(1) 의 처리 시간을 보인다. ...