Redis Client. Mac Application 을 만들고 있다.

Redis 서버에서 다른 사람이 변경한 데이타를 내가 만든 application 에서 실시간으로 보여주고 싶었다.

자료를 찾아보니, Redis에서 특정한 패턴을 subscribe 하면,

Redis서버의 데이타가 변경되는 이벤트를 구독할수 있다.

1. 먼저 접속된 Redis 서버의 설정을 변경해야 한다 (기본값은 비활성화 되어 있다)

// AKE : 모든 이벤트 채널을 활성화 하는 옵션.
"config" "set" "notify-keyspace-events" "AKE"

// AK : keyspace 이벤트 채널을 활성화 하는 옵션.
"config" "set" "notify-keyspace-events" "AK"

// KE : keyevent 이벤트 채널을 활성화 하는 옵션.
"config" "set" "notify-keyspace-events" "KE"

// keyspace notification을 비활성화 한다.
"config" "set" "notify-keyspace-events" ""

/*
위에서 AK 만 사용해도 충분하다.
AKE = AK + KE 인데, Redis 서버에서 변경된 데이타의 정보를 구독할때, 넘어오는 형식만 좀 다를뿐이다.
*/

 

2. 그후, 특정한 패턴을 구독하면 된다.

// 위에서 설정한 keyspace (AK) 채널을 구독함.
// __keyspace@0__ 여기서 숫자 0 은 Redis의 Logical 디비 번호를 뜻함.
// 1번 Logical 디비를 구독하려면 __keyspace@1__ 로 지정해야 함.
// * 는 모든 패턴을 구독하겠다는 뜻.
"psubscribe" "__keyspace@0__:*"

 

3. 이제 Redis 서버에서 다른 사람 or 다른 application 이 데이타를 변경하면, 그에 대한 이벤트를 구독채널로 받을수 있다.

넘어오는 데이타는 아래와 같은 형식이다.

// pmessage : 패턴구독 메세지라는 뜻.
// __keyspace@0__:* : 구독된 채널명
// __keyspace@0__:abc : 데이타가 변경된 key 이름은 abc 이다.
// set : 데이타를 변경한 명령어는 set 이다.

// 즉 redis에서 set abc "어떤값" 이라는 명령어가 실행되었고
// 그로인해 abc 키가 생성되었을수도 있고,
// 이미 존재하는 abc 키의 값이 변경되었을수도 있다.
1) "pmessage"
2) "__keyspace@0__:*"
3) "__keyspace@0__:abc"
4) "set"

 

4. 주의할점. 대부분의 경우는 위의 예처럼, 단일 키에 대한 단일 명령어가 구독되지만,

몇몇 경우는 단일 키에 대한 복수의 명령어가 구독된다.

예를 들면 아래와 같다.

// 이름 변경시 구독되는 데이타.
// rename_from, rename_to 2번의 명령어가 내려오고,
// 각각 변경전, 변경후 키 이름이 포함되어 있다.
1) "pmessage"
2) "__keyspace@0__:*"
3) "__keyspace@0__:변경전키이름"
4) "rename_from"
5) "pmessage"
6) "__keyspace@0__:*"
7) "__keyspace@0__:변경후키이름"
8) "rename_to"
// list타입의 키에서 모든 항목이 삭제되어
// list타입 키 자체가 삭제될때는
// lrem 명령어 뒤에 del 명령어가 이어서 구독된다.
1) "pmessage"
2) "__keyspace@0__:*"
3) "__keyspace@0__:리스트타입키이름"
4) "lrem"
5) "pmessage"
6) "__keyspace@0__:*"
7) "__keyspace@0__:리스트타입키이름"
8) "del"

 

자세한 내용은 redis.io/topics/notifications 여길 보면 된다.

반응형
Posted by 돌비
,