ntminer 5 years ago
parent
commit
33eeccd999

+ 10 - 8
src/WebApiServer/Core/Impl/ClientDataSet.cs

@@ -10,14 +10,16 @@ namespace NTMiner.Core.Impl {
     public class ClientDataSet : ClientDataSetBase, IClientDataSet {
         private const string _safeIgnoreMessage = "该消息发生的时间早于本节点启动时间1分钟,安全忽略";
 
-        private readonly IMinerRedis _redis;
+        private readonly IMinerRedis _minerRedis;
+        IClientDataRedis _clientDataRedis;
         private readonly IMinerClientMqSender _mqSender;
-        public ClientDataSet(IMinerRedis redis, IMinerClientMqSender mqSender) : base(isPull: false, getDatas: callback => {
-            redis.GetAllAsync().ContinueWith(t => {
+        public ClientDataSet(IMinerRedis minerRedis, IClientDataRedis clientDataRedis, IMinerClientMqSender mqSender) : base(isPull: false, getDatas: callback => {
+            minerRedis.GetAllAsync().ContinueWith(t => {
                 callback?.Invoke(t.Result);
             });
         }) {
-            _redis = redis;
+            _minerRedis = minerRedis;
+            _clientDataRedis = clientDataRedis;
             _mqSender = mqSender;
             // 收到Mq消息之前一定已经初始化完成,因为Mq消费者在ClientSetInitedEvent事件之后才会创建
             VirtualRoot.AddEventPath<SpeedDataMqMessage>("收到SpeedDataMq消息后更新ClientData内存", LogEnum.None, action: message => {
@@ -142,7 +144,7 @@ namespace NTMiner.Core.Impl {
                     _dicByObjectId.Add(clientData.Id, clientData);
                 }
                 var minerData = MinerData.Create(clientData);
-                _redis.SetAsync(minerData).ContinueWith(t => {
+                _minerRedis.SetAsync(minerData).ContinueWith(t => {
                     _mqSender.SendMinerDataAdded(minerData.Id);
                 });
             }
@@ -198,14 +200,14 @@ namespace NTMiner.Core.Impl {
             if (!IsReadied) {
                 return;
             }
-            _redis.SetAsync(minerData);
+            _minerRedis.SetAsync(minerData);
         }
 
         private void MinerSignChangedSave(MinerData minerData) {
             if (!IsReadied) {
                 return;
             }
-            _redis.SetAsync(minerData).ContinueWith(t => {
+            _minerRedis.SetAsync(minerData).ContinueWith(t => {
                 _mqSender.SendMinerSignChanged(minerData.Id);
             });
         }
@@ -223,7 +225,7 @@ namespace NTMiner.Core.Impl {
             if (!IsReadied) {
                 return;
             }
-            _redis.DeleteAsync(minerData).ContinueWith(t => {
+            _minerRedis.DeleteAsync(minerData).ContinueWith(t => {
                 _mqSender.SendMinerDataRemoved(minerData.Id);
             });
         }

+ 12 - 0
src/WebApiServer/Core/Redis/IClientDataRedis.cs

@@ -0,0 +1,12 @@
+using NTMiner.Core.MinerServer;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace NTMiner.Core.Redis {
+    public interface IClientDataRedis {
+        Task<List<ClientData>> GetAllAsync();
+        Task<ClientData> GetByIdAsync(string minerId);
+        Task SetAsync(ClientData data);
+        Task DeleteAsync(ClientData data);
+    }
+}

+ 62 - 0
src/WebApiServer/Core/Redis/Impl/ClientDataRedis.cs

@@ -0,0 +1,62 @@
+using NTMiner.Core.MinerServer;
+using StackExchange.Redis;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace NTMiner.Core.Redis.Impl {
+    public class ClientDataRedis : IClientDataRedis {
+        protected const string _redisKeyClientDataById = "clientDatas.ClientDataById";// 根据Id索引ClientData对象的json
+
+        protected readonly ConnectionMultiplexer _connection;
+        public ClientDataRedis(ConnectionMultiplexer connection) {
+            _connection = connection;
+        }
+
+        public Task<List<ClientData>> GetAllAsync() {
+            var db = _connection.GetDatabase();
+            return db.HashGetAllAsync(_redisKeyClientDataById).ContinueWith(t => {
+                List<ClientData> list = new List<ClientData>();
+                foreach (var item in t.Result) {
+                    if (item.Value.HasValue) {
+                        ClientData data = VirtualRoot.JsonSerializer.Deserialize<ClientData>(item.Value);
+                        if (data != null) {
+                            list.Add(data);
+                        }
+                    }
+                }
+                return list;
+            });
+        }
+
+        public Task<ClientData> GetByIdAsync(string minerId) {
+            if (string.IsNullOrEmpty(minerId)) {
+                return Task.FromResult<ClientData>(null);
+            }
+            var db = _connection.GetDatabase();
+            return db.HashGetAsync(_redisKeyClientDataById, minerId).ContinueWith(t => {
+                if (t.Result.HasValue) {
+                    return VirtualRoot.JsonSerializer.Deserialize<ClientData>(t.Result);
+                }
+                else {
+                    return null;
+                }
+            });
+        }
+
+        public Task DeleteAsync(ClientData data) {
+            if (data == null || string.IsNullOrEmpty(data.Id)) {
+                return TaskEx.CompletedTask;
+            }
+            var db = _connection.GetDatabase();
+            return db.HashSetAsync(_redisKeyClientDataById, data.Id, VirtualRoot.JsonSerializer.Serialize(data));
+        }
+
+        public Task SetAsync(ClientData data) {
+            if (data == null || string.IsNullOrEmpty(data.Id)) {
+                return TaskEx.CompletedTask;
+            }
+            var db = _connection.GetDatabase();
+            return db.HashDeleteAsync(_redisKeyClientDataById, data.Id);
+        }
+    }
+}

+ 2 - 1
src/WebApiServer/WebApiRoot.cs

@@ -69,6 +69,7 @@ namespace NTMiner {
                         var wsServerNodeMqSender = new WsServerNodeMqSender(_serverContext.Channel);
 
                         var minerRedis = new MinerRedis(_serverContext.RedisConn);
+                        var cleintDataRedis = new ClientDataRedis(_serverContext.RedisConn);
                         var userRedis = new UserRedis(_serverContext.RedisConn);
                         var captchaRedis = new CaptchaRedis(_serverContext.RedisConn);
 
@@ -78,7 +79,7 @@ namespace NTMiner {
                         CaptchaSet = new CaptchaSet(captchaRedis);
                         CalcConfigSet = new CalcConfigSet();
                         NTMinerWalletSet = new NTMinerWalletSet();
-                        ClientDataSet clientDataSet = new ClientDataSet(minerRedis, minerClientMqSender);
+                        ClientDataSet clientDataSet = new ClientDataSet(minerRedis, cleintDataRedis, minerClientMqSender);
                         ClientDataSet = clientDataSet;
                         CoinSnapshotSet = new CoinSnapshotSet(clientDataSet);
                         MineWorkSet = new UserMineWorkSet();

+ 2 - 0
src/WebApiServer/WebApiServer.csproj

@@ -148,8 +148,10 @@
     <Compile Include="Core\Mq\Senders\IUserMqSender.cs" />
     <Compile Include="Core\Mq\Senders\IWsServerNodeMqSender.cs" />
     <Compile Include="Core\Redis\ICaptchaRedis.cs" />
+    <Compile Include="Core\Redis\IClientDataRedis.cs" />
     <Compile Include="Core\Redis\IMinerRedis.cs" />
     <Compile Include="Core\Redis\Impl\CaptchaRedis.cs" />
+    <Compile Include="Core\Redis\Impl\ClientDataRedis.cs" />
     <Compile Include="Core\Redis\Impl\MinerRedis.cs" />
     <Compile Include="Core\Redis\Impl\UserRedis.cs" />
     <Compile Include="Core\Redis\IUserRedis.cs" />