diff --git a/src/CSRedisCore/CSRedisClient.cs b/src/CSRedisCore/CSRedisClient.cs index 78a7dfc..c28f643 100644 --- a/src/CSRedisCore/CSRedisClient.cs +++ b/src/CSRedisCore/CSRedisClient.cs @@ -9,6 +9,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.IO; namespace CSRedis { @@ -3288,6 +3289,21 @@ public long BitOp(RedisBitOp op, string destKey, params string[] keys) /// public T Get(string key) => this.DeserializeRedisValueInternal(ExecuteScalar(key, (c, k) => c.Value.GetBytes(k))); /// + /// 获取指定 key 的值(适用大对象返回) + /// + /// 不含prefix前辍 + /// 读取后写入目标流中 + /// 读取缓冲区 + public void Get(string key, Stream destination, int bufferSize = 1024) + { + ExecuteScalar(key, (c, k) => + { + c.Value.WriteNoneRead(new Internal.Commands.RedisString("GET", k)); + c.Value._reader.ReadBulkBytes(destination, bufferSize, true); + return true; + }); + } + /// /// 对 key 所储存的值,获取指定偏移量上的位(bit) /// /// 不含prefix前辍 diff --git a/src/CSRedisCore/CSRedisCore.csproj b/src/CSRedisCore/CSRedisCore.csproj index 7cce563..56c45d3 100644 --- a/src/CSRedisCore/CSRedisCore.csproj +++ b/src/CSRedisCore/CSRedisCore.csproj @@ -4,7 +4,7 @@ CSRedisCore CSRedisCore CSRedisCore - 3.6.3 + 3.6.5 true https://github.com/2881099/csredis CSRedis 是 redis.io 官方推荐库,支持 redis-trib集群、哨兵、私有分区与连接池管理技术,简易 RedisHelper 静态类。 diff --git a/src/CSRedisCore/Internal/RedisConnector.cs b/src/CSRedisCore/Internal/RedisConnector.cs index d9983ca..9a46ee2 100644 --- a/src/CSRedisCore/Internal/RedisConnector.cs +++ b/src/CSRedisCore/Internal/RedisConnector.cs @@ -18,7 +18,7 @@ class RedisConnector readonly int _bufferSize; internal readonly IRedisSocket _redisSocket; readonly EndPoint _endPoint; - readonly RedisIO _io; + internal readonly RedisIO _io; public event EventHandler Connected; @@ -105,6 +105,28 @@ public T Call(RedisCommand command) } } + public void CallNoneRead(RedisCommand command) + { + ConnectIfNotConnected(); + + try + { + //Console.WriteLine("--------------Call " + command.ToString()); + _io.Write(_io.Writer.Prepare(command)); + } + catch (IOException) + { + if (ReconnectAttempts == 0) + throw; + Reconnect(); + CallNoneRead(command); + } + catch (RedisException ex) + { + throw new RedisException($"{ex.Message}\r\nCommand: {command}", ex); + } + } + #if net40 #else async public Task CallAsync(RedisCommand command) diff --git a/src/CSRedisCore/RedisClient.Sync.cs b/src/CSRedisCore/RedisClient.Sync.cs index 80048f0..c6e1342 100644 --- a/src/CSRedisCore/RedisClient.Sync.cs +++ b/src/CSRedisCore/RedisClient.Sync.cs @@ -43,6 +43,8 @@ T Write(RedisCommand command) return _connector.Call(command); } + internal void WriteNoneRead(RedisCommand command) => _connector.CallNoneRead(command); + #region Connection /// /// Authenticate to the server diff --git a/src/CSRedisCore/RedisClient.cs b/src/CSRedisCore/RedisClient.cs index 86a6b4b..34f1bab 100644 --- a/src/CSRedisCore/RedisClient.cs +++ b/src/CSRedisCore/RedisClient.cs @@ -25,6 +25,7 @@ public partial class RedisClient : IRedisClientSync, IRedisClientAsync readonly SubscriptionListener _subscription; readonly MonitorListener _monitor; bool _streaming; + internal RedisReader _reader => _connector?._io?.Reader; internal Socket Socket => (_connector?._redisSocket as RedisSocket)?._socket; diff --git a/src/CSRedisCore/RedisHelper.cs b/src/CSRedisCore/RedisHelper.cs index c98cc95..2680adb 100644 --- a/src/CSRedisCore/RedisHelper.cs +++ b/src/CSRedisCore/RedisHelper.cs @@ -5,6 +5,7 @@ using System.Diagnostics; using System.Linq; using System.Threading; +using System.IO; public abstract class RedisHelper : RedisHelper { } @@ -1355,6 +1356,13 @@ public static RedisScan SScan(string key, long cursor, string pattern = nu /// public static T Get(string key) => Instance.Get(key); /// + /// 获取指定 key 的值(适用大对象返回) + /// + /// 不含prefix前辍 + /// 读取后写入目标流中 + /// 读取缓冲区 + public static void Get(string key, Stream destination, int bufferSize = 1024) => Instance.Get(key, destination, bufferSize); + /// /// 对 key 所储存的值,获取指定偏移量上的位(bit) /// /// 不含prefix前辍 diff --git a/src/Microsoft.Extensions.Caching.CSRedis/Microsoft.Extensions.Caching.CSRedis.csproj b/src/Microsoft.Extensions.Caching.CSRedis/Microsoft.Extensions.Caching.CSRedis.csproj index 6aa0e1a..92fbeb0 100644 --- a/src/Microsoft.Extensions.Caching.CSRedis/Microsoft.Extensions.Caching.CSRedis.csproj +++ b/src/Microsoft.Extensions.Caching.CSRedis/Microsoft.Extensions.Caching.CSRedis.csproj @@ -4,7 +4,7 @@ Caching.CSRedis Caching.CSRedis Caching.CSRedis - 3.6.3 + 3.6.5 true https://github.com/2881099/csredis/tree/master/src/Microsoft.Extensions.Caching.CSRedis/README.md 分布式缓存 CSRedisCore 实现 Microsoft.Extensions.Caching diff --git a/test/CSRedisCore.Tests/CSRedisClientStringTests.cs b/test/CSRedisCore.Tests/CSRedisClientStringTests.cs index 5e72771..eb65865 100644 --- a/test/CSRedisCore.Tests/CSRedisClientStringTests.cs +++ b/test/CSRedisCore.Tests/CSRedisClientStringTests.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -19,6 +20,10 @@ public void Append() { rds.Set(key, base.String); rds.Append(key, base.String); Assert.Equal(rds.Get(key), base.String + base.String); + var ms = new MemoryStream(); + rds.Get(key, ms); + Assert.Equal(Encoding.UTF8.GetString(ms.ToArray()), base.String + base.String); + ms.Close(); key = "TestAppend_bytes"; rds.Set(key, base.Bytes);