From 4ba4fd2d03bfaed4fdc074a546f76e3b98894d50 Mon Sep 17 00:00:00 2001
From: fajiao <1519100073@qq.com>
Date: Thu, 1 Dec 2022 17:53:20 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E5=8E=9F=20Redis=20=E6=A1=86=E6=9E=B6?=
=?UTF-8?q?=E5=AD=98=E5=9C=A8=E8=B6=85=E6=97=B6=E9=97=AE=E9=A2=98=EF=BC=8C?=
=?UTF-8?q?=E6=9F=A5=E8=AF=A2=E8=B5=84=E6=96=99=E5=8F=91=E7=8E=B0=E6=94=B9?=
=?UTF-8?q?=E6=A1=86=E6=9E=B6=E5=9C=A8=E9=AB=98=E5=B9=B6=E5=8F=91=E6=83=85?=
=?UTF-8?q?=E5=86=B5=E4=B8=8B=E8=A1=A8=E7=8E=B0=E4=B8=8D=E4=BD=B3=EF=BC=8C?=
=?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BD=BF=E7=94=A8=20FreeRedis=20=E6=A1=86?=
=?UTF-8?q?=E6=9E=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Cis.Application/Cis.Application.xml | 29 +++++++--
.../Cm/Service/CmMarkLabelService.cs | 4 +-
.../Core/Center/CameraDataCenter.cs | 65 +++++++++----------
.../Component/CameraSDK/CameraSdkServer.cs | 36 +++++++---
.../Component/CameraSDK/ICameraSdkServer.cs | 29 +++++++--
.../MarkSeacher/MarkSearcherServer.cs | 21 +++---
Cis.Core/Cache/CacheSetup.cs | 7 +-
Cis.Core/Cache/SqlSugarCache.cs | 2 +-
Cis.Core/Cis.Core.csproj | 4 +-
Cis.Core/CoreConfig.json | 4 +-
10 files changed, 129 insertions(+), 72 deletions(-)
diff --git a/Cis.Application/Cis.Application.xml b/Cis.Application/Cis.Application.xml
index 1b4c7d7..40d6810 100644
--- a/Cis.Application/Cis.Application.xml
+++ b/Cis.Application/Cis.Application.xml
@@ -416,19 +416,40 @@
-
+
获取 ptz
-
-
+
-
+
获取 ptz
+
+
+
+
+ 获取 ptz
+
+
+
+
+
+
+
+ 获取 ptz
+
+
+
+
+
+
+ 获取 ptz
+
+
diff --git a/Cis.Application/Cm/Service/CmMarkLabelService.cs b/Cis.Application/Cm/Service/CmMarkLabelService.cs
index a007476..ce2c93d 100644
--- a/Cis.Application/Cm/Service/CmMarkLabelService.cs
+++ b/Cis.Application/Cm/Service/CmMarkLabelService.cs
@@ -26,7 +26,7 @@ public class CmMarkLabelService : IDynamicApiController, ITransient
[HttpPost]
public async Task Add([FromForm] CmMarkLabel entity)
{
- bool ret = _cameraSdk.GetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo);
+ bool ret = _cameraSdk.TryGetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo);
if (!ret) return false;
entity.PanPosition = ptzInfo.Pan;
entity.TiltPosition = ptzInfo.Tilt;
@@ -37,7 +37,7 @@ public class CmMarkLabelService : IDynamicApiController, ITransient
[HttpPost]
public async Task AddReturnId([FromForm] CmMarkLabel entity)
{
- bool ret = _cameraSdk.GetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo);
+ bool ret = _cameraSdk.TryGetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo);
if (!ret) return 0;
entity.PanPosition = ptzInfo.Pan;
entity.TiltPosition = ptzInfo.Tilt;
diff --git a/Cis.Application/Core/Center/CameraDataCenter.cs b/Cis.Application/Core/Center/CameraDataCenter.cs
index 0c6d78b..3a21605 100644
--- a/Cis.Application/Core/Center/CameraDataCenter.cs
+++ b/Cis.Application/Core/Center/CameraDataCenter.cs
@@ -1,8 +1,8 @@
using Cis.Application.Core.Component.MarkSeacher;
using Cis.Application.Core.Component.PtzServer;
using EC.Helper.CameraSDK;
+using FreeRedis;
using StackExchange.Profiling.Internal;
-using StackExchange.Redis;
using System.Collections.Concurrent;
namespace Cis.Application.Core;
@@ -11,7 +11,7 @@ public class CameraDataCenter : ISingleton
{
#region Attr
- private readonly IDatabase _cache;
+ private readonly RedisClient _cache;
private readonly CameraDataOptions _options;
private readonly ICameraSdkServer _cameraSdkServer;
private readonly IMarkSearcherServer _markSearcherServer;
@@ -25,7 +25,7 @@ public class CameraDataCenter : ISingleton
#endregion Attr
public CameraDataCenter(
- IDatabase cache,
+ RedisClient cache,
ICameraSdkServer cameraSdkServer,
IMarkSearcherServer markSearcherServer
)
@@ -49,11 +49,11 @@ public class CameraDataCenter : ISingleton
private void InitThread()
{
// 初始化 CameraPtzThread
- RefreshCameraPtzThread = new Thread(() =>
+ RefreshCameraPtzThread = new Thread(async () =>
{
while (true)
{
- RefreshCameraPtzInfos();
+ await RefreshCameraPtzInfos();
Thread.Sleep(_options.CameraPtz.LoopInterval);
}
})
@@ -63,20 +63,20 @@ public class CameraDataCenter : ISingleton
// 启动 CameraPtzThread
RefreshCameraPtzThread.Start();
- // 初始化 MarkSearcherThread
- RefreshMarkSearcherThread = new Thread(() =>
- {
- while (true)
- {
- RefreshMarkSearchers();
- Thread.Sleep(_options.MarkSearcher.LoopInterval);
- }
- })
- {
- IsBackground = true// 设置后台线程
- };
- // 启动 MarkSearcherThread
- RefreshMarkSearcherThread.Start();
+ //// 初始化 MarkSearcherThread
+ //RefreshMarkSearcherThread = new Thread(async () =>
+ //{
+ // while (true)
+ // {
+ // await RefreshMarkSearchers();
+ // Thread.Sleep(_options.MarkSearcher.LoopInterval);
+ // }
+ //})
+ //{
+ // IsBackground = true// 设置后台线程
+ //};
+ //// 启动 MarkSearcherThread
+ //RefreshMarkSearcherThread.Start();
}
///
@@ -84,13 +84,12 @@ public class CameraDataCenter : ISingleton
/// 有待改善,应设置超时计数机制
/// https://blog.csdn.net/qq_28368039/article/details/118597396
///
- private async void RefreshCameraPtzInfos()
+ private async Task RefreshCameraPtzInfos()
{
- HashEntry[] entries = _cache.HashGetAll(CacheInfo.CameraIpCounts);
+ string[] cameraIpList = await _cache.HKeysAsync(CacheInfo.CameraIpCounts);
List tasks = new();
- foreach (HashEntry entry in entries)
+ foreach (string cameraIp in cameraIpList)
{
- string cameraIp = entry.Name;
tasks.Add(RefreshCameraPtzInfo(cameraIp));
}
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(_options.CameraPtz.Timeout));
@@ -103,21 +102,20 @@ public class CameraDataCenter : ISingleton
///
private async Task RefreshCameraPtzInfo(string cameraIp)
{
- bool ret = _cameraSdkServer.GetPtzInfoByIp(cameraIp, out PtzInfo ptzInfo);
+ bool ret = _cameraSdkServer.TryGetPtzInfoByIp(cameraIp, out PtzInfo ptzInfo);
if (!ret) return;
- await _cache.HashSetAsync(CacheInfo.CameraPtzInfos, cameraIp, ptzInfo.ToJson());
+ await _cache.HSetAsync(CacheInfo.CameraPtzInfos, cameraIp, ptzInfo.ToJson());
}
///
/// 刷新所有 markSearcher
///
- private async void RefreshMarkSearchers()
+ private async Task RefreshMarkSearchers()
{
- HashEntry[] entries = _cache.HashGetAll(CacheInfo.CameraId2Ip);
+ string[] cameraIdList = await _cache.HKeysAsync(CacheInfo.CameraId2Ip);
List tasks = new();
- foreach (HashEntry entry in entries)
+ foreach (string cameraId in cameraIdList)
{
- string cameraId = entry.Name;
tasks.Add(RefreshMarkSearcher(cameraId.ToLong()));
}
await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(_options.CameraPtz.Timeout));
@@ -132,10 +130,11 @@ public class CameraDataCenter : ISingleton
{
MarkSearcherBase markSearcher = _markSearcherServer.GetSearcher(cameraId);
if (markSearcher == null) return;
- string cameraIp = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId);
- RedisValue value = _cache.HashGet(CacheInfo.CameraPtzInfos, cameraIp);
- if (!value.HasValue) return;
- PtzInfo ptzInfo = value.ToString().FromJson();
+ string cameraIp = await _cache.HGetAsync(CacheInfo.CameraId2Ip, cameraId.ToString());
+ string ptzInfoStr = await _cache.HGetAsync(CacheInfo.CameraPtzInfos, cameraIp);
+ if (string.IsNullOrEmpty(ptzInfoStr)) return;
+ PtzInfo ptzInfo = ptzInfoStr.ToObject();
+ if (ptzInfo == null) return;
markSearcher.UpdateCameraCalcParams(ptzInfo);
List resultList = await markSearcher.SearchAsync();
SearchResultListDict[cameraId] = resultList;
diff --git a/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs b/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs
index eeab93b..9043bff 100644
--- a/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs
+++ b/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs
@@ -1,6 +1,6 @@
using Cis.Application.Core.Component.PtzServer;
using EC.Helper.CameraSDK;
-using StackExchange.Redis;
+using FreeRedis;
using System.Collections.Concurrent;
namespace Cis.Application.Core.Component.CameraSDK;
@@ -12,7 +12,7 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton
{
#region Attr
- private readonly IDatabase _cache;
+ private readonly RedisClient _cache;
///
/// {ip, ICameraSDK}
@@ -21,7 +21,7 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton
#endregion Attr
- public CameraSdkServer(IDatabase cache)
+ public CameraSdkServer(RedisClient cache)
{
_cache = cache;
}
@@ -54,20 +54,38 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton
#region Main Method
- public bool GetPtzInfoById(string cameraId, out PtzInfo ptzInfo)
+ public PtzInfo GetPtzInfoByIp(string ip)
{
- RedisValue value = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId);
- if (!value.HasValue) { ptzInfo = PtzInfo.Default; return false; }
- string ip = value.ToString();
- return GetPtzInfoByIp(ip, out ptzInfo);
+ bool ret = CameraSdkDict.TryGetValue(ip, out ICameraSDK cameraSDK);
+ if (!ret) return PtzInfo.Default;
+ return cameraSDK.GetPtzInfo();
}
- public bool GetPtzInfoByIp(string ip, out PtzInfo ptzInfo)
+ public async Task GetPtzInfoByIpAsync(string ip)
+ {
+ return await Task.Run(() => GetPtzInfoByIp(ip));
+ }
+
+ public bool TryGetPtzInfoByIp(string ip, out PtzInfo ptzInfo)
{
bool ret = CameraSdkDict.TryGetValue(ip, out ICameraSDK cameraSDK);
if (!ret) { ptzInfo = PtzInfo.Default; return false; }
return cameraSDK.TryGetPtzInfo(out ptzInfo);
}
+ public async Task GetPtzInfoByIdAsync(string cameraId)
+ {
+ string ip = await _cache.HGetAsync(CacheInfo.CameraId2Ip, cameraId);
+ if (string.IsNullOrEmpty(ip)) return PtzInfo.Default;
+ return GetPtzInfoByIp(ip);
+ }
+
+ public bool TryGetPtzInfoById(string cameraId, out PtzInfo ptzInfo)
+ {
+ string ip = _cache.HGet(CacheInfo.CameraId2Ip, cameraId);
+ if (string.IsNullOrEmpty(ip)) { ptzInfo = PtzInfo.Default; return false; }
+ return TryGetPtzInfoByIp(ip, out ptzInfo);
+ }
+
#endregion Main Method
}
\ No newline at end of file
diff --git a/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs b/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs
index 30adb5c..172b960 100644
--- a/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs
+++ b/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs
@@ -37,18 +37,39 @@ public interface ICameraSdkServer
///
/// 获取 ptz
///
- ///
- ///
+ ///
///
- public bool GetPtzInfoById(string cameraId, out PtzInfo ptzInfo);
+ public PtzInfo GetPtzInfoByIp(string ip);
///
/// 获取 ptz
///
///
+ ///
+ public Task GetPtzInfoByIpAsync(string ip);
+
+ ///
+ /// 获取 ptz
+ ///
+ ///
+ ///
+ ///
+ public bool TryGetPtzInfoByIp(string ip, out PtzInfo ptzInfo);
+
+ ///
+ /// 获取 ptz
+ ///
+ ///
+ ///
+ public Task GetPtzInfoByIdAsync(string cameraId);
+
+ ///
+ /// 获取 ptz
+ ///
+ ///
///
///
- public bool GetPtzInfoByIp(string ip, out PtzInfo ptzInfo);
+ public bool TryGetPtzInfoById(string cameraId, out PtzInfo ptzInfo);
#endregion Main Method
}
\ No newline at end of file
diff --git a/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs b/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs
index cb497e3..5c6db29 100644
--- a/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs
+++ b/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs
@@ -2,7 +2,7 @@
using Cis.Application.Cm;
using Cis.Application.Core.Component.PtzServer;
using EC.Helper.CameraSDK;
-using StackExchange.Redis;
+using FreeRedis;
using System.Collections.Concurrent;
namespace Cis.Application.Core.Component.MarkSeacher;
@@ -17,7 +17,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton
private readonly SqlSugarRepository _cbCameraRep;
private readonly SqlSugarRepository _cbCameraParamsRep;
private readonly SqlSugarRepository _cmMarkLableRep;
- private readonly IDatabase _cache;
+ private readonly RedisClient _cache;
private readonly ICameraSdkServer _cameraSdkServer;
@@ -34,7 +34,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton
#endregion Attr
public MarkSearcherServer(
- IDatabase cache,
+ RedisClient cache,
ICameraSdkServer cameraSdkServer
)
{
@@ -89,7 +89,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton
if (!ret) return false;
}
}
- ret = _cameraSdkServer.GetPtzInfoByIp(cbCamera.Ip, out PtzInfo ptzInfo);
+ ret = _cameraSdkServer.TryGetPtzInfoByIp(cbCamera.Ip, out PtzInfo ptzInfo);
if (!ret) return false;
// 创建相机计算参数
@@ -117,8 +117,8 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton
ret = MarkSearcherDict.TryAdd(cameraId, markSearcher);
if (!ret) return false;
// 记录缓存
- _cache.HashSet(CacheInfo.CameraId2Ip, cbCamera.Id, cbCamera.Ip);
- _cache.HashIncrement(CacheInfo.CameraIpCounts, cbCamera.Ip);
+ _cache.HSet(CacheInfo.CameraId2Ip, cbCamera.Id.ToString(), cbCamera.Ip);
+ _cache.HIncrBy(CacheInfo.CameraIpCounts, cbCamera.Ip, 1);
return true;
}
@@ -144,11 +144,10 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton
{
bool ret = MarkSearcherDict.TryRemove(cameraId, out _);
if (!ret) return false;
- RedisValue value = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId);
- if (!value.HasValue) return false;
- string cameraIp = (string)value;
- _cache.HashDelete(CacheInfo.CameraId2Ip, cameraId);
- _cache.HashDecrement(CacheInfo.CameraIpCounts, cameraIp);
+ string cameraIp = _cache.HGet(CacheInfo.CameraId2Ip, cameraId.ToString());
+ if (string.IsNullOrEmpty(cameraIp)) return false;
+ _cache.HDel(CacheInfo.CameraId2Ip, cameraId.ToString());
+ _cache.HIncrBy(CacheInfo.CameraIpCounts, cameraIp, -1);
//int ipCount = (int)_cache.HashGet(CacheInfo.CameraIpCounts, cameraIp);
//if (ipCount <= 0)
//{
diff --git a/Cis.Core/Cache/CacheSetup.cs b/Cis.Core/Cache/CacheSetup.cs
index 3e847ed..1138f5d 100644
--- a/Cis.Core/Cache/CacheSetup.cs
+++ b/Cis.Core/Cache/CacheSetup.cs
@@ -1,4 +1,4 @@
-using StackExchange.Redis;
+using FreeRedis;
namespace Cis.Core;
@@ -10,11 +10,10 @@ public static class CacheSetup
///
public static void AddCache(this IServiceCollection services)
{
- services.AddSingleton(options =>
+ services.AddSingleton(options =>
{
var redisOptions = App.GetOptions();
- ConnectionMultiplexer multiplexer = ConnectionMultiplexer.Connect(redisOptions.ConnectionString);
- IDatabase cache = multiplexer.GetDatabase();
+ RedisClient cache = new(redisOptions.ConnectionString);
return cache;
});
}
diff --git a/Cis.Core/Cache/SqlSugarCache.cs b/Cis.Core/Cache/SqlSugarCache.cs
index 501cca6..69be39c 100644
--- a/Cis.Core/Cache/SqlSugarCache.cs
+++ b/Cis.Core/Cache/SqlSugarCache.cs
@@ -7,7 +7,7 @@ namespace Cis.Core;
///
public class SqlSugarCache : ICacheService, ISingleton
{
- private static readonly ICache _cache = NewLife.Caching.Cache.Default;
+ private static readonly ICache _cache = Cache.Default;
public void Add(string key, V value)
{
diff --git a/Cis.Core/Cis.Core.csproj b/Cis.Core/Cis.Core.csproj
index 82ea3ed..27d689b 100644
--- a/Cis.Core/Cis.Core.csproj
+++ b/Cis.Core/Cis.Core.csproj
@@ -24,16 +24,16 @@
+
-
-
+
diff --git a/Cis.Core/CoreConfig.json b/Cis.Core/CoreConfig.json
index cf8258a..da4d820 100644
--- a/Cis.Core/CoreConfig.json
+++ b/Cis.Core/CoreConfig.json
@@ -9,9 +9,9 @@
//"ConnectionString": "DataSource=./cis.db",
//"DbType": "PostgreSQL",
//"ConnectionString": "HOST=127.0.0.1;PORT=5432;USER ID=pgsql;PASSWORD=123456;DATABASE=cis;",
- "EnableInitDb": true // 启用库表初始化
+ "EnableInitDb": false // 启用库表初始化
}
- ]
+ ]
},
"Redis": {
"ConnectionString": "127.0.0.1:6379,password=123456,defaultDatabase=2"