public async Task<bool> RegistAppInstanceAsync(BahamutAppInstance instance)
 {
     instance.RegistTime = DateTime.UtcNow;
     instance.Id = Guid.NewGuid().ToString();
     var suc = await redis.GetDatabase().StringSetAsync(instance.GetInstanceIdKey(), instance.ToJson());
     if (suc)
     {
         return await PublishNotifyAsync(instance, BahamutAppInstanceNotification.TYPE_REGIST_APP_INSTANCE);
     }
     return false;
 }
 public async Task<bool> ReActiveAppInstance(BahamutAppInstance instance)
 {
     var instanceJson = instance.ToJson();
     var suc = await redis.GetDatabase().StringSetAsync(instance.GetInstanceIdKey(), instanceJson);
     if (suc)
     {
         return await PublishNotifyAsync(instance, BahamutAppInstanceNotification.TYPE_REGIST_APP_INSTANCE);
     }
     return false;
 }
 public KeepAliveObserver StartKeepAlive(BahamutAppInstance instance)
 {
     var observer = new KeepAliveObserver();
     var thread = new Thread(() =>
     {
         var idKey = instance.GetInstanceIdKey();
         while (true)
         {
             try
             {
                 var db = redis.GetDatabase();
                 if (db.KeyExpire(idKey, AppInstanceExpireTime))
                 {
                     observer.DispatchExpireOnce(instance);
                 }else
                 {
                     observer.DispatchExpireError(instance, new Exception("Expire Instance Error"));
                 }
             }
             catch (Exception ex)
             {
                 observer.DispatchExpireError(instance, ex);
             }
             Thread.Sleep((int)(AppInstanceExpireTime.TotalMilliseconds * 3 / 4));
         }
     });
     thread.IsBackground = true;
     thread.Start();
     return observer;
 }