C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#封装常用Redis

C#实现封装常用Redis工具类的示例代码

作者:搬砖的诗人Z

这篇文章主要为大家详细介绍了C#实现封装常用Redis工具类的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1.请先安装CSRedisCore

接口:

namespace Tools.Redis
{
    public interface IRedisTool
    {
        bool SetLongValue(string key, string value);
        bool SetValue(string key, string value, int outSecond);
        bool SetValue(string key, string value);
        bool Exists(string key);
        bool UpdateValue(string key, string value);
        string? GetValue(string key);
        T? GetValue<T>(string key);
        T? GetEntity<T>(string key);
        List<T>? GetLike<T>(string key);
        void DeleteKey(string key);
        void DeleteLike(string key);

    }
}

实现接口方法

using CSRedis;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tools.Redis
{
    public class RedisTool : IRedisTool
    {
        CSRedisClient csRedis;

        public RedisTool(string redisConfig)
        {
            csRedis = new CSRedisClient(redisConfig);
            RedisHelper.Initialization(csRedis);
        }

        /// <summary>
        /// 设置长时间存在的值
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetLongValue(string key, string value)
        {
            try
            {
                csRedis.Set(key, value);
                return true;
            }
            catch (Exception ex)
            {
                NLogHelper.Error("RedisDataHelper-SetValue" + ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 设置值,并设置清除时间
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="outSecond"></param>
        /// <returns></returns>
        public bool SetValue(string key, string value, int outSecond)
        {
            try
            {
                csRedis.Set(key, value, outSecond);
                return true;
            }
            catch (Exception ex)
            {
                NLogHelper.Error("RedisDataHelper-SetValue" + ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 设置值,存在则覆盖,并沿用之前的清除时间
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetValue(string key, string value)
        {
            try
            {
                if (csRedis.Exists(key))
                {
                    long time = csRedis.Ttl(key);
                    csRedis.Set(key, value, Convert.ToInt32(time));
                }
                else
                    csRedis.Set(key, value);

                return true;
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-SetValue[{key}-{value}]" + ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 是否存在key
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Exists(string key)
        {
            try
            {
                return csRedis.Exists(key);
            }
            catch (Exception ex)
            {
                NLogHelper.Error("RedisDataHelper-KeyExists" + ex.Message);
                return false;
            }
        }

        /// <summary>
        /// 更新Key,把自动注销时间设置为原来的key的时间,不存在返回false
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool UpdateValue(string key, string value)
        {
            try
            {
                if (csRedis.Exists(key))
                {
                    long time = csRedis.Ttl(key);
                    csRedis.Set(key, value, Convert.ToInt32(time));
                    return true;
                }
                return false;
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-SetValue[{key}-{value}]" + ex.Message);
                return false;
            }
        }


        public string? GetValue(string key)
        {
            try
            {
                return csRedis.Get(key);
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-GetValue[{key}]" + ex.Message);
                return null;
            }
        }

        /// <summary>
        /// 获得json序列化后的
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T? GetValue<T>(string key)
        {
            try
            {
                var data = csRedis.Get(key);
                return JsonConvert.DeserializeObject<T>(data);
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-GetValue[{key}]" + ex.Message);
                return default;
            }
        }

        public T? GetEntity<T>(string key)
        {
            try
            {
                var data = csRedis.Get(key);
                return JsonConvert.DeserializeObject<T>(data);
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-GetList[{key}]" + ex.Message);
                return default;
            }
        }

        public List<T>? GetLike<T>(string key)
        {
            try
            {
                var dataList = csRedis.Keys(key + "*");
                List<T> list = new List<T>();
                foreach (string item in dataList)
                {
                    var data = GetEntity<T>(item);
                    if (data != null)
                    {
                        list.Add(data);
                    }
                }
                return list;
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-GetList[{key}]" + ex.Message);
                return default;
            }
        }

        public void DeleteKey(string key)
        {
            try
            {
                csRedis.Del(key);
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-DeleteKey[{key}]" + ex.Message);
            }
        }

        public void DeleteLike(string key)
        {
            try
            {
                var dataList = csRedis.Keys(key + "*");

                foreach (string item in dataList)
                {
                    DeleteKey(item);
                }
            }
            catch (Exception ex)
            {
                NLogHelper.Error($"RedisDataHelper-DeleteLike[{key}]" + ex.Message);
            }
        }


        private bool AcquireLock(string lockKey, string lockValue, int lockTimeoutSeconds)
        {
            // 尝试获取锁
            bool lockAcquired = csRedis.SetNx(lockKey, lockValue);

            // 如果成功获取锁,设置锁的超时时间
            if (lockAcquired)
            {
                csRedis.Expire(lockKey, lockTimeoutSeconds);
            }

            return lockAcquired;
        }

        private void ReleaseLock(string lockKey, string lockValue)
        {
            // 释放锁
            // 使用 Lua 脚本确保只有持有锁的客户端才能释放锁
            string luaScript = @"
            if redis.call('get', KEYS[1]) == ARGV[1] then
                return redis.call('del', KEYS[1])
            else
                return 0
            end";

            csRedis.Eval(luaScript, lockKey, new[] { lockValue });
        }
    }
}

以上就是C#实现封装常用Redis工具类的示例代码的详细内容,更多关于C#封装常用Redis的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文