2016-03-31 6 views
4

Ich prototypiere einen Redis-Client in Golang mit der redigo library, um über die Keypace-Ereignisse benachrichtigt zu werden. Ich habe die redis.conf modifiziert, um die notify-keyplace-Ereignisse auf "KEA" zu setzen, um alle Ereignisse zu empfangen. Aber wenn ich Schlüssel mit einem CLI in die db einfüge/aktualisiere/lösche, sehe ich keine Ereignisse, die auf dem Client ausgelöst werden.Unterstützt Redigo Golang Client Keyspace Event-Benachrichtigungen?

Beispielcode, der Redigo verwendet, um Ereignisse Feuer:

type RedisClient struct { 
    mRedisServer  string 
    mRedisConn  redis.Conn 
    mWg    sync.WaitGroup 
} 

func (rc *RedisClient) Run() { 
    conn, err := redis.Dial("tcp", ":6379") 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    rc.mRedisConn = conn 
    fmt.Println(conn) 
    rc.mRedisConn.Do("CONFIG", "SET", "notify-keyspace-events", "KEA") 

    fmt.Println("Set the notify-keyspace-events to KEA") 
    defer rc.mRedisConn.Close() 
    rc.mWg.Add(2) 
    psc := redis.PubSubConn{Conn: rc.mRedisConn} 
    go func() { 
     defer rc.mWg.Done() 
     for { 
      switch msg := psc.Receive().(type) { 
      case redis.Message: 
       fmt.Printf("Message: %s %s\n", msg.Channel, msg.Data) 
      case redis.PMessage: 
       fmt.Printf("PMessage: %s %s %s\n", msg.Pattern, msg.Channel, msg.Data) 
      case redis.Subscription: 
       fmt.Printf("Subscription: %s %s %d\n", msg.Kind, msg.Channel, msg.Count) 
       if msg.Count == 0 { 
        return 
       } 
      case error: 
       fmt.Printf("error: %v\n", msg) 
       return 
      } 
     } 
    }() 
    go func() { 
     defer rc.mWg.Done() 
     psc.PSubscribe("\"__key*__:*\"") 
     select {} 
    }() 
    rc.mWg.Wait() 
} 

Hat Schlüsselraum Ereignisbenachrichtigungen Redigo unterstützen? Was mache ich hier vielleicht falsch?

Antwort

5

Entfernen Sie die zusätzlichen Anführungszeichen in der Zeichnung Muster:

psc.PSubscribe("__key*__:*") 

Auch Sie die goroutines nicht brauchen. Es ist einfacher, es zu schreiben als:

psc := redis.PubSubConn{Conn: rc.mRedisConn} 
psc.PSubscribe("__key*__:*") 
for { 
    switch msg := psc.Receive().(type) { 
    case redis.Message: 
     fmt.Printf("Message: %s %s\n", msg.Channel, msg.Data) 
    case redis.PMessage: 
     fmt.Printf("PMessage: %s %s %s\n", msg.Pattern, msg.Channel, msg.Data) 
    case redis.Subscription: 
     fmt.Printf("Subscription: %s %s %d\n", msg.Kind, msg.Channel, msg.Count) 
     if msg.Count == 0 { 
      return 
     } 
    case error: 
     fmt.Printf("error: %v\n", msg) 
     return 
    } 
} 
Verwandte Themen