redis帮助类

话不多说,上代码

第一种:多线程安全,线程不是每次都加锁,按需加载(懒汉模式) 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Net.Http;
using static ConsoleApp1.Program;
using ServiceStack.Redis;
using System.Configuration;
using log4net;

namespace ConsoleApp1
{ 
    public class RedisLearn
    {
        protected static PooledRedisClientManager pooled;
        protected static RedisClient redisClientRead;
        protected static RedisClient redisClientWrite;

        /// <summary>
        /// 程序运行时,创建一个静态只读的进程辅助对象
        /// </summary>
        private static readonly object obj = new object();

        private RedisLearn()
        {

        }

        /// <summary>
        /// 获取Redis写节点
        /// </summary>
        /// <returns></returns>
        internal static RedisClient GetInstance()
        {
            if (pooled == null)//在同一时刻加了锁的那部分程序只有一个线程可以进入,实现线程安全

                lock (obj)
                {
                    //如实例不存在,则New一个新实例,否则返回已有实例
                    if (pooled == null)
                    {
                        CreatePoolManager();
                    }
                }
            if (redisClientWrite == null)
            {
                redisClientWrite = pooled.GetClient() as RedisClient;
            }
            return redisClientWrite;

        }


        /// <summary>
        /// 获取Redis读节点
        /// </summary>
        /// <returns></returns>
        internal static RedisClient GetReadOnlyInstance()
        {
            if (pooled == null)
            {
                lock (obj)
                {
                    if (pooled == null)
                    {
                        CreatePoolManager();
                    }
                }
            }
            if (redisClientRead == null)
            {
                redisClientRead = pooled.GetReadOnlyClient() as RedisClient;
            }

            return redisClientRead;
        }

        /// <summary>
        /// 创建连接
        /// </summary>
        private static void CreatePoolManager()
        {
            string redisWrite = ConfigurationManager.AppSettings["RedisWrite"].ToString(); //写节点(主节点)
            List<string> writes = new List<string>();
            writes.Add(redisWrite);

            string redisRead = ConfigurationManager.AppSettings["RedisRead"].ToString();  //读节点
            List<string> reads = new List<string>();
            reads.Add(redisRead);

            //配置连接池和读写分类
            pooled = new PooledRedisClientManager(writes, reads, new RedisClientManagerConfig()
            {
                MaxReadPoolSize = 50, //读节点个数
                MaxWritePoolSize = 50,//写节点个数

            });
        }
    }
}

  第二种:静态初始化,减少开销

using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
   public class RedisLearnHelp
    {
        private static readonly RedisLearnHelp redisLearnHelp = null;
        public static PooledRedisClientManager pooled;

        public static RedisClient redisClientRead;
        public static RedisClient redisClientWrite;

        static RedisLearnHelp()
        {
            redisLearnHelp = new RedisLearnHelp();
        }

        private RedisLearnHelp()
        {

        }

        /// <summary>
        /// 获取Redis写节点
        /// </summary>
        /// <returns></returns>
        public static RedisClient GetInstance
        {
            get
            {
                if (pooled == null)
                {
                    CreatePoolManager();
                }
                if (redisClientWrite==null)
                {
                    redisClientWrite = pooled.GetClient() as RedisClient;
                }

                return redisClientWrite;
            }
        }


        /// <summary>
        /// 获取Redis读节点
        /// </summary>
        /// <returns></returns>
        public static RedisClient GetReadOnlyInstance
        {
            get
            {
                if (pooled == null)
                {
                    CreatePoolManager();
                }
                if (redisClientRead == null)
                {
                    redisClientRead = pooled.GetReadOnlyClient() as RedisClient;
                }

                return redisClientRead;

            }
        }

        /// <summary>
        /// 创建连接
        /// </summary>
        private static void CreatePoolManager()
        {
            string redisWrite = ConfigurationManager.AppSettings["RedisWrite"].ToString();
            string redisRead = ConfigurationManager.AppSettings["RedisRead"].ToString();
            //写节点(主节点)
            List<string> writes = new List<string>();
            writes.Add(redisWrite);
            //读节点
            List<string> reads = new List<string>();
            reads.Add(redisRead);

            //配置连接池和读写分类
            pooled = new PooledRedisClientManager(writes, reads, new RedisClientManagerConfig()
            {
                MaxReadPoolSize = 50, //读节点个数
                MaxWritePoolSize = 50,//写节点个数

            });
        }
    }
}

 调用方法封装

using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using log4net;

namespace ConsoleApp1
{
    public class RedisHelp
    {

        public static readonly log4net.ILog log = LogManager.GetLogger("log4netlogger");

        #region set

        /// <summary>
        /// 保存单个值
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expire">过期时间(分钟)</param>
        /// <param name="connectionMode">数据来源</param>
        public void SetValue(string key, string value, int expire = 30, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);
            redisClient.SetValue(key, value, ConvertTimeSpan(expire));
        }

        /// <summary>
        /// 获取单个值
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="connectionMode"></param>
        /// <returns>值</returns>
        public string GetValue(string key, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);
            return redisClient.GetValue(key);
        }

        /// <summary>
        /// 保存对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="obj">值</param> 
        /// <param name="expire">过期时间</param>
        /// <param name="connectionMode">数据来源</param>
        /// <returns></returns>
        public bool Set(string key, object obj, int expire = 30, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);
            return redisClient.Set(key, obj, ConvertTimeSpan(expire));
        }

        /// <summary>
        /// 根据键获取对象
        /// </summary>
        /// <typeparam name="T">对象类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public T Get<T>(string key, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);
            return redisClient.Get<T>(key);
        }
        #endregion

        #region Hash

        /// <summary>
        /// 存储数据到hash
        /// </summary>
        /// <param name="hashId"></param>
        /// <param name="key">键</param>
        /// <param name="obj">值</param>
        /// <param name="expire">过期时间</param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public bool SetHash(string hashId, string key, object obj, int expire = 30, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);

            var value = JsonHelper.JsonSerialize(obj);

            redisClient.ExpireEntryIn(key, ConvertTimeSpan(expire));

            return redisClient.SetEntryInHash(hashId, key, value);
        }

        /// <summary>
        /// 从Hash表获取数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public T GetHash<T>(string hashId, string key, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);

            return JsonHelper.JsonDeserialize<T>(redisClient.GetValueFromHash(hashId, key));
        }

        /// <summary>
        /// 存储多个数据到hash
        /// </summary>
        /// <param name="hashId"></param>
        /// <param name="obj"></param>
        /// <param name="connectionMode"></param>
        public void SetHash(string hashId, List<KeyValuePair<string, string>> obj, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);

            redisClient.SetRangeInHash(hashId, obj);
        }

        /// <summary>
        /// 获取整个Hash的数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId"></param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public List<T> GetAllHash<T>(string hashId, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);

            var value = new List<T>();

            var list = redisClient.GetHashValues(hashId);
            if (list != null && list.Count > 0)
            {
                foreach (var item in list)
                {
                    value.Add(JsonHelper.JsonDeserialize<T>(item));
                }
            }

            return value;
        }


        /// <summary>
        /// 移除hash中的某值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public bool RemoveHash<T>(string hashId, string key, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);

            return redisClient.RemoveEntryFromHash(hashId, key);
        }

        #endregion

        /// <summary>
        /// 根据键移除  /移除整个hash
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        public bool Remove(string key, EConnectionMode connectionMode = EConnectionMode.Read)
        {
            RedisClient redisClient = GetClient(connectionMode);
            return redisClient.Remove(key);
        }

        #region 公共帮助类

        /// <summary>                                                                                                                                                                                                                               
        /// 转换时间为timespan格式
        /// </summary>
        /// <param name="expire">间隔时间(分钟)</param>
        /// <returns></returns>
        private TimeSpan ConvertTimeSpan(int expire)
        {
            return TimeSpan.FromMinutes(expire);
        }

        /// <summary>
        /// 获取RedisClient
        /// </summary>
        /// <param name="connectionMode"></param>
        /// <returns></returns>
        private RedisClient GetClient(EConnectionMode connectionMode)
        {
            return connectionMode == EConnectionMode.Write ? RedisLearn.GetInstance() : RedisLearn.GetReadOnlyInstance();

        }

        //private static RedisClient GetClient(EConnectionMode connectionMode)
        //{
        //    return connectionMode == EConnectionMode.Write ? RedisLearnHelp.GetInstance : RedisLearnHelp.GetReadOnlyInstance;
        //}

        #endregion
    }
    public enum EConnectionMode
    {
        Read = 1,
        Write = 2
    }

    public class JsonHelper
    {
        /// <summary>
        /// 将对象转换为json串
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string JsonSerialize(object obj)
        {
            return JsonConvert.SerializeObject(obj);
        }

        /// <summary>
        /// 将json串转换为对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="json"></param>
        /// <returns></returns>
        public static T JsonDeserialize<T>(string json)
        {
            if (string.IsNullOrEmpty(json))
                return System.Activator.CreateInstance<T>();

            return JsonConvert.DeserializeObject<T>(json);
        }
    }

}

 

在C#中操作Redis,通常会使用像`StackExchange.Redis`这样的高性能客户端库,或者使用`CSRedisCore`这样的封装库来简化开发流程。以下是一个基于`CSRedisCore`的Redis工具封装示例,涵盖了基本的Redis操作,包括字符串、对象、哈希、列表等操作,并支持泛型序列化与反序列化。 ### Redis工具接口定义 首先定义一个通用的Redis操作接口,方便后期进行依赖注入或替换实现: ```csharp using System; using System.Collections.Generic; namespace Tools.Redis { public interface IRedisTool { bool SetString(string key, string value, TimeSpan? expiry = null); string GetString(string key); bool SetObject<T>(string key, T value, TimeSpan? expiry = null); T GetObject<T>(string key); bool SetHash(string key, string field, string value, TimeSpan? expiry = null); string GetHash(string key, string field); Dictionary<string, string> GetAllHash(string key); bool SetList(string key, List<string> values, TimeSpan? expiry = null); List<string> GetList(string key); bool KeyExists(string key); bool DeleteKey(string key); long Publish(string channel, string message); void Subscribe(string channel, Action<string, string> handler); } } ``` ### Redis工具实现 接下来是基于`CSRedisCore`的具体实现: ```csharp using CSRedis; using System; using System.Collections.Generic; using System.Text.Json; namespace Tools.Redis { public class RedisTool : IRedisTool { private readonly CSRedisClient _redisClient; public RedisTool(string connectionString) { _redisClient = new CSRedisClient(connectionString); } public bool SetString(string key, string value, TimeSpan? expiry = null) { return _redisClient.Set(key, value, expiry); } public string GetString(string key) { return _redisClient.Get(key); } public bool SetObject<T>(string key, T value, TimeSpan? expiry = null) { string serializedValue = JsonSerializer.Serialize(value); return _redisClient.Set(key, serializedValue, expiry); } public T GetObject<T>(string key) { string value = _redisClient.Get(key); return value == null ? default : JsonSerializer.Deserialize<T>(value); } public bool SetHash(string key, string field, string value, TimeSpan? expiry = null) { bool result = _redisClient.HSet(key, field, value); if (expiry.HasValue) _redisClient.Expire(key, expiry.Value.TotalSeconds); return result; } public string GetHash(string key, string field) { return _redisClient.HGet(key, field); } public Dictionary<string, string> GetAllHash(string key) { return _redisClient.HGetAll(key); } public bool SetList(string key, List<string> values, TimeSpan? expiry = null) { return _redisClient.RPush(key, values.ToArray()) > 0 && (expiry.HasValue ? _redisClient.Expire(key, expiry.Value.TotalSeconds) : true); } public List<string> GetList(string key) { return _redisClient.LRange<string>(key, 0, -1); } public bool KeyExists(string key) { return _redisClient.Exists(key) == 1; } public bool DeleteKey(string key) { return _redisClient.Del(key) == 1; } public long Publish(string channel, string message) { return _redisClient.Publish(channel, message); } public void Subscribe(string channel, Action<string, string> handler) { _redisClient.Subscribe(new string[] { channel }, (msg) => handler(msg.Channel, msg.Body)); } } } ``` ### 使用示例 在实际项目中可以通过依赖注入方式注册该服务: ```csharp services.AddSingleton<IRedisTool>(new RedisTool("127.0.0.1:6379")); ``` 然后在控制器或服务中注入并使用: ```csharp private readonly IRedisTool _redis; public RedisController(IRedisTool redis) { _redis = redis; } public IActionResult SetValue() { _redis.SetString("username", "john_doe", TimeSpan.FromMinutes(10)); return Ok(); } public IActionResult GetValue() { string username = _redis.GetString("username"); return Ok(username); } ``` 该工具支持多种数据结构操作,并且通过泛型方法实现了对象的自动序列化与反序列化,适用于大多数常见的Redis使用场景[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值