首页新闻找找看学习计划

ServiceStack.Redis 如何保存与读取二维数组

0
悬赏园豆:50 [待解决问题]

保存代码如下:

_cache.Set<Byte[][]>(key, data);

读取代码如下:

var value = _cache.Get<byte[][]>(key);

保存代码可以将数据保存到redis服务器:

["AgAAAiQslpamPe+CTac9Y7tKLI8AEGd0X3NlcnZlcl9zdGF0dXMAAAAEAAAAAQALR2VldGVzdEd1aWQAAAAkN2UyMjFhOTItMThlOS00YTM4LWE4MDgtODUzZjlmODYwMjNh","eyJBYnNvbHV0ZUV4cGlyYXRpb24iOm51bGwsIkFic29sdXRlRXhwaXJhdGlvblJlbGF0aXZlVG9Ob3ciOm51bGwsIlNsaWRpbmdFeHBpcmF0aW9uIjoiMDA6MjA6MDAifQ=="]

但读取时出现如下的错误:

ServiceStack.Redis.RedisResponseException: Unknown reply on integer response: 43OK
   at ServiceStack.Redis.RedisNativeClient.ReadLong() in /opt/lib/teamcity-agent/work/8dcfdcec54d0f21a/src/ServiceStack.Redis/RedisNativeClient_Utils.cs:line 850
   at ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead) in /opt/lib/teamcity-agent/work/8dcfdcec54d0f21a/src/ServiceStack.Redis/RedisNativeClient_Utils.cs:line 572

请问如何解决这个问题?

问题补充:

不好意思,弄错了,异常是在 _cache.ContainsKey(key) 时抛出的。

后来发现 _cache.ContainsKey(key) 的异常是因为多线程访问RedisClient的单例引起的,当时RedisClient的实例是通过  new RedisClient() ,后来改为 new RedisManagerPool(host)..GetClient() 问题就解决了。

dudu的主页 dudu | 高人七级 | 园豆:41258
提问于:2017-01-06 14:17

请问你的redis帮助类是怎么封装的?能分享一份出来吗

懒东 11个月前
< >
分享
所有回答(3)
0

可以序列化保存然后反序列化读取,或者用其他方式来模拟二维数组(如list)

多线程访问redis?,有用连接池?

风行魔狼 | 园豆:487 (菜鸟二级) | 2017-01-06 14:49
0

不太懂为何要保存对象,事实上即使可以也是因为它内部实现了序列化、反序列化

何不使用最原始的 k/v 都使用 string 呢?

nicye | 园豆:208 (菜鸟二级) | 2017-01-06 16:37
0

试试redis的命令行能不能用exists 命令检测到这个key

如果可以的话,那就是servicestack.redist的实现由问题。

它的源码是这样的

 1 public long ReadLong()
 2         {
 3             int c = SafeReadByte();
 4             if (c == -1)
 5                 throw CreateNoMoreDataError();
 6 
 7             var s = ReadLine();
 8 
 9             if (log.IsDebugEnabled)
10                 Log("R: {0}", s);
11 
12             if (c == '-')
13                 throw CreateResponseError(s.StartsWith("ERR") ? s.Substring(4) : s);
14 
15             if (c == ':' || c == '$')//really strange why ZRANK needs the '$' here
16             {
17                 long i;
18                 if (long.TryParse(s, out i))
19                     return i;
20             }
21             throw CreateResponseError("Unknown reply on integer response: " + c + s);
22         }

c是直接由一个networkstream读取的一个byte,如果c不等于:或$,就是出问题了。

https://github.com/ServiceStack/ServiceStack.Redis/blob/2b833b6e574067bc94dd5a504cf2fd5d6e7ce12c/src/ServiceStack.Redis/RedisNativeClient_Utils.cs

 

c99 | 园豆:1832 (小虾三级) | 2017-01-06 22:05

后来发现 _cache.ContainsKey(key) 的异常是因为多线程访问RedisClient的单例引起的,当时RedisClient的实例是通过  new RedisClient() ,后来改为 new RedisManagerPool(host)..GetClient() 问题就解决了。

支持(0) 反对(0) dudu | 园豆:41258 (高人七级) | 2017-01-06 22:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册