REDIS란
REDIS는 "REmote DIctionary System"의 약어로 메모리 기반의 DB, NO-SQL DB이다.
Message Queue, SHared Memory, Remote Dictionary용도로 사용될수 있다.
기본적으로 key=value 형식으로 저장되며, put/get operation을 지원하며, 데이터는 메모리에 저장되므로 빠른 read/write 속도를 보장한다. 하지만 REDIS의 데이터셋은 메모리보다 클 수 없으므로 만약 빅데이터를 다루는 어플리케이션이거나 주로 읽기 작업을 수행하는 어플리케이션인 경우 적절한 선택이 아니다.
서버가 shutdown된후 restart되더라도 disk에 저장해놓은 데이터를 다시 읽어서 메모리에 Loading하기 때문에 데이터가 유실되지 않는다. REDIS에서 데이터를 저장하는 방법은 snapshooting 방식과 AOF(Append On File) 두가지가 있다.
BSD 라이센스 기반의 오픈소스이며 최근 VMWARE에 인수되어 계속해서 업그레이드가 되고 있다.
다양한 언어의 클라이언트 SDK가 지원되고 있다.
REDIS 연구노트: http://kerocat.tistory.com/1
In Memory Dictionary Redis소개: http://bcho.tistory.com/654
REDIS 설치하기
1. http://redis.io/download 에서 stable버전을 다운로드 받는다.
다운로드받은 파일의 압축을 해제하고 make 명령으로 설치한다.
# wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz # tar xzf redis-2.6.13.tar.gz # cd redis-2.6.13 # make
서버를 시작한다.
# src/redis-server
클라이언트로 인터액터할 수 있다.# src/redis-cli redis> set foo bar OK redis> get foo "bar"
REDIS가 지원하는 자료형
1. Strings
가장 기본적인 데이터형으로 key에 하나의 값을 저장한다.
일반적인 문자열로 최대 512M 길이까지 지원한다.
텍스트 문자열 뿐만 아니라 Integer나 JPEG 같은 바이너리 파일까지 저장할 수 있다.(REDIS는 별도의 정수형, 실수형이 따로 없다)
2. Sets
정렬되지 않는 집합형이다.
key가 중복된 데이터는 존재하지 않는다.
요소의 추가, 제거및 데이터유무 체크시 소모되는 시간이 Sets에 포함된 요소의 수와 관계없이 일정하다
한 key에 저장할 수 있는 요소의 최대 갯수는 2^32 -1 이다.
설정파일에서 정한 조건보다 값이 큰 경우 hashtable이나 intset로 인코딩된다.
3. Sorted sets
sets과 유사하지만 각 요소마다 score라는 실수값을 가지고 있는 형태이다. 이 score를 기준으로 정렬된 데이터이다.
sets와 같이 동일한 key에서 각 요소들의 값은 유일하지만 score값은 중복될 수 있다.
가장 진보된 데이터형이다.
설정파일에서 정해준 조건보다 값이 큰 경우 skiplist나 ziplist로 인코딩된다.
4. Lists
배열과 동일.
한 key에 넣을수 있는 요소의 최대 개수는 2^32 -1 이다.
설정파일에서 정해준 조건보다 값이 큰경우 linkedlist나 ziplist로 인코딩된다.
5. Hashes
lists와 비슷하지만 "필드명","필드값"의 연속으로 이루어져 있다.
한 key에 포함할 수 있는 filed-value쌍의 최대 개수는 2^32 -1 이다.
설정파일에서 정해준 조건보다 값이 큰 경우 hashtable 이나 zipmap으로 인코딩된다.
JEDIS란?
redis에서 추천하는 클라이언트이고 github를 통해서 소스를 제공하고 있다.
https://github.com/xetorthio/jedis
최신버전 jedis 다운로드: http://github.com/xetorthio/jedis/downloads
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class main{ public static void main(String[] args) { // 멀티스레드 환경에서 안전하게 사용하기 위해 REDIS와 통신하기 위한 JedisPool 객체를 생성한다. JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); // 단일 Jedis 객체를 가져온다. Jedis jedis = pool.getResource(); try { // get/set메서드를 사용하여 key-value로 데이터를 읽기/쓰기 작업을 수행한다. jedis.set("id1", "kim"); jedis.set("id2", "lee"); System.out.println(jedis.get("id1")); System.out.println(jedis.get("id2")); System.out.println(jedis.dbSize()); }finally{ // 사용이 끝난 Jedis객체는 다시 pool로 반환한다. pool.returnResource(jedis); } // 사용이 끝난 pool을 제거하고 프로그램을 종료한다. pool.destroy(); } }