Redis Server-assisted Client side caching

Redis Server 教育
Redis Server Course
Redis 定期点検/技術支援
Redis Technical Support
Redis エンタープライズサーバ
Redis Enterprise Server

Redis Server-assisted Client side caching

개요 槪要 Outline

레디스 서버는 고성능(high performance)입니다만, 클라이언트(애플리케이션) 입장에서 보면, 데이터가 필요할 때마다 매번 레디스 서버에 쿼리해서 가져오는 것보다 한번 가져온 데이터를 계속 사용할 수 있다면 훨씬 더 나은 성능을 제공할 수 있을 것입니다.
이 경우 해결해야 할 문제는 데이터가 변경되었을 때 클라이언트는 해당 데이터가 변경되었는지를 어떻게 아느냐하는 것입니다. 레디스 서버 입장에서는 변경된 데이터를 조회해서 가지고 있는 클라이언트들에게 데이터가 변경되었음을 알려주는 효율적인 방법이 있어야 합니다.
레디스는 pub/sub 기능을 이용해서 캐싱을 사용하는 클라이언트에 알림을 보냅니다.
기본 모드와 브로드캐스팅(broadcasting) 모드가 있습니다.
명령은 client로 시작합니다.
이 기능은 버전 6.0부터 사용할 수 있습니다.


기본 모드

Tracking on

  • Tracking 이후에 조회하는 모든 키를 캐싱한다. 서버는 해당하는 키가 변경되면 클라이언트에게 publish로 메시지를 보낸다.
  • Client 4 > client tracking on redirect 5
    redirect 5는 client id 이다. Client id는 client id 명령으로 확인할 수 있다.
    Subscribe하는 클라이언트를 별도로 지정한다.
  • Client 5 > subscribe __redis__:invalidate   <- channel name
  • Client 4 > get key -> "value"
    이후 Client 4는 데이터를 서버에 다시 조회하지 않고 캐시된 데이터를 사용한다.
  • Client 6 > set key value10   <- 다른 클라이언트가 데이터를 바꾼다.
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "key"
  • Client 4는 캐시된 데이터를 지운다.

Tracking on NOLOOP

  • 위의 경우(noloop 옵션을 사용하지 않았을 경우) 자신(client 4)이 입력한 키에 대해서도 무효화 메시지를 받는다. 자신(client 4)이 입력한 키에 대해서 무호화 메시지를 받지 않으려면 NOLOOP 옵션을 사용한다.

Tracking on OPTIN

  • Client caching yes 후 조회명령을 실행한다. 해당 키에 대해서만 캐시한다. 조회명령 실행 직전에 매번 "client caching yes"를 실행해야 한다.
  • Client 4 > client tracking on redirect 5 OPTIN
  • Client 5 > subscribe __redis__:invalidate
  • Client 4 > client caching yes
  • Client 4 > get key -> "value"
  • Client 6 > set key value10  
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "key"

Tracking on OPTOUT

  • 캐시 시작 명령(client caching yes)은 필요하지 않고, 캐시를 중지하려면 "client caching no" 명령을 실행한다.
  • Client 4 > client tracking on redirect 5 OPTOUT
  • Client 5 > subscribe __redis__:invalidate
  • Client 4 > get key -> "value"
  • Client 4 > get key1 -> "value1"
  • Client 6 > set key value10
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "key"
  • Client 6 > set key1 value11
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "key1"
  • Client 4 > client caching no
  • 이후에는 메시지가 오지 않는다.

정리

  • OPTIN은 client caching yes와만 사용할 수 있고, OPTOUT은 client caching no와만 사용할 수 있다.
  • OPTIN과 OPTOUT은 같이 사용할 수 없다.
  • Tracking을 중지하려면 "client tracking off"를 사용한다.

브로드캐스팅(broadcasting) 모드

Tracking on BCAST

  • 이 모드는 조회 여부와 상관없이 모든 키에 대해서 무효화 메시지를 받는다.
  • Client 4 > client tracking on redirect 5 BCAST
  • Client 5 > subscribe __redis__:invalidate
  • Client 6 > set key value10
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "key"

Tracking on BCAST PREFIX user

  • 접두어(prefix)를 사용하는 방법: 접두어를 지정하면 해당하는 키에 대해서만 무효화 메시지를 받는다.
    접두어는 여러 개 지정할 수 있다.
  • Client 4 > client tracking on redirect 5 BCAST PREFIX user
  • Client 5 > subscribe __redis__:invalidate
  • Client 6 > set user100 value
  • Client 5 >
    1) "message"
    2) "__redis__:invalidate"
    3) 1) "user100"

Tracking off

  • 모드에 상관없이 tracking을 중지하려면 "client tracking off" 명령을 사용한다.

정리

  • 다른 모드로 전환할 때는 tracking off 한다.
  • BCAST 모드에서는 OPTIN/OUTPUT 옵션은 사용할 수 없다.

관련 정보

서버 내부 데이터 구조

  • 키와 클라이언트 정보를 보관하기 위해서 RAX(radix tree)를 사용한다.
  • 6.0 RC1 버전에서는 배열을 사용해서 128mb의 서버 메모리를 사용했다.

Event Notification과 비교

  • "config set notify-keyspace-events KA"로 설정하면 모든 키 이벤트에 대해서 알림을 받을 수 있다.
  • 클라이언트는 "subscribe __keyspace@0__:key"를 실행하고, "get key"를 실행한다.
  • 다른 클라이언트에서 "set key YYY"를 실행하면, subscribe한 클라이언트 "__keyspace@0__key set" 메시지를 받는다.
  • 클라이언트는 "unsubscribe __keyspace@0__:key"를 실행한다.
  • 키를 사용할 때마다 subscribe와 unsubscribe를 해주어야 한다.

기타 정보

  • flushdb 또는 flushall을 했을 경우 클라이언트는 "\x00" 메시지를 받는다.
  • INFO clients: tracking_clients
    현재 tracking하고 있는 client 수를 보여준다. tracking on하면 증가하고, off하면 감소한다.
  • INFO stats: tracking_total_keys
    현재 client가 캐시하고 있는 키 개수를 보여준다. Client가 키를 조회(캐싱)하면 증가하고, 해당 키가 변경되어 메시지가 보내면 감소한다.

동영상 강의


<< Event Notification Redis Server Threads >>

조회수 :

Email 返事がかかってなれば、メールでお知らせします。