添加redis锁定用户

DataMaintenance
zhangbin 2025-10-09 10:05:08 +08:00
parent 85c005596d
commit 332f0f7805
6 changed files with 239 additions and 8 deletions

View File

@ -54,10 +54,41 @@ namespace Infrastructure.Cache
{
return iDatabase.KeyDelete(key);
}
/// <summary>
/// HSET - 异步设置哈希表中的多个字段。
/// </summary>
/// <param name="key"></param>
/// <param name="hashFields"></param>
/// <param name="flags"></param>
public void HashSetAsync(RedisKey key, HashEntry[] hashFields, CommandFlags flags = CommandFlags.None)
{
iDatabase.HashSetAsync(key, hashFields, CommandFlags.None);
}
/// <summary>
/// HGETALL - 异步获取哈希表中的所有字段和值。
/// </summary>
/// <param name="key"></param>
/// <param name="flags"></param>
/// <returns></returns>
public Task<HashEntry[]> HashGetAllAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
{
return iDatabase.HashGetAllAsync(key, CommandFlags.None);
}
public override Task<T> Lock<T>(string id, Func<string, Task<T>> func, string key = "hc")
{
return func(id);
}
public Task<RedisValue[]> SetMembersAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
{
return iDatabase.SetMembersAsync(key, CommandFlags.None);
}
public Task<bool> SetAddAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
{
return iDatabase.SetAddAsync(key, value, CommandFlags.None);
}
public Task<bool> SetRemoveAsync(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
{
return iDatabase.SetRemoveAsync(key, value, CommandFlags.None);
}
}
}

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.DroneDockManage
{
public class AirportMaintenanceApp
{
}
}

View File

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.DroneDockManage.Response
{
public class MqttClientResp
{
/// <summary>
/// 客户端ID
/// </summary>
public string ClientId { get; set; }
/// <summary>
/// 用户id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 连接时间
/// </summary>
public DateTime ConnectTime { get; set; }
/// <summary>
/// 是否控制
/// </summary>
public bool IsLock { get; set; }
}
}

View File

@ -0,0 +1,150 @@
using Infrastructure;
using Infrastructure.Cache;
using Microsoft.AspNetCore.Mvc;
using OpenAuth.App.ServiceApp.DroneDockManage;
using OpenAuth.App.ServiceApp.DroneDockManage.Response;
using StackExchange.Redis;
namespace OpenAuth.WebApi.Controllers.ServiceControllers.DroneDockManage
{
/// <summary>
/// 机场运维
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class AirportMaintenanceController : ControllerBase
{
private readonly AirportMaintenanceApp _app;
private readonly RedisCacheContext _cache;
private readonly HttpClient _httpClient;
public AirportMaintenanceController(AirportMaintenanceApp app,
RedisCacheContext cache, HttpClient httpClient)
{
_app = app;
_cache = cache;
_httpClient = httpClient;
}
#region redis 多用户控制
/// <summary>
/// 添加修改mqtt客户端信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public async Task<Response<bool>> AddOrUpdateRedisUser(MqttClientResp info)
{
var result = new Response<bool>();
try
{
var clientKey = $"client:{info.UserId}";
string lockSetKey = "locked_users";
// 查询所有锁定用户
var existingLocked = await _cache.SetMembersAsync(lockSetKey);
// 如果有锁定用户,并且锁定的用户不是当前用户,则拒绝
if (existingLocked.Length > 0 && info.IsLock == true)
{
bool isCurrentUserLocked = existingLocked.Any(u => u == info.UserId);
if (!isCurrentUserLocked)
{
result.Code = 400;
result.Message = "已有其他用户处于锁定状态,不能添加新的锁定用户。";
result.Result = false;
return result;
}
}
// 存客户端信息
_cache.HashSetAsync(clientKey, new HashEntry[]
{
new("ClientId", info.ClientId),
new("UserId", info.UserId),
new("UserName", info.UserName),
new("ConnectTime", info.ConnectTime.ToString("O")),
new("IsLock", info.IsLock ? "true" : "false")
});
if (info.IsLock)
{
await _cache.SetAddAsync(lockSetKey, info.UserId);
}
else
{
await _cache.SetRemoveAsync(lockSetKey, info.UserId);
}
result.Result = true;
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.Message;
}
return result;
}
/// <summary>
/// 获取当前用户mqtt客户端信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public async Task<Response<MqttClientResp>> GetRedisUser(string id)
{
var result = new Response<MqttClientResp>();
try
{
result.Result = ParseClient(await _cache.HashGetAllAsync($"client:{id}"));
}
catch (Exception ex)
{
result.Code = 500;
result.Message = ex.Message;
}
return result;
}
private MqttClientResp ParseClient(HashEntry[] entries)
{
if (entries == null || entries.Length == 0)
return null;
var dict = entries.ToDictionary(e => e.Name.ToString(), e => e.Value.ToString());
return new MqttClientResp
{
ClientId = dict["ClientId"],
UserId = dict["UserId"],
UserName = dict["UserName"],
ConnectTime = DateTime.Parse(dict["ConnectTime"]),
IsLock = bool.Parse(dict["IsLock"])
};
}
/// <summary>
/// 获取所有锁定的用户客户端信息
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<List<MqttClientResp>> GetLockedClients()
{
var userIds = await _cache.SetMembersAsync("locked_users");
var result = new List<MqttClientResp>();
foreach (var userId in userIds)
{
var entries = await _cache.HashGetAllAsync($"client:{userId}");
if (entries.Length > 0)
result.Add(ParseClient(entries));
}
return result;
}
#endregion
}
}

View File

@ -18,10 +18,9 @@
},
"UploadPath": "", //
"RedisConf": {
"Conn": "175.27.168.120:6050,password=HopetryRedis1406",
//"Conn": "127.0.0.1:6379,password=123456",
"Database": 5
},
"Conn": "123.132.248.154:9253,password=HopetryRedis1406",
"Database": 1
}, //redis
"HttpHost": "http://*:10010 ", //
"SYSTEM_USERPWD": "123456"
},

View File

@ -22,15 +22,15 @@
"UploadPath": "",
//
"RedisConf": {
"Conn": "175.27.168.120:6050,password=HopetryRedis1406",
"Conn": "192.168.10.163:6379,password=123456",
//"Conn": "127.0.0.1:6379,password=123456",
"Database": 5
"Database": 7
},
//redis
"HttpHost": "http://*:10070 ",
//
"SYSTEM_USERPWD": "123456",
"ASECode": "hc",
"ASECode": "hc",
"TopAreaCode": "371300",
//
"SchemeCode": "0000001",
@ -67,6 +67,12 @@
"TiffStoreNamePrefix": "tiff_store",
"TiffDir": "E:/tiff"
},
"MQTT": {
"Server": "175.27.168.120",
"Port": 6011,
"UserName": "sdhc",
"Password": ""
},
"FlyImageDir": "e:/fly",
"WebSocket": "ws://192.168.10.106:5698/ws"
}