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

 更新时间:2024年03月05日 10:20:10   作者:搬砖的诗人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的资料请关注脚本之家其它相关文章!

相关文章

  • C#编程实现带有Aero效果的窗体示例

    C#编程实现带有Aero效果的窗体示例

    这篇文章主要介绍了C#编程实现带有Aero效果的窗体,涉及C#调用动态链接库针对窗体属性的相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • C# 使用HttpClient模拟请求的案例

    C# 使用HttpClient模拟请求的案例

    这篇文章主要介绍了C# 使用HttpClient模拟请求的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • unity3D实现三维物体跟随鼠标

    unity3D实现三维物体跟随鼠标

    这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C#实现ArrayList动态数组的示例

    C#实现ArrayList动态数组的示例

    ArrayList是一个动态数组,可以用来存储任意类型的元素,本文就来介绍一下C#实现ArrayList动态数组的示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • C#编写的艺术字类实例代码

    C#编写的艺术字类实例代码

    本文给大家分享使用纯C#编写的艺术字类实例代码,代码简单易懂,需要的朋友参考下本教程
    2016-03-03
  • C#图像处理之图像均值方差计算的方法

    C#图像处理之图像均值方差计算的方法

    这篇文章主要介绍了C#图像处理之图像均值方差计算的方法,涉及C#图像均值方差的计算技巧,需要的朋友可以参考下
    2015-04-04
  • C#使用ML.Net完成人工智能预测

    C#使用ML.Net完成人工智能预测

    这篇文章主要介绍了C#使用ML.Net完成人工智能预测的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • C#/VB.NET 实现在PDF表格中添加条形码

    C#/VB.NET 实现在PDF表格中添加条形码

    条码的应用已深入生活和工作的方方面面。在处理条码时,常需要和各种文档格式相结合。本文,以操作PDF文件为例,介绍如何在编辑表格时,向单元格中插入条形码,需要的可以参考一下
    2022-06-06
  • C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    这篇文章主要为大家详细介绍了C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • C# Base64编码函数

    C# Base64编码函数

    Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。
    2009-06-06

最新评论