Redis는 Key-Value 기반 NoSQL DB이다.
이름은 Remote Dictionary Server의 약자를 따서 지었다.
Python의 Dictionary를 알고 있어서, 거부감 없이 Redis를 업무에 도입할 수 있었다.
Python Program을 실행했을 때, Dictionary처럼 생각할 수 있고, 정말 사용법이 쉽다.
기본적인 SET과 GET부터 보면,
redis> SET abc "123"
"OK"
redis> GET abc
"123"
redis> GET def
(nil)
SET 커맨드로 'abc' Key에 '123'이란 값을 넣어두었고,
GET 커맨드로 'abc' Key의 값을 불러왔다.
할당한 적 없던 'def'의 값은 null이 찍혀있다.
SET, GET 모두 시간복잡도는 O(1)이다.
단순 Key: Value 맵핑은 아쉽다.
개발을 할 때, 아래와 같이 Nested된 Dictionary를 수도없이 쓴다.
{
"car": {
"price": "15000"
}
}
위와 같은 데이터를 Redis에서 넣고 싶다면, Hash 자료구조를 Redis에서 사용하면 된다.
redis> HSET car price "15000"
(integer) 1
redis> HGET car price
"15000"
redis> HSET car owner "Roy"
(integer) 1
redis> HSET car company "Tesla" name "Model 3"
(integer) 2
redis> HGET car name
"Model 3"
car가 들어가는 위치를 Key, price가 들어가는 위치를 Field라고 부른다.
Redis 내 car라는 Key에 price라는 Field를 만들고, 값을 "15000"으로 지정했다.
그 후, HGET으로 Key와 Field를 특정하면, 그에 해당하는 값을 가져온다.
HSET은 여러 Field Value를 이어서 쓸 수 있다.
(HSET Key Field1 Value1 Field2 Value2 Field3 Value3 ... )
HSET과 HGET은 모두 O(1)의 시간복잡도를 가진다.
이처럼 Key에 Field를 계속 추가하다보면, 어떤 Field가 있는지 확인하고 싶을 수 있다.
Python에 dict.keys() 메소드와 같이, HKEYS를 사용하면 된다.
redis> HKEYS car
1) "price"
2) "company"
3) "name"
HKEYS의 시간복잡도는 O(N)이다. N은 Key 내의 Field의 개수이다.
O(N) 명령은 되도록 피하는 것이 좋다.
Redis는 싱글 스레드로 동작하므로 오래 걸리는 트랜잭션이 있으면 병목현상이 생길 수 있다.
마지막으로 HDEL을 사용해서 Key 내의 특정 Field를 제거할 수 있다.
redis> HDEL car price
(integer) 1
redis> HGET car price
(nil)
redis> HDEL car name company
(integer) 2
redis> HKEYS car
1) "owner"
HDEL은 Key에 있는 Field를 제거하는 명령이다.
시간복잡도는 O(1)이다.
HDEL도 여러 Field를 지정하여 실행할 수 있다.