client_side_caching
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
返事がかかってなれば、メールでお知らせします。