Imports StackExchange.Redis


''这段代码提供了一个完整的 Redis 订阅实现，包含以下功能：

''通过构造函数初始化 Redis 连接
''订阅指定频道并处理接收到的消息
''取消订阅功能
''关闭连接功能
''使用示例
''你可以根据需要修改 messageHandler 来自定义消息处理逻辑。这个实现使用了异步回调来处理接收到的消息，确保不会阻塞主线程。

''记得在使用前替换 connectionString 为你的 Redis 服务器地址。如果你的 Redis 服务器设置了密码，连接字符串应该类似这样：localhost :    6379,password=yourpassword。





'Public Class RedisSubscriber
'    Private ReadOnly connection As ConnectionMultiplexer
'    Private ReadOnly db As IDatabase

'    ' 构造函数，初始化 Redis 连接
'    Public Sub New(ByVal connectionString As String)
'        connection = ConnectionMultiplexer.Connect(connectionString)
'        db = connection.GetDatabase()
'    End Sub

'    ' 订阅频道并处理消息
'    Public Sub SubscribeToChannel(ByVal channelName As String, ByVal messageHandler As Action(Of RedisChannel, RedisValue))
'        ' 创建订阅者
'        Dim subscriber = connection.GetSubscriber()

'        ' 订阅频道并指定消息处理程序
'        subscriber.Subscribe(channelName, Function(channel, message) As Task
'                                              messageHandler(channel, message)
'                                              Return Task.CompletedTask
'                                          End Function)

'        Console.WriteLine($"已订阅频道: {channelName}")
'    End Sub

'    ' 取消订阅
'    Public Sub UnsubscribeFromChannel(ByVal channelName As String)
'        Dim subscriber = connection.GetSubscriber()
'        subscriber.Unsubscribe(channelName)
'        Console.WriteLine($"已取消订阅频道: {channelName}")
'    End Sub

'    ' 关闭连接
'    Public Sub CloseConnection()
'        connection.Close()
'    End Sub
'End Class

'' 使用示例
'Public Class Program
'    Public Shared Sub Main()
'        ' 替换为你的 Redis 连接字符串
'        Dim connectionString = "localhost:6379"
'        Dim subscriber = New RedisSubscriber(connectionString)

'        ' 定义消息处理程序
'        Dim messageHandler As Action(Of RedisChannel, RedisValue) = Sub(channel, message)
'                                                                        Console.WriteLine($"接收到来自 {channel} 的消息: {message}")
'                                                                    End Sub

'        ' 订阅频道
'        subscriber.SubscribeToChannel("testChannel", messageHandler)

'        ' 保持程序运行以接收消息
'        Console.WriteLine("按任意键退出...")
'        Console.ReadKey()

'        ' 取消订阅并关闭连接
'        subscriber.UnsubscribeFromChannel("testChannel")
'        subscriber.CloseConnection()
'    End Sub
'End Class


'这个实现添加了以下功能：

'发布消息功能：

'PublishMessage 方法允许你向指定频道发布消息
'返回值表示有多少个订阅者接收到了这条消息
'完整的发布/ 订阅功能

'保留了之前的订阅功能
'将发布和订阅功能整合到一个类中
'使用示例：

'展示了如何发布消息
'展示了如何订阅频道并接收消息
'展示了完整的初始化和清理流程
'你可以通过以下方式使用这个类：

'创建 RedisPubSub 实例，传入 Redis 连接字符串
'使用 PublishMessage 发布消息到频道
'使用 SubscribeToChannel 订阅频道并处理消息
'使用 UnsubscribeFromChannel 取消订阅
'使用 CloseConnection 关闭连接
'这个实现是线程安全的， 适合在多线程环境中使用。如果你的 Redis 服务器需要密码， 确保在连接字符串中包含密码信息， 例如： localhost :  6379,password=yourpassword。


Public Class RedisSubscriber
    Private ReadOnly connection As ConnectionMultiplexer
    Private ReadOnly db As IDatabase
    Private ReadOnly subscriber As ISubscriber

    ' 构造函数，初始化 Redis 连接
    Public Sub New(ByVal connectionString As String)
        connection = ConnectionMultiplexer.Connect(connectionString)
        db = connection.GetDatabase()
        subscriber = connection.GetSubscriber()
    End Sub
    '    Public Sub New(ByVal connectionString As String)
    '        connection = ConnectionMultiplexer.Connect(connectionString)
    '        db = connection.GetDatabase()
    '    End Sub

    ' 发布消息到指定频道
    Public Function PublishMessage(ByVal channelName As String, ByVal message As String) As Long
        Dim result = subscriber.Publish(channelName, message)
        Console.WriteLine($"已发布消息到 {channelName}: {message}, 被订阅者接收次数: {result}")
        Return result
    End Function

    ' 订阅频道并处理消息
    Public Sub SubscribeToChannel(ByVal channelName As String, ByVal messageHandler As Action(Of RedisChannel, RedisValue))
        subscriber.Subscribe(channelName, Function(channel, message) As Task
                                              messageHandler(channel, message)
                                              Return Task.CompletedTask
                                          End Function)
        Console.WriteLine($"已订阅频道: {channelName}")
    End Sub

    ' 取消订阅
    Public Sub UnsubscribeFromChannel(ByVal channelName As String)
        subscriber.Unsubscribe(channelName)
        Console.WriteLine($"已取消订阅频道: {channelName}")
    End Sub

    ' 关闭连接
    Public Sub CloseConnection()
        connection.Close()
    End Sub

    '判断是否连接
    Public Function IsConnected() As Boolean
        Return connection.IsConnected
    End Function

End Class



