首页 > 数据库 >C# StackExchange.Redis RedisHelper 工具类

C# StackExchange.Redis RedisHelper 工具类

时间:2024-10-11 16:59:26浏览次数:1  
标签:return string C# db Redis redisKey hashKey StackExchange public

StackExchange.Redis RedisHelper 工具类

Install-Package StackExchange.Redis

using Microsoft.Extensions.Configuration;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using NLog;

namespace VipSoft.DevOps
{
    public class RedisHelper
    {
        private readonly Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类 
        private static readonly object Locker = new object();
        private static IConnectionMultiplexer _connection;
        private IDatabase _db;
        public string ConnectionString { get; set; }

        public static IConfigurationRoot Configuration
        {
            get
            {
                if (File.Exists(AppContext.BaseDirectory + "appsettings.json"))
                {
                    return new ConfigurationBuilder()
                        .SetBasePath(AppContext.BaseDirectory)
                        .AddJsonFile("appsettings.json")
                        .Build();
                }
                throw new Exception("appsettings.json 文件不存在");
            }
        }

        private RedisHelper(int dbindex)
        {
            if (_connection == null)
            {
                lock (Locker)
                {
                    if (_connection == null || !_connection.IsConnected)
                    {
                        if (_connection != null)
                        {
                            //如果 redis !=null 且没有连接,先释放
                            _connection.Dispose();
                        }
                        var _host = Configuration.GetValue<string>($"Cluster:Redis:host");
                        var _port = Configuration.GetValue<string>($"Cluster:Redis:port");
                        var _pwd = Configuration.GetValue<string>($"Cluster:Redis:password");
                        // Redis 连接配置  
                        ConnectionString = $"{_host}:{_port}"; // 修改为你的 Redis 服务器地址和端口         
                        var options = ConfigurationOptions.Parse(ConnectionString);
                        options.Password = _pwd;
                        options.AbortOnConnectFail = false;
                        options.AllowAdmin = false;
                        options.KeepAlive = 30;
                        options.SyncTimeout = 10 * 1000;
                        _connection = ConnectionMultiplexer.Connect(options);
                        logger.Debug($"连接Redis:{ConnectionString} Password:{_pwd}");
                        //注册如下事件
                        _connection.ConnectionFailed += MuxerConnectionFailed;
                        _connection.ConnectionRestored += MuxerConnectionRestored;
                        _connection.ErrorMessage += MuxerErrorMessage;
                        _connection.ConfigurationChanged += MuxerConfigurationChanged;
                        _connection.HashSlotMoved += MuxerHashSlotMoved;
                        _connection.InternalError += MuxerInternalError;
                    }
                }
            }
            _db = _connection.GetDatabase(dbindex);
        }

        public static Func<int, RedisHelper> GetInstance = (int dbindex) => { return new RedisHelper(dbindex); };

        // 判断键是否存在(同步方法)  
        public bool KeyExists(string redisKey)
        {
            return _db.KeyExists(redisKey);
        } 
        // 判断键是否存在(异步方法)  
        public async Task<bool> KeyExistsAsync(string redisKey)
        {
            return await _db.KeyExistsAsync(redisKey);
        }

        public bool DeleteKey(string redisKey)
        {
            return _db.KeyDelete(redisKey);
        }

        /// <summary>
        /// Delete the value for string key 
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public async Task<bool> DeleteKeyAsync(string redisKey)
        {
            return await _db.KeyDeleteAsync(redisKey);
        }


        public bool KeyExpire(string redisKey, TimeSpan expiry)
        {
            return _db.KeyExpire(redisKey,expiry);
        }

        public async Task<bool> KeyExpireAsync(string redisKey, TimeSpan expiry)
        {
            return await _db.KeyExpireAsync(redisKey, expiry);
        }
        


        #region Event


        /// <summary>
        /// 配置更改时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
        {
            Console.WriteLine("Configuration changed: " + e.EndPoint);
        }

        /// <summary>
        /// 发生错误时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
        {
            logger.Error("ErrorMessage: " + e.Message);
        }

        /// <summary>
        /// 重新建立连接之前的错误
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
        {
            logger.Error("ConnectionRestored: " + e.EndPoint);
        }

        /// <summary>
        /// 连接失败 , 如果重新连接成功你将不会收到这个通知
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
        {
            logger.Error("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));
        }

        /// <summary>
        /// 更改集群
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
        {
            logger.Error("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
        }

        /// <summary>
        /// redis类库错误
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MuxerInternalError(object sender, InternalErrorEventArgs e)
        {
            logger.Error("InternalError:Message" + e.Exception.Message);
        }


        #endregion
         
        #region String

        #region Sync
        public string GetString(string redisKey)
        {
            return _db.StringGet(redisKey);
        }

        /// <summary>
        /// 获取一个key的对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="redisKey"></param>
        /// <returns></returns>
        public T GetString<T>(string redisKey) where T : class
        {
            var result = _db.StringGet(redisKey);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            return JsonConvert.DeserializeObject<T>(result);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="redisKey">Redis Key</param>
        /// <param name="value">保存的值</param>
        /// <param name="expiry">过期时间</param>
        /// <returns></returns>
        public bool SetString(string redisKey, string value, TimeSpan? expiry = null)
        {
            return _db.StringSet(redisKey, value, expiry);
        }

        /// <summary>
        /// 保存一个对象
        /// </summary>
        public bool SetString<T>(string redisKey, T obj, TimeSpan? expiry = null)
        {
            string json = JsonConvert.SerializeObject(obj);
            return _db.StringSet(redisKey, json, expiry);
        }




        #endregion

        #region Async

        public async Task<string> GetStringAsync(string redisKey)
        {
            return await _db.StringGetAsync(redisKey);
        }

        /// <summary>
        /// 获取一个key的对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="redisKey"></param>
        /// <returns></returns>
        public async Task<T> GetStringAsync<T>(string redisKey) where T : class
        {
            var result = await _db.StringGetAsync(redisKey);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            return JsonConvert.DeserializeObject<T>(result);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="redisKey">Redis Key</param>
        /// <param name="value">保存的值</param>
        /// <param name="expiry">过期时间</param>
        /// <returns></returns>
        public async Task<bool> SetStringAsync(string redisKey, string value, TimeSpan? expiry = null)
        {
            return await _db.StringSetAsync(redisKey, value, expiry);
        }

        /// <summary>
        /// 保存一个对象
        /// </summary>
        public async Task<bool> SetStringAsync<T>(string redisKey, T obj, TimeSpan? expiry = null)
        {
            string json = JsonConvert.SerializeObject(obj);
            return await _db.StringSetAsync(redisKey, json, expiry);
        }




        #endregion

        #endregion


        #region Hash

        #region Sync

        public bool DeleteHash(string redisKey, string hashKey)
        {
            return _db.HashDelete(redisKey, hashKey);
        }

        // 获取哈希表的值(同步方法)  
        public HashEntry[] GetHash(string redisKey)
        {
            return _db.HashGetAll(redisKey);
        }

        /// <summary>
        /// 获取所有的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="redisKey"></param>
        /// <returns></returns>
        public List<T> GetHash<T>(string redisKey) where T : class
        {
            List<T> result = new List<T>();
            HashEntry[] arr = _db.HashGetAll(redisKey);
            foreach (var item in arr)
            {
                if (!item.Value.IsNullOrEmpty)
                {
                    result.Add(JsonConvert.DeserializeObject<T>(item.Value));
                }
            }
            return result;
        }

        public T GetHash<T>(string redisKey, string hashKey) where T : class
        {
            RedisValue result = _db.HashGet(redisKey, hashKey);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            return JsonConvert.DeserializeObject<T>(result);
        }


        // 获取哈希表的字段值(同步方法)  
        public string GetHashField(string redisKey, string hashKey)
        {
            return (string)_db.HashGet(redisKey, hashKey);
        }


        // 设置哈希表的字段值(同步方法)  
        public bool SetHash(string redisKey, string hashKey, string value)
        {
            return _db.HashSet(redisKey, hashKey, value);
        }


        // 设置哈希表的值(同步方法)  
        public void SetHash(string redisKey, HashEntry[] hashEntries)
        {
            _db.HashSet(redisKey, hashEntries);
        }

        public bool SetHash<T>(string redisKey, string hashKey, T t) where T : class
        {
            var json = JsonConvert.SerializeObject(t);
            return _db.HashSet(redisKey, hashKey, json);
        }


        #endregion

        #region Async

        public async Task<bool> DeleteHashAsync(string redisKey, string hashKey)
        {
            return await _db.HashDeleteAsync(redisKey, hashKey);
        }

        // 获取哈希表的值(同步方法)  
        public async Task<HashEntry[]> GetHashAsync(string redisKey)
        {
            return await _db.HashGetAllAsync(redisKey);
        }

        /// <summary>
        /// 获取所有的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="redisKey"></param>
        /// <returns></returns>
        public async Task<List<T>> GetHashAsync<T>(string redisKey) where T : class
        {
            List<T> result = new List<T>();
            HashEntry[] arr = await _db.HashGetAllAsync(redisKey);
            foreach (var item in arr)
            {
                if (!item.Value.IsNullOrEmpty)
                {
                    result.Add(JsonConvert.DeserializeObject<T>(item.Value));
                }
            }
            return result;
        }

        public async Task<T> GetHashAsync<T>(string redisKey, string hashKey) where T : class
        {
            RedisValue result = await _db.HashGetAsync(redisKey, hashKey);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            return JsonConvert.DeserializeObject<T>(result);
        }


        // 获取哈希表的字段值(同步方法)  
        public async Task<string> GetHashAsync(string redisKey, string hashKey)
        {
            return await _db.HashGetAsync(redisKey, hashKey);
        }
         
        // 设置哈希表的字段值(同步方法)  
        public async Task<bool> SetHashAsync(string redisKey, string hashKey, string value)
        {
            return await _db.HashSetAsync(redisKey, hashKey, value);
        }


        // 设置哈希表的值(同步方法)  
        public async void SetHashAsync(string redisKey, HashEntry[] hashEntries)
        {
            await _db.HashSetAsync(redisKey, hashEntries);
        }

        public async Task<bool> SetHashAsync<T>(string redisKey, string hashKey, T t) where T : class
        {
            var json = JsonConvert.SerializeObject(t);
            return await _db.HashSetAsync(redisKey, hashKey, json);
        }


        #endregion

        #endregion
    }

}

标签:return,string,C#,db,Redis,redisKey,hashKey,StackExchange,public
From: https://www.cnblogs.com/vipsoft/p/18458886

相关文章

  • 第1讲:C语言常见概念(一)
    目录1.C语言是什么?2.C语言的历史和辉煌3.编译器的选择VS2022 正文开始1.C语言是什么? 人和人交流使用的是自然语言,如:汉语、英语、日语...那人和计算机是怎么交流的呢?使用计算机语言。目前已知已经有上千种......
  • 考完PMP证书,还有必要考ACP敏捷吗?
    考完PMP®的小伙伴,我看到很多人都对ACP®很感兴趣最近几年,ACP®和PMP®都是比较热门的认证,它们师承一脉,可以说是相辅相成的关系,所以为了更高的职业追求,现在大家一般都会一起拿下这两本证书。一、PMI-ACP®是什么?PMI-ACP®考试是由美国项目管理协会(PMI)于2011年推出一门......
  • 如何让你的Mac右键菜单栏更加的丰富多样
    Mac电脑的右键菜单栏不如Windows的丰富,虽然可以在系统设置一些常用功能,但是种类不够丰富,这对于一些用惯了Windows的人来说可以说是非常的不习惯,不管是工作使用还是日常使用来说都有一些影响,如何才能让Mac的右键菜单栏像Windows一样的丰富方便呢,超级右键替你解决这个问题可......
  • C++ 读写锁 shared_mutex
    C++17新增了std::shared_mutex,通过shared_mutex可以实现读写锁的功能, 参考网址:https://zh.cppreference.com/w/cpp/thread/shared_mutexshared_mutex可以同时支持多个线程对共享资源同时读,但是只支持一个线程对同一共享资源进行写操作。shared_mutex支持共享锁和独......
  • NetCore 阿里云表格存储插入数据实例
    十年河东,十年河西,莫欺少年穷学无止境,精益求精帮助类:publicclassOtsHelper{publicstaticstringEndpoint="https://xxx.cn-shanghai.ots.aliyuncs.com";publicstaticstringInstanceName="xxx";///<summary>//......
  • ModelMapper的常见用法 ,号称是beanUtils.copyProp....的升级版??,代码复制粘贴即可复现效
    官网案例以下将官网案例做一个解释1)快速入门递归遍历源对象的属性拷贝给目标对象拷贝对象下对象的属性值@DataclassOrder{privateCustomercustomer;privateAddressbillingAddress;}@DataclassCustomer{privateNamename;}@Dataclass......
  • Scikit-Learn验证曲线
    多项式特征管道命令fromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegressionfromsklearn.pipelineimportmake_pipelinedefPolynomialRegression(degree=2,**kwargs):returnmake_pipeline(PolynomialFeatures(degree)......
  • The Bitter Lesson from Rich Sutton
    originThebiggestlessonthatcanbereadfrom70yearsofAIresearchisthatgeneralmethodsthatleveragecomputationareultimatelythemosteffective,andbyalargemargin.TheultimatereasonforthisisMoore'slaw,orratheritsgeneralizat......
  • EI稳定检索|7天录用|第四届智能电力与系统国际学术会议(ICIPS 2024)
    电力学科品牌IEEE会议,往届均已EI检索!“推动新质生产力加快发展,培育新能源新兴产业,实现电力行业新跨越”高端主题研讨会暨第四届智能电力与系统国际学术会议(ICIPS2024)【往届见刊后1个月完成EI检索】*澳大利亚会场(11月1-3日)地点:珀斯|澳大利亚|MurdochUniversity  ......
  • 使用StyleGAN3合成自定义数据(pytorch代码)
    使用StyleGAN3合成自定义数据在现代计算机视觉和机器学习领域,生成对抗网络(GAN)已成为生成高质量图像的重要工具。其中,StyleGAN3是NVIDIA团队推出的第三代生成对抗网络,其显著改进了图像生成的质量和稳定性。本文旨在介绍如何在训练数据较少的情况下,使用StyleGAN3来合成......