vb.net做的redis接口,在get和set数据量大的时候出错,怎么扩大我接口承受数据量

新手上路,请多包涵

问题描述

vb.net做的redis接口,在get和set数据量大的时候出错,怎么扩大接口的传输的数据量

问题出现的环境背景及自己尝试过哪些方法

ReDim bytes() 修改bytes存储量没用
TcpClient连接缓存 NetworkStream读写大小限制

相关代码

Imports System.Drawing
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports vRedis.Commands

Public Class RedisClient

Private client As TcpClient
Private stream As NetworkStream
Private reply As RedisReply
Private command As IRedisCommand
Private memStream As MemoryStream

Public ReadOnly Property Host As String

Public ReadOnly Property Port As Integer

Public ReadOnly Property [Return] As Object
    Get
        Return reply.Value
    End Get
End Property

Public Sub New(Optional host As String = "127.0.0.1", Optional port As Integer = 6379)
    If IsNothing(host) Then
        Throw New ArgumentNullException(NameOf(host))
    End If
    Me.Host = host
    Me.Port = port
    client = New TcpClient()
    Try
        client.Connect(host, port)
        'TCPclient连接发送接收数据如何扩大容量
        stream = client.GetStream()
    Catch ex As Exception
        Throw New RedisException("An existing connection was forcibly closed by remote host.")
    End Try
End Sub

Public Sub Quit()
    command = New QuitCommand()
    Execute(command)
End Sub

Public Sub Append(key As String, value As String)
    command = New AppendCommand() With {.Key = key, .Value = value}
    Execute(command)
End Sub

Public Sub Del(ParamArray keys() As String)
    command = New DelCommand() With {.Keys = keys}
    Execute(command)
End Sub

Public Function Dump(key As String) As Byte()
    command = New DumpCommand() With {.Key = key}
    Execute(command)
    If IsNothing(reply.Value) Then
        Return Nothing
    Else
        Return Encoding.UTF8.GetBytes(reply.Value)
    End If
End Function

Public Sub Echo(message As String)
    command = New EchoCommand() With {.Message = message}
    Execute(command)
End Sub

Public Function Exists(key As String) As Boolean
    command = New ExistsCommand() With {.Key = key}
    Execute(command)
    Return reply.Value
End Function

Public Sub Expire(key As String, timeout As Integer)
    command = New ExpireCommand() With {.Key = key, .Timeout = timeout}
    Execute(command)
End Sub

Public Sub ExpireAt(key As String, ttl As DateTime)
    command = New ExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalSeconds}
    Execute(command)
End Sub

Public Function [Get](key As String) As String
    command = New GetCommand() With {.Key = key}
    Execute(command)
    Return reply.Value
End Function

Public Sub PExpire(key As String, timeout As Integer)
    command = New PExpireCommand() With {.Key = key, .Timeout = timeout}
    Execute(command)
End Sub

Public Sub PExpireAt(key As String, ttl As DateTime)
    command = New PExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalMilliseconds}
    Execute(command)
End Sub

Public Sub Ping()
    command = New PingCommand()
    Execute(command)
End Sub

Public Sub Auth(password As String)
    command = New AuthCommand() With {.Password = password}
    Execute(command)
End Sub

Public Sub [Select](index As String)
    command = New SelectCommand() With {.Index = index}
    Execute(command)
End Sub

Public Sub [Set](key As String, value As String, Optional expireTime As TimeSpan? = Nothing, Optional override As Boolean? = Nothing)
    command = New SetCommand() With {.Key = key, .Value = value, .ExpireTime = expireTime, .Override = override}
    Execute(command)
End Sub

Public Function Time() As Date
    command = New TimeCommand()
    Execute(command)
    'Return #1/1/1970#.AddSeconds(reply.Value(0)).ToLocalTime()
End Function

Private Sub Execute(command As IRedisCommand)
    Dim bytes() As Byte = Encoding.UTF8.GetBytes(command.GetCommand() & vbCrLf)
    Try
        stream.Write(bytes, 0, bytes.Length)
        stream.Flush()
        'ReDim bytes(65535)
        '这里stream的读写缓存如何扩大
        ReDim bytes(client.ReceiveBufferSize)
        stream.Read(bytes, 0, bytes.Length)
        Dim result = Encoding.UTF8.GetString(bytes)
        Select Case result(0)
            Case "$"
                Dim length = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))
                If length = -1 Then
                    reply = New RedisReply(RESPType.BulkString, Nothing)
                Else
                    reply = New RedisReply(RESPType.BulkString, result.Substring(result.IndexOf(vbCrLf) + 2, length))
                End If
            Case "+"
                reply = New RedisReply(RESPType.SimpleString, result.Substring(1, result.IndexOf(vbCrLf) - 1))
            Case ":"
                reply = New RedisReply(RESPType.Integer, Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1)))
            Case "-"
                reply = New RedisReply(RESPType.Error, result.Substring(1, result.IndexOf(vbCrLf) - 1))
                Throw New RedisException(reply.Value)
            Case "*"
                Dim count = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))
                Dim items = result.Split(New Char() {vbCrLf, vbLf}, StringSplitOptions.RemoveEmptyEntries).ToList()
                items.RemoveAt(0)
                items.RemoveAll(Function(i) i.StartsWith("$"))
                items.RemoveAt(items.Count - 1)
                'reply = New RedisReply(RESPType.Array, items)
        End Select
    Catch ex As Exception
        Throw New RedisException($"There is an internal error during executing '{command.GetCommand()}'.")
    End Try
End Sub

End Class

你期待的结果是什么?实际看到的错误信息又是什么?

支持大数据量的get set,比如redis在命令行下字符串的存储量有512M

阅读 2k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进