Redis集群帮助类(数据读取)

using StackExchange.Redis;
using System.Collections.Concurrent;
using System.Configuration;

namespace Client.Utils
{
    /// <summary>
    /// 对于Redis集群,由于节点分布在不同的服务器上,查询数据需要遍历所有主节点。
    /// </summary>
    internal class RedisHelper : IDisposable
    {
        private readonly ConnectionMultiplexer _redis;
        private readonly IDatabase _db;
        private readonly IServer _server;
        private bool _disposed = false;
        private static readonly string connectionString = ConfigurationManager.AppSettings["RedisConnect"] ?? throw new InvalidOperationException("RedisConnect is not configured.");

        public RedisHelper()
        {
            try
            {
                _redis = ConnectionMultiplexer.Connect(connectionString);
                _db = _redis.GetDatabase();
                _server = _redis.GetServer(_redis.GetEndPoints()[0]);

            }
            catch (Exception ex)
            {
                Logger.Error($"Redis连接异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 集群读取所有节点key:使用 SCAN 命令安全地获取所有键
        /// </summary>
        public List<string> GetAllKeys(string zones, int pageSize = 500)
        {
            var allKeys = new HashSet<string>();
            var endpoints = _redis.GetEndPoints();

            foreach (var endpoint in endpoints)
            {
                var server = _redis.GetServer(endpoint);
                if (server.IsConnected)
                {
                    // 只处理主节点
                    if (server.ServerType == ServerType.Cluster)
                    {
                        foreach (var item in zones.Split(","))
                        {
                            foreach (var key in server.Keys(pattern: $"{item}*:AlarmData", pageSize: pageSize))
                            {
                                //去重
                                allKeys.Add(key);
                            }
                        }
                    }
                }
            }

            return allKeys.ToList();
        }

        /// <summary>
        /// 批量获取 Hash 数据(性能优化)
        /// </summary>
        public async Task<ConcurrentDictionary<string, HashData>> GetHashesBatchAsync(IEnumerable<string> keys)
        {
            var result = new ConcurrentDictionary<string, HashData>();
            try
            {
                var tasks = new List<Task>();

                foreach (var key in keys)
                {
                    tasks.Add(Task.Run(async () =>
                    {
                        var hashEntries = await _db.HashGetAllAsync(key);
                        var hashDict = new ConcurrentDictionary<string, string>();

                        foreach (var entry in hashEntries)
                        {
                            hashDict[entry.Name] = entry.Value;
                        }

                        result[key] = new HashData
                        {
                            Key = key,
                            Fields = hashDict,
                            FieldCount = hashDict.Count
                        };
                    }));
                }

                await Task.WhenAll(tasks);
                return result;

            }
            catch (Exception ex)
            {
                Logger.Error($"Redis报警数据读取异常:{ex.Message}");
                return result;
            }
        }

        public void Dispose()
        {
            if (!_disposed)
            {
                _redis?.Close();
                _redis?.Dispose();
                _disposed = true;
            }
        }
    }

    public class HashData
    {
        public RedisKey Key { get; set; }
        public ConcurrentDictionary<string, string> Fields { get; set; }
        public int FieldCount { get; set; }
        public TimeSpan? TTL { get; set; }
    }
}

注意对于集群Redis,数据分布在不同的主节点下,因此单一读取某个节点会导致数据读取不全的情况;
 

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值