구현 방법
레디스에선 이 구현 과정을 Tracking 이라고 부른다.
2개의 모드가 있다
default mode: 클라이언트가 접근한 키를 기억한다. 그리고 그 키에 대한 값이 변경되었을 때는 invalidation 메세지를 보낸다. 서버 사이드에서 메모리가 소모되는 방법이지만 클라이언트 쪽 메모리에 남아 있는 키에 대해서만 그런 메세지를 보내게 된다.
(서버와 클라이언트가 연결되어 있는 동안에는 키를 기억한다. 한쪽 클라이언트가 키를 변경한 경우 같은 키를 참조하고 있는 나머지 클라이언트들은 invalidation message를 받는다. 이를 받아서 stale 키를 지운다)
*invalidation Table에는 주어진 키를 캐싱해둔 클라이언트들이 저장된다.
새 키가 추가되면 그 키가 마치 변경된것처럼 테이블에서 오래된 데이터를 지우고, 클라이언트에게 무효화 메세지를 보낸다. 그렇게 해서 새 키에 대한 메모리를 요구할 수 있게 되는 것이다. (클라이언트가 키를 버리는 귀찮음이 있겠지만)
클라이언트 연결이 끊어지면 이에 해당하는 키는 가비지 컬렉션으로 넘어가게 된다.
서로 다른 DB에 같은 키를 각각 넣어두고 한쪽 키 내용이 변경되면 다른쪽에 있던 그 키는 무효화메세지에 의해 무효화된다. 즉 데이터베이스 수를 무시 가능하며, 메모리 사용량과 구현 복잡도를 줄이게된다. (??)
broadcasting mode: 클라이언트가 접근한 키를 서버에서 기억하지 않는다. 서버 쪽에선 메모리 소모가 없다
대신에 클라이언트는 object: 또는 user: 같은 키 접두사에 대해 sub 하고 있어, 그와 일치하는 메세지를 수신한다.