mirror of
https://github.com/redis/go-redis.git
synced 2025-07-18 00:20:57 +03:00
- Remove all global push notification handler functionality - Simplify registry to support only single handler per notification type - Enable push notifications by default for RESP3 connections - Update comprehensive test suite to remove global handler tests - Update demo to show multiple specific handlers instead of global handlers - Always respect custom processors regardless of PushNotifications flag Push notifications are now automatically enabled for RESP3 and each notification type has a single dedicated handler for predictable behavior.
244 lines
8.4 KiB
Go
244 lines
8.4 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
)
|
|
|
|
func main() {
|
|
fmt.Println("Redis Go Client - General Push Notification System Demo")
|
|
fmt.Println("======================================================")
|
|
|
|
// Example 1: Basic push notification setup
|
|
basicPushNotificationExample()
|
|
|
|
// Example 2: Custom push notification handlers
|
|
customHandlersExample()
|
|
|
|
// Example 3: Multiple specific handlers
|
|
multipleSpecificHandlersExample()
|
|
|
|
// Example 4: Custom push notifications
|
|
customPushNotificationExample()
|
|
|
|
// Example 5: Multiple notification types
|
|
multipleNotificationTypesExample()
|
|
|
|
// Example 6: Processor API demonstration
|
|
demonstrateProcessorAPI()
|
|
}
|
|
|
|
func basicPushNotificationExample() {
|
|
fmt.Println("\n=== Basic Push Notification Example ===")
|
|
|
|
// Create a Redis client with push notifications enabled
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3, // RESP3 required for push notifications
|
|
PushNotifications: true, // Enable general push notification processing
|
|
})
|
|
defer client.Close()
|
|
|
|
// Register a handler for custom notifications
|
|
client.RegisterPushNotificationHandlerFunc("CUSTOM_EVENT", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("Received CUSTOM_EVENT: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("✅ Push notifications enabled and handler registered")
|
|
fmt.Println(" The client will now process any CUSTOM_EVENT push notifications")
|
|
}
|
|
|
|
func customHandlersExample() {
|
|
fmt.Println("\n=== Custom Push Notification Handlers Example ===")
|
|
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3,
|
|
PushNotifications: true,
|
|
})
|
|
defer client.Close()
|
|
|
|
// Register handlers for different notification types
|
|
client.RegisterPushNotificationHandlerFunc("USER_LOGIN", func(ctx context.Context, notification []interface{}) bool {
|
|
if len(notification) >= 3 {
|
|
username := notification[1]
|
|
timestamp := notification[2]
|
|
fmt.Printf("🔐 User login: %v at %v\n", username, timestamp)
|
|
}
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc("CACHE_INVALIDATION", func(ctx context.Context, notification []interface{}) bool {
|
|
if len(notification) >= 2 {
|
|
cacheKey := notification[1]
|
|
fmt.Printf("🗑️ Cache invalidated: %v\n", cacheKey)
|
|
}
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc("SYSTEM_ALERT", func(ctx context.Context, notification []interface{}) bool {
|
|
if len(notification) >= 3 {
|
|
alertLevel := notification[1]
|
|
message := notification[2]
|
|
fmt.Printf("🚨 System alert [%v]: %v\n", alertLevel, message)
|
|
}
|
|
return true
|
|
})
|
|
|
|
fmt.Println("✅ Multiple custom handlers registered:")
|
|
fmt.Println(" - USER_LOGIN: Handles user authentication events")
|
|
fmt.Println(" - CACHE_INVALIDATION: Handles cache invalidation events")
|
|
fmt.Println(" - SYSTEM_ALERT: Handles system alert notifications")
|
|
}
|
|
|
|
func multipleSpecificHandlersExample() {
|
|
fmt.Println("\n=== Multiple Specific Handlers Example ===")
|
|
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3,
|
|
PushNotifications: true,
|
|
})
|
|
defer client.Close()
|
|
|
|
// Register specific handlers
|
|
client.RegisterPushNotificationHandlerFunc("SPECIFIC_EVENT", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("🎯 Specific handler for SPECIFIC_EVENT: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc("ANOTHER_EVENT", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("🎯 Specific handler for ANOTHER_EVENT: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("✅ Specific handlers registered:")
|
|
fmt.Println(" - SPECIFIC_EVENT handler will receive only SPECIFIC_EVENT notifications")
|
|
fmt.Println(" - ANOTHER_EVENT handler will receive only ANOTHER_EVENT notifications")
|
|
fmt.Println(" - Each notification type has a single dedicated handler")
|
|
}
|
|
|
|
func customPushNotificationExample() {
|
|
fmt.Println("\n=== Custom Push Notifications Example ===")
|
|
|
|
// Create a client with custom push notifications
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3, // RESP3 required
|
|
PushNotifications: true, // Enable general push notifications
|
|
})
|
|
defer client.Close()
|
|
|
|
// Register custom handlers for application events
|
|
client.RegisterPushNotificationHandlerFunc("APPLICATION_EVENT", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("📱 Application event: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("✅ Custom push notifications enabled:")
|
|
fmt.Println(" - APPLICATION_EVENT notifications → Custom handler")
|
|
fmt.Println(" - Each notification type has a single dedicated handler")
|
|
}
|
|
|
|
func multipleNotificationTypesExample() {
|
|
fmt.Println("\n=== Multiple Notification Types Example ===")
|
|
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3,
|
|
PushNotifications: true,
|
|
})
|
|
defer client.Close()
|
|
|
|
// Register handlers for Redis built-in notification types
|
|
client.RegisterPushNotificationHandlerFunc(redis.PushNotificationPubSubMessage, func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("💬 Pub/Sub message: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc(redis.PushNotificationKeyspace, func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("🔑 Keyspace notification: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc(redis.PushNotificationKeyevent, func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("⚡ Key event notification: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
// Register handlers for cluster notifications
|
|
client.RegisterPushNotificationHandlerFunc(redis.PushNotificationMoving, func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("🚚 Cluster MOVING notification: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
// Register handlers for custom application notifications
|
|
client.RegisterPushNotificationHandlerFunc("METRICS_UPDATE", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("📊 Metrics update: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
client.RegisterPushNotificationHandlerFunc("CONFIG_CHANGE", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("⚙️ Configuration change: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
fmt.Println("✅ Multiple notification type handlers registered:")
|
|
fmt.Println(" Redis built-in notifications:")
|
|
fmt.Printf(" - %s: Pub/Sub messages\n", redis.PushNotificationPubSubMessage)
|
|
fmt.Printf(" - %s: Keyspace notifications\n", redis.PushNotificationKeyspace)
|
|
fmt.Printf(" - %s: Key event notifications\n", redis.PushNotificationKeyevent)
|
|
fmt.Println(" Cluster notifications:")
|
|
fmt.Printf(" - %s: Cluster slot migration\n", redis.PushNotificationMoving)
|
|
fmt.Println(" Custom application notifications:")
|
|
fmt.Println(" - METRICS_UPDATE: Application metrics")
|
|
fmt.Println(" - CONFIG_CHANGE: Configuration updates")
|
|
}
|
|
|
|
func demonstrateProcessorAPI() {
|
|
fmt.Println("\n=== Push Notification Processor API Example ===")
|
|
|
|
client := redis.NewClient(&redis.Options{
|
|
Addr: "localhost:6379",
|
|
Protocol: 3,
|
|
PushNotifications: true,
|
|
})
|
|
defer client.Close()
|
|
|
|
// Get the push notification processor
|
|
processor := client.GetPushNotificationProcessor()
|
|
if processor == nil {
|
|
log.Println("Push notification processor not available")
|
|
return
|
|
}
|
|
|
|
fmt.Printf("✅ Push notification processor status: enabled=%v\n", processor.IsEnabled())
|
|
|
|
// Get the registry to inspect registered handlers
|
|
registry := processor.GetRegistry()
|
|
commands := registry.GetRegisteredCommands()
|
|
fmt.Printf("📋 Registered commands: %v\n", commands)
|
|
|
|
// Register a handler using the processor directly
|
|
processor.RegisterHandlerFunc("DIRECT_REGISTRATION", func(ctx context.Context, notification []interface{}) bool {
|
|
fmt.Printf("🎯 Direct registration handler: %v\n", notification)
|
|
return true
|
|
})
|
|
|
|
// Check if handlers are registered
|
|
if registry.HasHandlers() {
|
|
fmt.Println("✅ Push notification handlers are registered and ready")
|
|
}
|
|
|
|
// Demonstrate notification info parsing
|
|
sampleNotification := []interface{}{"SAMPLE_EVENT", "arg1", "arg2", 123}
|
|
info := redis.ParsePushNotificationInfo(sampleNotification)
|
|
if info != nil {
|
|
fmt.Printf("📄 Notification info - Command: %s, Args: %d\n", info.Command, len(info.Args))
|
|
}
|
|
}
|