data engineering

redis 기초.

qkqhxla1 2017. 4. 20. 20:28

https://www.joinc.co.kr/w/man/12/REDIS/IntroDataType


진짜 이거보다 잘되있을수는 없다고 생각할정도로 정리 잘해놓으심.


redis의 리스트 자료구조를 사용하고 있는데, 이름은 리스트지만 자료구조의 덱(dequeue)과 똑같다.

양쪽 끝에서 삽입과 제거가 동시에 발생할수 있는데 유용하게 이용할수 있다.


예를들어 어떤 자료를 처리하기 위에 덱의 맨앞에 삽입한다고 가정하자. 

자료를 처리하기 위해서 덱의 맨 끝에서 쓰레드나 프로세스가 대기하면서 자료를 하나씩 꺼내가서 처리한다고 하자. 만약 프로세스나 쓰레드의 결과값이 이상하다고 하면 값을 넣어서 테스트해볼수 있다. 

예시 값을 넣어서 테스트해보고 싶은데 덱이 아니라 일반 큐라면 맨앞에 삽입한후 앞의 데이터들이 처리될때까지 오랜 시간을 기다려야 한다. 데이터가 빅데이터 수준으로 많아지면 테스트 하나 하려면 몇일이 걸릴것이다. 

자료구조가 덱이므로 맨 끝에다 예시 데이터를 삽입해 프로세스나 쓰레드를 돌린 결과값을 금방 받아볼 수 있다. 

덱의 장점이지만 레디스로 쉽게 구현이 가능하다.


redis는 db와 그 안의 키값으로 구성된다. 키란 다른 db의 테이블같은 개념이라고 생각한다.

내 redis desktop manager 화면.

db는 5개를 만들었고, 키값은 알아서 만들면 된다.


파이썬 사용예제. https://redis-py.readthedocs.io/en/latest/ 도큐먼트가 잘 나와있다.


간단하게 클래스를 하나 만들어본다고 가정하면.

class RedisHelper(object):
    def __init__(self):
        self.key = '내 redis의 키값'
        self.r = Redis(host='redis ip address', port=포트번호, db = 1)

    def delete_key(self):
        self.r.delete(self.key)

    def rpush_data(self, data):
        if len(data) > 1:
            self.r.rpush(self.key, *data)
        else:
            self.r.rpush(self.key, data)

    def lpush_data(self, data):
        if len(data) > 1:
            self.r.lpush(self.key, *data)
        else:
            self.r.lpush(self.key, data)

    def pop_data(self):
        self.pop = self.r.rpop(self.key)
        if self.pop:
            return self.pop.strip()
        else:
            return None

이처럼 만들수 있다. rpush는 맨 끝에삽입, lpush는 맨 처음에 삽입한다는 거고 데이터를 *data로 넣거나 아니면 그냥 data로 넣을때가 있는데, ['1','2'] 처럼 하나의 json형태를 넣을때는 그냥 넣고, [['1','2'],['1','2'],['1','2']] 형태의 여러개를 넣을때 인자를 저렇게 줘서 한번에 넣을수 있다. (위 링크건 docs에 나와있다.)


주의할 점은 Redis생성자로 redis에 연결할때 db=1이라는 인자가 있는데, 이건 'db1' 에 연결한다는 소리이다. 이거때문에 한참 삽질했는데 스택오버플로우에 이미 나와 같은 사람이 있었다.


http://stackoverflow.com/questions/13178706/write-to-several-database-in-redis-for-python


이외에도 당연히 생각했겠지만 json형태 등으로 삽입하거나 할 수도 있다. 



아래는 터미널에서 레디스 서버로 접속한 후의 간단한 자료구조나 프로그래밍 테스트.


기본 키, 값 구조로 데이터 삽입이 가능하다. set으로 설정, get으로 가져옴.

키값에는 특수문자가 포함 가능하다. user:name처럼 유저 클래스의 이름이라는 포맷처럼 키값을 저장할수 있다.

redis 127.0.0.1 :6379> set key1 hello world
(error) 
ERR wrong number of arguments for 'set’ command 

redis 127.0.0.1 :6379> set key1 hello world"
OK
redis 127.0.0.1:6379> get key1
hello world“ 


다중 키 입력과 조회도 가능하다.

redis 127.0.0.1 :6379) mset key1 valuekey2 value2 key3 value3 OK
redis 127.0.0.1:6379) mget key54 key1 key2 key3 O
1) (nil

2value1” 

3) value2” 

4value3” 


append로 값에 값을 붙여줄 수 있다.

redis 127.0.0.1 :6379> set user:name kris” 

OK

redis 127.0.0.1:6379> append user:name jeong” 

(integer) 9
redis 127.0.0.1:6379> get user:name 

krisjeong

 


incr로 int값을 1 증가시키고, decr로 int값을 1 감소시킬수 있다. 값이 숫자일때만 동작한다.

redis 127 .0.0.1 :6379set login :counter O” 

OK
redis 127.0.0.1 :6379> incr login:counter 

(integer) 1

 


lrange로 시작인덱스<값<=종료인덱스 까지 가져올 수 있다. -1이 마지막 인덱스다

redi127.0.0.1:6379> !push my:list:recommand java
(integer) 1
redis 127.0.0.1:6379> !push my:list:recommand javascript
(integer) 2
red
is 127.0.0.1:6379> !push my:list:recommand eclipse redis plugin" 

(integer) 5
redis 127.0.0.1:6379!range my:list:reommand (:) -1
1eclipse plugin
2) redis
3) eclipse
4) javascript
5java” 



set명령어로 set집합을 만들수 있다. 파이썬에서의 set과 같이 중복 없는 그룹이다.


정렬된 set집합을 만들수 있는데, 정렬을 시키려면 정렬 기준이 될 가중치를 함께 넣어야 한다.

redis 127.0.0.1:6379) zadd user:ranking kris 

(integer1
redis 127.0.0.1 :6379) zadd user :ranking anna 

(integer1

redis 127.0.0.1 :6379) zadd user :ranking james 

(integer) 1
redis 
127.0.0.1 :6379> zadd user:ranking jina 

(integer1

redis 127.0.0.1 :6379zrange user:ranking 0 -1

1) kris” 

2) anna'’ 

3) ’‘james” 

4) jina 



파이썬 딕셔너리처럼 해쉬 처리도 가능하다.

redis 127.8.8.1 :6379> hset user:namkris 

(integer) 1

redis 127.8.8.1 :6379> hget user:1 name

"kris"


앞에서 언급했듯이 덱 구조의 리스트 자료구조를 만들수 있다. lpush rpush lpop rpop등이 있다.

redis 127.8.8.1 :6379> rpush a

(integer) 1

redis 127.8.8.1 :6379> rpush b

(integer) 2

이밖에도 비트연산, 특정 비트 위치의 값 리턴, 문자열 길이 리턴 등등 프로그래밍 언어처럼 다양한 것들이 가능하다.


'data engineering' 카테고리의 다른 글

mapreduce(맵리듀스)란?  (0) 2017.05.20
docker 삽질.  (0) 2017.04.25
index (mongodb)  (0) 2017.04.20
docker getting started  (0) 2017.04.17
mysql procedure 선언문 예제  (0) 2017.03.28