본문 바로가기

빅데이터/nosql

NoSQL강의) Redis 개요, 기본사용법, command 설명 및 Jedis 예제

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 기본사용법

redis 서버 구동시 protected mode를 no로 하면 bind ip없이 ip/port 접속가능

Redis는 RDB, AOF 방식으로 실행 가능
- RDB : 특정한 시간마다 메모리에 있는 레디스 데이터 전체를 디스크에 저장.
- AOF : Append Only File로 명령이 실행될때 마다 기록.
$ ./redis-server --protected-mode no

Redis server start

$ ./redis-cli –h [redis ip] –p [redis port]

 

redis cli을 통해 실행한 redis 접속
Redis 기본 command

Redis에서 key-value data의 활용

key의 앞부분을 table이름처럼 사용하는 관례가 있음.

value에 공백이 있으면 따옴표로 묶어줘야함.

> set users:gdhong "hong gil dong|seoul|010-222-3333"

set, get, strlen, getrange, append 명령어로 key value에 대한 기본 명령 가능

Redis의 각종 command

key의 expire time(second)를 주면 해당 key의 expire time을 지정 가능

> expire temp:key1 10
> set temp:key1 "delete after 10 secs" ex 10

expire time 이후에 key에 대한 value가 없음을 확인 가능.

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이 걸림 주의!

hashes 사용한 key-value 저장 방식

List에 대한 key-value store로서 사용가능.

Redis list 사용시 index표시 및 각 command의 수행 도식표

 > lpush gdhong:test "a"

lpush, rpush, lrange의 사용

- lpop : 리스트 값 중 맨 앞의 값을 제거, 그 값을 리턴함.

- rpop : 리스트 값 중 마지막 값을 제거, 그 값을 리턴함.

- lindex : 인덱스에 위치한 값만 리턴.

- linsert : 특정 값을 찾아서 그 앞 또는 뒤에 값을 삽입함. 위의 예는 A값을 찾아 그 앞에 zz를 추가하라는 의미. llen 리스트가 보유한 값들의 길이를 구한다.

 

2개의 list를 연결하는 rpoplpush command

- 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"

Redis의 set commands.

- 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

redis에서 sorted set 명령어들 사용

- 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, exec를 사용한 레디스 트랜젝션

- multi : 트랜잭션 시작 

- discard : 큐에 적재된 내용을 실행하지 않고 삭제 

- exec : 큐에 적재된 요청 내용들을 실행 

- watch : 변경 감시 기능 활성화 

- unwatch : 변경감시 기능 비활성화

 

Jedis

가장 많이 쓰이는 java client이지만 single thread. Jedis말고 lettuce를 사용하기도 함.

- Jedishttps://github.com/xetorthio/jedis

- Lettucehttps://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 구성

 

NoSQL - Redis, Sentinel을 이용한 HA(High Availability) 구성 :: You've got to find what you love.

# Redis(레디스) Sentinel을 이용한 HA(High Availability) 구성 Redis - Master, Slave(복제) 구성 참고 : http://redis.io/topics/sentinel # Sentinel 옵션 monitor : 모니터링할 master 아이피 및 odown 기준을 위한 sentinel quorum(의사결정) 수 설정              - quorum(의사결정)의 수만큼 장애감지에 따라 Objective dow

develop.sunshiny.co.kr

Replication 구성

 

NoSQL - Redis, Replication(복제) 구성 :: You've got to find what you love.

# Redis(레디스) Replication(복제) 구성 단일 슬레이브 노드 복제 레디스 복제 : 슬레이브에서 마스터로 접근, 일정 주기로 마스터의 변경정보 체크및 동기화 HA(High Availability) 구성시에는 Failover(장애극복)가 발생할때, 승격된 마스터에 접근하기 위해서,  Master, Slave 의 redis.conf 파일에 masterauth, requirepass 파라메터를 모두 정의 해줌.# Master 설정 ( 192.16

develop.sunshiny.co.kr

반응형