key: value형식이다. value의 자료구조에 대해서 배워보자.
> set hello world
OK
> get hello
"world"
모든 종류의 문자열(이진 데이터 포함)을 저장할 수 있습니다. 따라서 JPEG 이미지를 저장하거나, HTML fragment를 캐시하는 용도로 자주 사용합니다. 저장할 수 있는 최대 사이즈는 512MB입니다.
기본적인 자료구조여서 다양한 기능 제공합니다.
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152
> INCR mycounter
(integer) 1
> GETSET mycounter "0"
"1"
redis> GET mycounter
"0"
> set mykey newval nx
(nil)
> set mykey newval xx
OK
일반적인 linked list의 특징을 가지고 있습니다. 수백만개의 아이템이 있다고 하더라도 head와 tail값을 추가할 때 동일한 시간이 소요됩니다. 특정 값이나 인덱스로 데이터 찾거나 삭제할 수 있습니다.
LPUSH mylist B # now the list is "B"
LPUSH mylist A # now the list is “A","B"
RPUSH mylist A # now the list is “A”,”B","A"
list 는 여러 작업에 유용하지만, 대표적인 사용 사례는 Pub-Sub(생산자-소비자)패턴입니다.
프로세스간의 통신방법에서 생산자가 아이템을 만들어서 list에 넣으면 소비자가 꺼내와서 액션을 수행하는 식을 동작합니다. 레디스는 이를 좀 더 효율적이고 안정적으로 만들 수 있게 합니다.
트위터에서는 각 유저의 타임라인에 트윗을 보여주기 위해 redis list를 사용합니다.
여기서 사용한 RPUSHX는 키가 이미 있을때만 데이터를 저장하기 때문에, 이를 이용하여 이미 캐시된 (이미 키가 존재하는) 타임라인에만 데이터를 추가할 수 있습니다.
또한 일시적으로 list를 blocking하는 기능도 유용하게 사용될 수 있습니다. Pub-Sub 상황에서 list가 비어있을 때 pop을 시도하면 대개 NULL을 반환합니다. 이 경우 소비자는 일정시간을 기다린 후 다시 pop을 시도합니다(= polling). 레디스의 BRPOP을 사용하면 새로운 아이템이 리스트에 추가될 때에만 응답하므로 불필요한 polling 프로세스를 줄일 수 있습니다.