VB.Net创立贰个简便的 redis 揭橥/订阅客户端

发布时间:2019-05-22  栏目:MyBatis  评论:0 Comments

[ASP/Basic]代码

  • PUBLISH,SUBSC奥迪Q3IBE,等一声令下达成订阅与宣布
    • 订阅/公布到频道
    • 订阅/发表到格局
Imports ServiceStack.Redis

Public Class SubscriptionMessageEventArgs
    Inherits EventArgs

    Public Property Key As String
    Public Property value As String

    ''' <summary>
    ''' Initializes a new instance of the SubscriptionMessageEventArgs class.
    ''' </summary>
    Public Sub New(ByVal key As String, ByVal value As String)
        Me.Key = key
        Me.value = value
    End Sub
End Class

''' <summary>
''' The redis store encapsulation class around the ServiceStack redis client 
''' </summary>
''' <remarks>This class is cumulatively constructed 
''' across the tutorial and is not broken.
''' </remarks>
Public Class RedisStore

#Region " Properties "

    Private _sourceClient As RedisClient
    Public ReadOnly Property SourceClient() As RedisClient
        Get
            Return _sourceClient
        End Get
    End Property

#End Region

#Region " Event "

    Public Event OnSubscriptionMessage As EventHandler(Of SubscriptionMessageEventArgs)
#End Region

#Region " Constructors "

    Public Sub New()
        MyClass.New(False)
    End Sub

    Public Sub New(ByVal ForceCheckServer As Boolean)
        _sourceClient = New RedisClient
        If ForceCheckServer AndAlso Not IsServerAlive() Then
            Throw New Exception("The server has not been started!")
        End If
    End Sub

#End Region

    Public Function IsServerAlive() As Boolean
        Try
            Return SourceClient.Ping
        Catch ex As Exception
            Return False
        End Try
    End Function

#Region " Functionalities "

#Region " Get/Set Keys "

    Public Function SetKey(ByVal key As String, ByVal value As String) As Boolean
        Return SourceClient.Set(key, value)
    End Function

    Public Function SetKey(Of T)(ByVal key As String, ByVal value As T) As Boolean
        Return SourceClient.Set(Of T)(key, value)
    End Function

    Public Function GetKey(ByVal key As String) As String
        Return Helper.GetString(SourceClient.Get(key))
    End Function

    Public Function GetKey(Of T)(ByVal key As String) As T
        Return SourceClient.Get(Of T)(key)
    End Function

#End Region

#Region " Pub/Sub "

    Public Sub Subscribe(ByVal ParamArray channels() As String)
        Dim SubClient As IRedisSubscription = SourceClient.CreateSubscription
        SubClient.OnMessage = New Action(Of String, String)(AddressOf OnMessage)
        SubClient.SubscribeToChannels(channels)
    End Sub

    Private Sub OnMessage(ByVal channel As String, ByVal value As String)
        RaiseEvent OnSubscriptionMessage_
    (Me, New SubscriptionMessageEventArgs(channel, value))
    End Sub

    Public Sub Publish(ByVal channel As String, ByVal value As String)
        SourceClient.Publish(channel, Helper.GetBytes(value))
    End Sub

#End Region

#End Region

End Class

Public Class Helper

    Private Shared ReadOnly UTF8EncObj As New System.Text.UTF8Encoding()

    Public Shared Function GetBytes(ByVal source As Object) As Byte()
        Return UTF8EncObj.GetBytes(source)
    End Function

    Public Shared Function GetString(ByVal sourceBytes As Byte()) As String
        Return UTF8EncObj.GetString(sourceBytes)
    End Function

End Class

 

频道的订阅与消息发送


 

订阅subscribe,能够让客户端订阅猖狂数量的频道,

每当有新音信发送到被订阅的频段时,消息就能够被发送给全数订阅钦命频道的客户端:

 图片 1

 

 

当有新音讯通过publish命令发送给频道channel一时,那一个音信就能够被发送给订阅它的多个客户端:

图片 2

 

 

订阅频道

各类 Redis 服务器进度都维持着3个意味着服务器状态的 redis.h/redisServer
结构,结构的

pubsub_channels 属性是1个字典,那个字典就用来保存订阅频道的音信:

struct redisServer {
// ...
dict *pubsub_channels;
// ...
};

  

其间字典的键为正在被订阅的频段,而字典的值则是多个链表,链表中保留了装有订阅那一个频道的客户端。

例如:

 图片 3

 

当客户端调用subscribe命令时,程序将客户端和要订阅的频段在pubsub_channels字典中关系起来。

比方,假设客户端 client拾0八陆 试行命令 SUBSC本田UR-VIBE channel一 channel贰channel三 ,

那就是说前边体现的 pubsub_channels 将产生下边那个样子:

 图片 4

 

发送消息到频道

当调用 PUBLISH channel message 命令,程序首先依照 channel
定位到字典的键,然后将音讯发

送给字典值链表中的全部客户端。

 

倘使有个别客户端实行命令

PUBLISH channel一 “hello moto” ,上海教室中那么 client2 、
client伍 ,client壹,client100八六 七个客户端都将接收到 “hello moto”

 

退订频道

UNSUBSC福特ExplorerIBE 命令能够退订钦赐的频段, 它从pubsub_channels
字典的加以频道(键)中,删除关于当前客户端的新闻,那样被退订频道的音讯就不会再发送给那一个客户端。

 

格局的订阅与音讯发送


当使用 PUBLISH
命令发送音讯到某些频道时,不仅仅具有订阅该频道的客户端会收到音信,如
果有某些/有些情势和那一个频道相配的话,那么富有订阅那一个/这一个频道的客户端也一如之前会收下

信息。

 

带频道和格局的例证, 其中 tweet.shop.* 方式相称了 tweet.shop.kindle

频道和 tweet.shop.ipad 频道,并且有两样的客户端独家订阅它们七个:

 图片 5

 

当有消息发送到 tweet.shop.kindle 频道时,新闻除了发送给 clientX 和
clientY 之外,还

会发送给订阅 tweet.shop.* 模式的 client123 和 client256 :

图片 6

 

 

订阅格局

redisServer.pubsub_patterns
属性是一个链表,链表中保留着独具和格局相关的新闻:

 

struct redisServer {
     // ...
     list *pubsub_patterns;
     // ...
};

  

链表中的每个节点都蕴涵三个 redis.h/pubsub帕特tern 结构:

typedef struct pubsubPattern {
     redisClient *client;
     robj *pattern;
} pubsubPattern;

  

client 属性保存着订阅情势的客户端,而 pattern
属性则保留着被订阅的形式。

每当调用 PSUBSC本田UR-VIBE
命令订阅一个形式时,程序就创办3个饱含客户端音信和被订阅方式的

pubsubPattern 结构,并将该组织丰盛到 redisServer.pubsub_patterns
链表中。

 图片 7

 

 

万一那时客户端 client100八6 实施 PSUBSC陆风X8IBE broadcast.list.* ,那么
pubsub_patterns

链表将被更新成这么:

图片 8

 

通过遍历整个 pubsub_patterns
链表,程序能够检查有着正在被订阅的情势,以及订阅这几个情势的客户端。

 

 

发送音讯到情势

发送音讯到形式的干活也是由 PUBLISH
命令进行的,在前方讲明频道的时候,大家提交了那

样一段伪代码,说它定义了 PUBLISH 命令的表现:

def PUBLISH(channel, message):

     # 遍历所有订阅频道 channel 的客户端
     for client in server.pubsub_channels[channel]:

          # 将信息发送给它们
          send_message(client, message)

     # 取出所有模式,以及订阅模式的客户端
     for pattern, client in server.pubsub_patterns:

          # 如果 channel 和模式匹配
          if match(channel, pattern):

               # 那么也将信息发给订阅这个模式的客户端
               send_message(client, message)

  

退订格局

行使 PUNSUBSCKoleosIBE
命令能够退订钦点的情势,这么些命令实行的是订阅形式的反操作:程序
会删除 redisServer.pubsub_patterns 链表中,全体和被退订情势相关联的
pubsubPattern

结构,那样客户端就不会再抽出和形式相匹配的频道发来的音信。

 

小结

  • 订阅消息由服务器进度维持的 redisServer.pubsub_channels 字典保存,
    • 字典的键为被订阅的频段,字典的值为订阅频道的具有客户端。
  • 当有新新闻发送到频道时,程序遍历频道(键)所对应的(值)全体客户端,
    • 下一场将音讯发送到全数订阅频道的客户端上。
  • 订阅方式的新闻由服务器进度维持的 redisServer.pubsub_patterns
    链表保存,

    • 链表的各样节点都保存着二个pubsub帕特tern结构,结构中保留着被订阅的格局,
    • 以及订阅该形式的客户端。程序通过遍历链表来搜求有些频道是不是和有些格局相称。
  • 当有新音讯发送到频道时,除了订阅频道的客户端会收到音讯之外,
    • 怀有订阅了相称频、道的方式的客户端,也如出1辙会抽出音信。
  • 退订频道和退订格局分别是订阅频道和订阅方式的反操作。

留下评论

网站地图xml地图