Redis
Key/Value database, In memory database. Message Queue, Shared Memory Data store 용도로 사용. 다양한 데이터 타입(String, Set, List 등) 지원하며 셔버 shutdown/restart 될때를 대비하여 디스크 저장기능(RDB, AOF)을 가지고 있다. Scale out을 위한 application side sharding 지원하며 Master/Slave Replication을 지원. Instagram(수만개의 단순 Key-value pair저장), 네이버 라인, Blizzard 등에서 사용 사례가 있음.
데이터별 저장 구조
Redis 기본사용법
redis 서버 구동시 protected mode를 no로 하면 bind ip없이 ip/port 접속가능
Redis는 RDB, AOF 방식으로 실행 가능
- RDB : 특정한 시간마다 메모리에 있는 레디스 데이터 전체를 디스크에 저장.
- AOF : Append Only File로 명령이 실행될때 마다 기록.
$ ./redis-server --protected-mode no
$ ./redis-cli –h [redis ip] –p [redis port]
Redis에서 key-value data의 활용
key의 앞부분을 table이름처럼 사용하는 관례가 있음.
value에 공백이 있으면 따옴표로 묶어줘야함.
> set users:gdhong "hong gil dong|seoul|010-222-3333"
Redis의 각종 command
key의 expire time(second)를 주면 해당 key의 expire time을 지정 가능
> expire temp:key1 10
> set temp:key1 "delete after 10 secs" ex 10
String의 증감처리(heat count 등으로 활용 가능) ☞ 속도가 RDB에 비해 월등히 빠름
> incr users:gdhong:1001
> incr users:gdhong:1001
> incrby users:gdhong:1001 10
> incrby users:gdhong:1001 -5
동시에 여러개 값을 저장하고 조회
> mset a 1 b 2
> mget a b c // c는 (nil)
Hashes는 키에 대한 값이 다시 필드-값 쌍으로 이루어진 테이블을 저장.
> hset key1 subkey1 "hello"
> hset key1 subkey2 "world"
> hget key1 subkey1
참고 : hkeys 사용시, 전체 redis의 lock이 걸림 주의!
List에 대한 key-value store로서 사용가능.
> lpush gdhong:test "a"
- lpop : 리스트 값 중 맨 앞의 값을 제거, 그 값을 리턴함.
- rpop : 리스트 값 중 마지막 값을 제거, 그 값을 리턴함.
- lindex : 인덱스에 위치한 값만 리턴.
- linsert : 특정 값을 찾아서 그 앞 또는 뒤에 값을 삽입함. 위의 예는 A값을 찾아 그 앞에 zz를 추가하라는 의미. llen 리스트가 보유한 값들의 길이를 구한다.
- rpoplpush A B : A 리스트에서 rpop 하여 B 리스트에 lpush 함.
- brpop, blpop, brpoplush : rpop, lpop, rpoplpush 의 블로킹 버전(pop할 데이터가 없으면 데이터가 추가할 때까지 대기하였다가 데이터가 추가되면 즉시 응답)
사용 Example) application이 쓰기작업을 redis에 수행, redis저장된 데이터를 rdb로 저장하면 쓰기캐쉬 서버로 사용. (순간적인 쓰기 부하를 받아낼 수 있음)
Set은 중복을 허용하지 않고 순서를 보장하지 않는 집합.
매우 성능이 좋음.
Example) 좋아요처리. count. 에서 활용.
> sadd gdhong:task "programming"
- sadd : key에 대한 집합 값을 추가함. 중복되는 값이 존재하면 추가하지 않음.
- smembers : key에 대한 집합 값을 조회함.
- sismember : 특정값이 집합에 존재하는지 여부를 확인함. 존재하면 1, 그렇지 않으면 0을 리턴함.
- sunion : 두 집합의 합집합을 구함.
- sunionstrore: 합집합을 다른 키값으로 저장함.
- sunionstore k3 k1 k2 : k1과 k2의 합집합을 구하여 k3 값으로 저장함.
- sdiff : 두집합의 차집합을 구함
- sinter : 두집합의 교집합을 구함
- scard : 집합의 카디널리티를 구함. 집합의 요소수를 의미함. example) 좋아요 수 count
- srandmember : 집합내에서 랜덤한 요소를 리턴
- smove k1 k2 "abc" : k1의 집합에서 abc값을 찾아 k2로 이동시킴
- srem k1 "abc" : k1의 집합에서 abc값을 찾아 제거함. 성공하면 1, 실패하며 0을 리턴함.
Sorted Set을 통해 키에 대한 값이 오름차순 정렬된 집합 구조를 사용 가능(이것도 맴버의 중복은 허용되지 않음)
> zadd users:point 1 gdhong
- zadd :
- zadd 키 가중치필드
- zadd 키 가중치1 필드1 가중치2 필드2 가중치3 필드3 ......
- 가중치(Score)는 정렬을 위한 기준이 된다.
- zrange : 최소, 최대 범위 내의 집합 조회. withscores 옵션을 부여하면 가중치와 함께 조회함.
- zrevrange : zrange가 오름차순 정렬이라면 zrevrange는 내림차순 정렬로 조회함.
- zcount : 최소, 최대 가중치 내의 집합 갯수를 조회. 모든 필드들의 갯수를 알고 싶다면 –inf +inf를 범위로 지정함.
- zincrby : 필드값의 가중치를 증가시킴.
- zrank : 키에 저장된 필드들중 지정된 필드의 순위를 조회함. zrevrank는 내림차순 정렬로 조회함.
- zrangebyscore : 점수 범위로 조회함.
- zscore : 특정 필드의 가중치를 조회함.
기타 command
- select
- zero 기반의 인덱스 번호로 특정 DB를 선태함.
- 새로운 Connection은 기본적으로 DB 0을 사용함
- ping
- Pong을 리턴함. 현재의 커넥션이 살아있는지 확인하거나 지연시간을 측정하기 위해서 사용함
- quit
- 커넥션의 종료를 서버에 요청함. 클라이언트로 지연된 응답을 모두 수행한 즉시 커넥션을 Close함.
Redis의 트랜잭션 기능
관계형 데이터베이스와 차이가 있음. 트랜젝션 쿼리중 자동 롤백(rollback)이 아닌 무효화만 존재. 트랜잭션으로 묶어 놓은 명령어를 실행하는 동안 다른 커낵션으로 부터의 쿼리 요청은 대기.
엄밀히 말해 명령어 Queue에 각종 command를 넣어놓는것이라 보면 좋음
- multi : 트랜잭션 시작
- discard : 큐에 적재된 내용을 실행하지 않고 삭제
- exec : 큐에 적재된 요청 내용들을 실행
- watch : 변경 감시 기능 활성화
- unwatch : 변경감시 기능 비활성화
Jedis
가장 많이 쓰이는 java client이지만 single thread. Jedis말고 lettuce를 사용하기도 함.
- Jedis : https://github.com/xetorthio/jedis
- Lettuce : https://github.com/lettuce-io/lettuce-core
redis command와 method가 완전히 동일.
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.56.101", 6379);
String result = jedis.set("hello", "world");
System.out.println(result);
System.out.println(jedis.get("hello"));
jedis.zadd("users:point", 2.0, "gdhong");
Map<String,Double> m = new HashMap<String,Double>();
m.put("mrlee", 2.0); m.put("chsung", 3.0); m.put("hdbyun", 2.0);
jedis.zadd("users:point", m);
jedis.zincrby("users:point", 2, "mrlee");
Set<Tuple> set = jedis.zrangeWithScores("users:point", 0, -1);
Iterator<Tuple> it = set.iterator();
while (it.hasNext()) {
Tuple t = it.next();
System.out.println(t.getElement() + " : " + t.getScore());
}
jedis.close();
}
기타 Redis
HA 구성
Replication 구성
'빅데이터 > nosql' 카테고리의 다른 글
NoSQL강의) DynamoDB 개요, 특징 및 설명 (401) | 2019.07.23 |
---|---|
NoSQL강의) HBase 개요, 특징, client 설명 + Apache Phoenix (390) | 2019.07.23 |
NoSQL강의) Column Family Database 개요 및 설명 (399) | 2019.07.22 |
NoSQL강의) Key-value Database 개요 및 설명 (273) | 2019.07.22 |
NoSQL강의) NoSQL 데이터 모델 종류 및 설명 (384) | 2019.07.22 |
NoSQL강의) NoSQL 개요 및 기본이론 (263) | 2019.07.22 |