ServiceStack Redis错误:"意外回复:*","协议错误:预期' $',得到''",丢失连接等

时间:2017-01-05 21:28:23

标签: servicestack servicestack.redis

使用萝卜时是否会遇到很多错误。

这是我的配置:

container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());

container.Register(new GameDispatchService(container.Resolve<IRedisClientsManager>()));

它改变了radis中数据的类

public class GameDispatchService {
        private readonly IRedisClientsManager redisManager;
        private Timer mTimer;

        public GameDispatchService(IRedisClientsManager redisManager) {
            this.redisManager = redisManager;

            mTimer = new Timer();

            mTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            mTimer.Interval = 1000;
            mTimer.Enabled = true;
        }

        private void OnTimedEvent(object sender, ElapsedEventArgs e) {
            mTimer.Stop();

            try {
                using (IRedisClient cacheClient = redisManager.GetClient()) {
                    var sessionPattern = "game:Created*";
                    var tSessionKeys = cacheClient.GetKeysStartingWith(sessionPattern).ToList();

                    if (!tSessionKeys.IsNullOrEmpty()) {
                        var list = cacheClient.GetAll<GameCachModel>(tSessionKeys);

                        foreach (var item in list) {
                            var lastKey = item.Key;
                            var newKey = $"game:{GameStatuses.Waiting}:{item.Value.GameNumber}";
                            item.Value.Status = GameStatuses.Waiting;

                            cacheClient.Remove(lastKey);
                            cacheClient.Add(newKey, item.Value);
                        }
                    }
                }
            } catch (Exception ex) {
                 var t = ex.Message;
                t.PrintDump();
            } finally {
                mTimer.Start();
            }

        }

        .......
    }

所以我收到了redis的数据

    List<GameRetModel> gamesList = new List<GameRetModel>();

                try {
                    using (var cacheClient = this.GetCacheClient()) {
                        var sessionPattern = "game:Waiting*";
                        var tSessionKeys = cacheClient.GetKeysStartingWith(sessionPattern)?.ToList();

                        if (!tSessionKeys.IsNullOrEmpty()) {
                            var list = cacheClient.GetAll<GameCachModel>(tSessionKeys);

                            foreach (var item in list.Values) {
                                if (item.Rate >= request.MinVal && item.Rate <= request.MaxVal) {
                                    gamesList.Add(new GameRetModel {
                                        Author = item.Author,
                                        Avatar = item.Avatar,
                                        GameNumber = item.GameNumber,
                                        Count = item.Users.Count,
                                        Rate = item.Rate
                                    });
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    e.Message.PrintDump();
                    return new { error = true };
                }

                return new { error = false, gamesList = gamesList };
}

我收到很多错误,我搜索了互联网,我理解多线程的问题,但我无法解决问题。

如果您知道如何正确行事,请提供帮助。

ServiceStack 4.5.5版 Redis 3.0.501

谢谢!

我收到以下错误:

1.消息:协议错误:预期&#39; $&#39;,得到&#39; C&#39;

追踪:

в ServiceStack.Redis.RedisNativeClient.ReadDeeplyNestedMultiDataItem()
   в ServiceStack.Redis.RedisNativeClient.ReadDeeplyNestedMultiData()
   в ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)
   в ServiceStack.Redis.RedisNativeClient.SendExpectDeeplyNestedMultiData(Byte[][] cmdWithBinaryArgs)
   в ServiceStack.Redis.RedisNativeClient.SendExpectScanResult(Byte[] cmd, Byte[][] args)
   в ServiceStack.Redis.RedisNativeClient.Scan(UInt64 cursor, Int32 count, String match)
   в ServiceStack.Redis.RedisClient.<ScanAllKeys>d__159.MoveNext()
   в System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   в System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   в loto.ServiceInterface.LotoServices.Post(GetGames request) в D:\Documents\Visual Studio 2015\Projects\loto\loto\loto.ServiceInterface\LotoServices.cs:строка 144
  1. 消息:意外回复:* 2
  2. 追踪:

    в ServiceStack.Redis.RedisNativeClient.ParseSingleLine(String r)
       в ServiceStack.Redis.RedisNativeClient.ReadData()
       в ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)
       в ServiceStack.Redis.RedisNativeClient.SendExpectData(Byte[][] cmdWithBinaryArgs)
       в ServiceStack.Redis.RedisNativeClient.Set(String key, Byte[] value, Boolean exists, Int32 expirySeconds, Int64 expiryMs)
       в ServiceStack.Redis.RedisClient.<>c__DisplayClass21_0`1.<Add>b__0(RedisClient r)
       в ServiceStack.Redis.RedisClient.Exec[T](Func`2 action)
       в ServiceStack.Redis.RedisClient.Add[T](String key, T value)
       в ServiceStack.Redis.RedisClientManagerCacheClient.Add[T](String key, T value)
       в loto.ServiceInterface.LotoServices.Post(CreateGame request) в D:\Documents\Visual Studio 2015\Projects\loto\loto\loto.ServiceInterface\LotoServices.cs:строка 42
    
    1. 消息:整数响应的未知回复:422
    2. 追踪:

       в ServiceStack.Redis.RedisNativeClient.ReadLong()
         в ServiceStack.Redis.RedisNativeClient.SendReceive[T](Byte[][] cmdWithBinaryArgs, Func`1 fn, Action`1 completePipelineFn, Boolean sendWithoutRead)
         в ServiceStack.Redis.RedisNativeClient.SendExpectLong(Byte[][] cmdWithBinaryArgs)
         в ServiceStack.Redis.RedisNativeClient.Del(Byte[] key)
         в ServiceStack.Redis.RedisClient.Remove(String key)
         в ServiceStack.Redis.RedisClientManagerCacheClient.Remove(String key)
         в loto.ServiceInterface.GameDispatchService.OnTimedEvent(Object sender, ElapsedEventArgs e) в D:\Documents\Visual Studio 2015\Projects\loto\loto\loto.ServiceInterface\GameDispatchService.cs:строка 67
      

      我有不同的数据这么多的错误

      enter image description here

1 个答案:

答案 0 :(得分:1)

ICacheClient是一个单身,它不应该被丢弃,所以你不应该把它放在使用中,即:

using (var cacheClient = this.GetCacheClient()) {

由于它已注册为ICacheClient,您可以使用以下方式解决此问题:

var cacheClient = HostContext.Cache;

这只是一个包装:

var cacheClient = HostContext.TryResolve<ICacheClient>();