C# redis客户端帮助类

Posted youmingkuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# redis客户端帮助类相关的知识,希望对你有一定的参考价值。

需要在NuGet里面引用ServiceStack.Redis

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

namespace ConsoleRedisTest

    /// <summary>
    /// 需要在AppSettings裡面配置redis連接字符串節點,名稱固定為“redisHost”
    /// 例如,格式參考 value="server=192.168.31.42;port=6380;password=pisenmaster;db=9" 
    /// </summary>
    public class RedisTool : IDisposable
    

        /// <summary>
        /// redis主機ip
        /// </summary>
        private readonly static string RedisServerIP = string.Empty;// "192.168.31.42";
        /// <summary>
        /// 連接端口
        /// </summary>
        private readonly static int RedisPort = 0;// 6380;
        /// <summary>
        /// 連接密碼
        /// </summary>
        private readonly static string RedisConnectPassword = string.Empty;// "pisenmaster";
        /// <summary>
        /// 缓冲池 實例db
        /// </summary>
        private readonly static string PooledRedisDB1 = string.Empty;// "pisenmaster@192.168.31.42:6380";

        //默认缓存过期时间单位秒
        public const int secondsTimeOut = 60 * 60;

        /// <summary>
        ///  //加載配置文件
        /// </summary>
        static RedisTool()
        
            string conStr = System.Configuration.ConfigurationManager.AppSettings["redisHost"];
            try
            
                if (string.IsNullOrWhiteSpace(conStr))
                
                    throw new Exception("讀取配置文件出錯,AppSettings節沒有配置名為redisHost的redis連接字符串");
                
                string[] arr = conStr.Split(;);
                RedisServerIP = arr.First(w => w.ToLower().Contains("server="))?.Split(=)[1];
                RedisPort = Convert.ToInt32(arr.First(w => w.ToLower().Contains("port="))?.Split(=)[1]);
                RedisConnectPassword = arr.First(w => w.ToLower().Contains("password="))?.Split(=)[1];
                PooledRedisDB1 = $"RedisConnectPassword@RedisServerIP:RedisPort";
            
            catch (Exception ex)
            
                throw new Exception("讀取配置文件出錯,AppSettings節裡面沒有配置redis連接字符串名為redisHost的節");
            
        

        /// <summary>
        /// redis客戶端
        /// </summary>
        public RedisClient Redis = new RedisClient(RedisServerIP, RedisPort, RedisConnectPassword, 9);
        //public RedisClient Redis = new RedisClient("192.168.31.42", 6380, "pisenmaster", 9);

        //缓存池
        private PooledRedisClientManager prcm = new PooledRedisClientManager();

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="OpenPooledRedis">是否开启缓冲池</param>
        public RedisTool(bool OpenPooledRedis = false)
        
            if (OpenPooledRedis)
            
                //prcm = CreateManager(new[]  "pisenmaster@192.168.31.42:6380" , new[]  "pisenmaster@192.168.31.42:6380" );
                prcm = CreateManager(new[]  PooledRedisDB1 , new[]  PooledRedisDB1 );
                Redis = prcm.GetClient() as RedisClient;
            
        

        #region Key/Value存储

        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">缓存建</param>
        /// <param name="t">缓存值</param>
        /// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>
        /// <returns></returns>
        public bool Set<T>(string key, T t, int timeout = 0)
        
            if (timeout < 0)
            
                //永不過期
                return Redis.Set(key, t);
            
            if (timeout == 0)
            
                //默認時長
                timeout = secondsTimeOut;
            
            return Redis.Set(key, t, TimeSpan.FromSeconds(timeout));
        

        /// <summary>
        /// 获取
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T Get<T>(string key)
        
            return Redis.Get<T>(key);
        

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Remove(string key)
        
            return Redis.Remove(key);
        

        public bool Add<T>(string key, T t, int timeout)
        
            if (timeout < 0)
            
                //永不過期
                return Redis.Set(key, t);
            
            if (timeout == 0)
            
                //默認時長
                timeout = secondsTimeOut;
            
            return Redis.Add(key, t, TimeSpan.FromSeconds(timeout));
        

        #endregion

        #region 链表操作

        /// <summary>
        /// 根据IEnumerable数据添加链表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="values"></param>
        /// <param name="timeout"></param>
        public void AddList<T>(string listId, IEnumerable<T> values, int timeout = 0)
        
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            IRedisList<T> redisList = iredisClient.Lists[listId];
            redisList.AddRange(values);
            if (timeout >= 0)
            
                if (timeout == 0)
                
                    timeout = secondsTimeOut;
                
                Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
            
            iredisClient.Save();
        

        /// <summary>
        /// 添加单个实体到链表中
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="Item"></param>
        /// <param name="timeout">過期時間會覆蓋列表之前的過期時間,為-1時保持先前的過期設置</param>
        public void AddEntityToList<T>(string listId, T Item, int timeout = 0)
        
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            IRedisList<T> redisList = iredisClient.Lists[listId];
            redisList.Add(Item);
            if (timeout >= 0)
            
                if (timeout == 0)
                
                    timeout = secondsTimeOut;
                
                Redis.ExpireEntryIn(listId, TimeSpan.FromSeconds(timeout));
            
            iredisClient.Save();
        

        /// <summary>
        /// 获取链表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <returns></returns>
        public IEnumerable<T> GetList<T>(string listId)
        
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            return iredisClient.Lists[listId];
        

        /// <summary>
        /// 在链表中删除单个实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="t"></param>
        public void RemoveEntityFromList<T>(string listId, T t)
        
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            IRedisList<T> redisList = iredisClient.Lists[listId];
            redisList.RemoveValue(t);
            iredisClient.Save();
        

        /// <summary>
        /// 根据lambada表达式删除符合条件的实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listId"></param>
        /// <param name="func"></param>
        public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
        
            IRedisTypedClient<T> iredisClient = Redis.As<T>();
            IRedisList<T> redisList = iredisClient.Lists[listId];
            T value = redisList.Where(func).FirstOrDefault();
            redisList.RemoveValue(value);
            iredisClient.Save();
        

        #endregion

        #region 清空Redis所有数据库中的所有key
        public void Flushall()
        
            Redis.FlushAll();
        
        #endregion

        //释放资源
        public void Dispose()
        
            if (Redis != null)
            
                Redis.Dispose();
                Redis = null;
            
            GC.Collect();
        

        /// <summary>
        /// 缓冲池
        /// </summary>
        /// <param name="readWriteHosts"></param>
        /// <param name="readOnlyHosts"></param>
        /// <returns></returns>
        public static PooledRedisClientManager CreateManager(
        string[] readWriteHosts, string[] readOnlyHosts)
        
            return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
            new RedisClientManagerConfig
            
                MaxWritePoolSize = readWriteHosts.Length * 5,
                MaxReadPoolSize = readOnlyHosts.Length * 5,
                AutoStart = true,
            );
            //  RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) ; 
        
    

 

以上是关于C# redis客户端帮助类的主要内容,如果未能解决你的问题,请参考以下文章

Redis Docker - 无法从 C# 客户端连接

C#实现的Redis缓存公共类库项目

Redis客户端实现基本数据的操作及使用SpringBoot实现Redis的工具类

Redis服务端和客户端的命令

Redis java客户端工具类

使用java客户端调用redis