In to the C# 2014. 1. 17. 16:56

BookSleeve - Pipelined .NET bindings for redis

Redis

key-value 저장을 위한 메모리 서버로 string, hash, list, set, sorted set을 지원합니다.

Redis는 BSD 라이센스가 있는 오픈소스이며, windows용 서버는 정식 지원하지 않고 있습니다.

다만 windows에서 돌릴 수 있도록 비공식 프로젝트가 있긴 합니다.

https://github.com/MSOpenTech/redis


C#에서도 Redis client를 위한 다양한 라이브러리들이 존재합니다.

그런데 여기선 가장 쓰기 쉬운 라이브러리 BookSleeve를 소개하려 합니다.


BookSleeve의 장점은 세가지가 있습니다.


  1. 스레드로 부터 안전함.
    BookSleeve는 하나의 커넥션만으로 여러개의 스레드에서 동시 접근을 하여도 안전성을 보장 합니다.

  2. 비동기 처리
    BookSleeve는 모든 커맨드가 Task를 리턴하게 됩니다. 즉, 내부적으로 blocking되지 않고, 넘어갑니다. 이것은 여러개의 커맨드를 동시에 수행하고 한번에 동기화 할 수 있습니다.

  3. 사용이 쉽다
    네 사용이 너무 쉽습니다. 도큐먼트 찾기가 어려워서 그렇지 조금만 알면 금방 합니다.


위 소스는 byte[] 입출력 / sorted set 사용법 / publish, subscribe 사용법에 대한 내용이 포함되어져 있습니다.


Line 22 ~ 24는 string을 byte[]로 변환한 뒤 Redis에 저장 / 읽기를 보여주고 있습니다. “Park”은 key이며, “string test”는 value입니다. 참고로 Line 24에서 result.Result를 하게 되면 비동기화 작업 result가 종료될 때까지 기다린다음 Result값을 가져옵니다. 즉, 굳이 result.Wait()를 할 필요가 없다는 뜻입니다.


Line 27 ~ 28은 sorted set에 값을 넣습니다. “mySet”은 set key이며, “Kwon”은 value, 99는 score입니다. sorted set은 score의 값에 따라 정렬을 하며, 가장 작은 score는 rank가 0이 됩니다. rank를 역순으로 구할 수도 있습니다. Line 35 ~ 36이 역순으로 rank를 구한 다음 화면에 rank를 출력합니다. Rank 메소드 true면 올림차순, false이면 내림차순 입니다.


Line 39 ~ 40은 value가 없을 때 요청을 하면 어떻게 나오는지 알려줍니다. “mySet”에는 “Bong”이라는 value가 없으며, 결국 rank값은 null이 되어서 return 되었습니다.


Redis는 Publish/Subscribe가 있습니다. 여러 클라이언트간 채널을 통해 메시지를 주고 받을 수가 있습니다. Line 43 ~ Line 58이 그 예제를 보여주고 있습니다. 

Line 43은 먼저 Subscribe채널을 얻어옵니다. 채널로 메시지가 오면 처리할 대리자 Action<string, byte[]>를 정의 하구요. 채널 이름과 대리자를 등록합니다. subConn.Subscribe(“channel1”, action);

Line 54는 패턴구독을 정의 한 것입니다. “cha*”라고 채널명을 입력하였습니다. cha로 시작하는 채널명에 Publish가 되는 것이 있으면 모두 받아온다는 의미 입니다. 

Line 58은 “channel1”이라는 채널로 “Publish!!”라는 string을 publish 하였습니다. 그러면, 이미 등록된 대리자 action으로부터 메시지를 받아 올 수 있습니다.


여기서 대리자를 보면 알 수 있듯이 byte[] 배열의 데이터가 넘어옵니다. 즉, 보낼 때도 string이 아닌 byte[] 배열로 보낼 수도 있습니다.

이것을 활용하면 서버간 메시지 송수신 역할의 서버로도 활용할 수가 있습니다.


위 소스의 실행결과는 아래와 같습니다. 




'In to the C#' 카테고리의 다른 글

[C#] Attribute : 속성  (0) 2014.01.24
Lazy Initialization  (0) 2014.01.20
Delegates와 Serialization  (0) 2014.01.17
Dispose in C#  (0) 2014.01.14
Thread Pool과 Task  (0) 2014.01.14