在软件开发这个利润丰厚且极其耗费精力的领域,最近一次搜索之旅(通常从Google开始,以CodeProject结束)让置身于一个充满诱惑的雷区。这个雷区包含了如此多的功能,以至于开始怀疑——没有它人们是如何生存的?说的是被称为Redis的NoSQL键值存储。在继续阅读本文之前,建议先浏览一下这个网站。在本文中,将指导创建一个非常简单的Redis组件(一个Windows控制台应用程序),该程序接受用户输入的字符串并将其存储在Redis中。还将描述这个存储的字符串将如何被另一个应用程序读取。
本系列文章的基本思想是介绍使用Redis作为数据库的概念,用于实际的数据在一系列松散耦合组件之间的移动。由于松散耦合的组件最有可能需要高内聚,希望引导使用Redis来实现这一目的。之所以加入Redis的行列,是因为数据可以在一个高度自由的环境中更快地移动。但请注意,与传统数据库(如Oracle、MySQL、SQL Server等)不同,Redis是非持久性的:如果服务器关闭,数据将丢失。但不用担心,因为Redis支持数据的持久性,条件是它发生在间隔或手动请求时。现在,让继续。
要使用此代码,请在VB.NET中创建一个Windows控制台应用程序项目(使用.NET 3.5)。不推荐使用.NET 4,因为Redis库是用3.5编写的,而在.NET 4项目中使用该库时存在一些未解决的问题。此操作的先决条件是:
创建项目。
向ServiceStack库中的所有DLL添加引用。
接受用户输入到一个变量。
Imports ServiceStack.Redis
'''
''' Redis存储封装类,围绕ServiceStack Redis客户端
'''
'''
''' 这个类是在教程中累积构建的,并且没有中断。
'''
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 " 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("服务器尚未启动!")
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
#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
将字符串传递给RedisStore类的SetKey函数以存储它,并调用GetKey函数来检索它。还会注意到Redis允许使用GetKey(Of T)函数将其整个对象存储在其存储中!