.Net Redis基本使用

在开发项目时,我们为了提高效率和性能,我们有时候会选择使用Redis中间件来进行临时的存储,再用Redis开发时候效率比数据库快了2000%。所以有些情况我们选择用Redis还是非常好的,特别是在调用频繁,数据量大的时候,我们可以先提到缓存上,每隔一段时间去更新缓存,用户从缓存提取,就会特别快。


一、部署Redis环境

下载Redis服务

百度网盘地址icon-default.png?t=N4P3http://链接:https://pan.baidu.com/s/1I06A6mUcn8rIBak5Wtxn6w?pwd=z2uz 下载管理工具,一个好的可视化管理工具,可以加快开发效率和方便的查看数据,大家可以自己找,我这里推荐一个  Another Redis Desktop Manager

 服务下载好之后,本地服务要运行起来才可以访问本地Redis服务。

 


二、新建项目

新建一个自己需要用的项目,或者已有的项目

1、安装NutGet包

StackExchange.Redis

 2、创建辅助类,也就是操作Redis的方法

        我这里列举两个辅助类

 ①⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using System.Linq;
//using ITOrm.Core.Helper;
using Newtonsoft.Json;
using System.Threading;

namespace RedisCeShi.Common
{
    public static class RedisCache
    {
        private static readonly int DEFAULT_TMEOUT = 5000;// 默认超时时间(单位秒)

        private static readonly string coonstr = "Redis服务连接地址";

        private static object _locker = new object();
        private static ConnectionMultiplexer _instance = null;

        private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
        {
            return ConnectionMultiplexer.Connect(coonstr);

        });


        /// <summary>
        /// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
        /// </summary>
        public static ConnectionMultiplexer Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_locker)
                    {
                        if (_instance == null || !_instance.IsConnected)
                        {
                            _instance = lazyConnection.Value;
                        }
                    }
                }

                //注册如下事件
                _instance.ConnectionFailed += MuxerConnectionFailed;// 连接失败 , 如果重新连接成功你将不会收到这个通知
                _instance.ConnectionRestored += MuxerConnectionRestored;// 重新建立连接之前的错误
                _instance.ErrorMessage += MuxerErrorMessage;// 发生错误时
                _instance.ConfigurationChanged += MuxerConfigurationChanged;// 配置更改时
                _instance.HashSlotMoved += MuxerHashSlotMoved;// 更改集群
                _instance.InternalError += MuxerInternalError;// redis类库错误
                return _instance;
            }
        }

        static RedisCache()
        {

            ThreadPool.SetMaxThreads(100, 100);

            ThreadPool.SetMinThreads(100, 100);
        }

        public static IDatabase GetDatabase(int db)
        {
            return Instance.GetDatabase(db);
        }

        public static ISubscriber GetSubscriber()
        {
            return Instance.GetSubscriber();
        }

        #region 获取
        public static string Get(string key, int db = 0)
        {
            return GetDatabase(db).StringGet(key);
        }

        public static T Get<T>(string key, int db = 0)
        {
            try
            {
                var cacheValue = GetDatabase(db).StringGet(key);
                var value = default(T);
                if (!cacheValue.IsNull)
                {
                    value = JsonConvert.DeserializeObject<T>(cacheValue);
                }
                return value;
            }
            catch (Exception e)
            {

                return default;
            }

        }

        public static string GetString(string key, int db = 0)
        {
            try
            {
                var cacheValue = GetDatabase(db).StringGet(key);

                return cacheValue;
            }
            catch (Exception e)
            {
                return "";
            }

        }

        public static T Get<T>(string key, Func<T> func, DateTime? cacheTime = null, int db = 0)
        {
            try
            {
                if (Exists(key, db))
                {
                    return Get<T>(key, db);
                }
                else
                {
                    cacheTime = cacheTime ?? DateTime.Now.AddDays(1);
                    var obj = func.Invoke();
                    Set(key, obj, cacheTime.Value, db);
                    return obj;
                }
            }
            catch (Exception)
            {
                return func.Invoke();
            }

        }

        public static string GetString(string key, Func<string> func, DateTime? cacheTime = null, int db = 0)
        {
            try
            {
                if (Exists(key, db))
                {
                    return GetString(key, db);
                }
                else
                {
                    cacheTime = cacheTime ?? DateTime.Now.AddDays(1);
                    var obj = func.Invoke();
                    Set(key, obj, cacheTime.Value, db);
                    return obj;
                }
            }
            catch (Exception)
            {
                return func.Invoke();
            }

        }
        #endregion

        #region 异步获取
        public static async Task<string> GetAsync(string key, int db = 0)
        {
            return await GetDatabase(db).StringGetAsync(key);
        }

        public static async Task<T> GetAsync<T>(string key, int db = 0)
        {
            var cacheValue = await GetDatabase(db).StringGetAsync(key);
            var value = default(T);
            if (!cacheValue.IsNull)
            {
                value = JsonConvert.DeserializeObject<T>(cacheValue);
            }
            return value;
        }
        #endregion

        #region 设置

        /// <summary>
        /// 设置缓存,字符串类型
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set(string key, string data, int db = 0)
        {
            return Set(key, data, DEFAULT_TMEOUT, db);
        }
        /// <summary>
        /// 设置缓存,字符串类型
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool SetAdd(string key, string data, int db = 0)
        {
            return GetDatabase(db).SetAdd(key, data);
        }
        /// <summary>
        /// 设置缓存,字符串类型
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="seconds">seconds秒后,清除缓存</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set(string key, string data, int seconds, int db = 0)
        {
            return Set(key, data, DateTime.Now.AddSeconds(seconds), db);
        }

        /// <summary>
        /// 设置缓存,字符串类型
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="cacheTime">指定时间,清除缓存</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set(string key, string data, DateTime cacheTime, int db = 0)
        {
            return GetDatabase(db).StringSet(key, data, cacheTime - DateTime.Now);
        }

        /// <summary>
        /// 设置缓存,T类型 转字符串json格式
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set<T>(string key, T data, int db = 0)
        {
            return Set(key, data, DEFAULT_TMEOUT, db);
        }

        /// <summary>
        /// 设置缓存,T类型 转字符串json格式
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="seconds">seconds秒后,清除缓存</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set<T>(string key, T data, int seconds, int db = 0)
        {
            return Set(key, data, DateTime.Now.AddSeconds(seconds), db);
        }

        /// <summary>
        /// 设置缓存,T类型 转字符串json格式
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="data">缓存Value 字符串</param>
        /// <param name="cacheTime">指定时间,清除缓存</param>
        /// <param name="db">数据库编号</param>
        /// <returns>结果</returns>
        public static bool Set<T>(string key, T data, DateTime cacheTime, int db = 0)
        {
            try
            {
                TimeSpan timeSpan = cacheTime - DateTime.Now;
                return GetDatabase(db).StringSet(key, JsonConvert.SerializeObject(data), timeSpan);
            }
            catch (Exception)
            {

                return false;
            }

        }
        #endregion

        #region 异步设置
        public static async Task<bool> SetAsync(string key, string data, int db = 0)
        {
            return await SetAsync(key, data, DEFAULT_TMEOUT, db);
        }

        public static async Task<bool> SetAsync(string key, string data, int seconds, int db = 0)
        {
            return await SetAsync(key, data, DateTime.Now.AddSeconds(seconds), db);
        }

        public static async Task<bool> SetAsync(string key, string data, DateTime cacheTime, int db = 0)
        {
            return await GetDatabase(db).StringSetAsync(key, data, cacheTime - DateTime.Now);
        }

        public static async Task<bool> SetAsync<T>(string key, T data, int db = 0)
        {
            return await SetAsync(key, data, DEFAULT_TMEOUT, db);
        }

        public static async Task<bool> SetAsync<T>(string key, T data, int seconds, int db = 0)
        {
            return await SetAsync(key, data, DateTime.Now.AddSeconds(seconds), db);
        }

        public static async Task<bool> SetAsync<T>(string key, T data, DateTime cacheTime, int db = 0)
        {
            return await GetDatabase(db).StringSetAsync(key, JsonConvert.SerializeObject(data), cacheTime - DateTime.Now);
        }

        #endregion

        #region 列表

        public static List<T> GetList<T>(string key, int db = 0)
        {
            var list = GetDatabase(db).ListRange(key);
            List<T> result = new List<T>();
            foreach (var item in list)
            {
                result.Add(JsonConvert.DeserializeObject<T>(item));
            }
            return result;
        }

        /// <summary>
        /// 从底部插入数据
        /// </summary>
        public static void ListRightPush<T>(string key, List<T> data, int db = 0)
        {
            foreach (var single in data)
            {
                GetDatabase(db).ListRightPush(key, JsonConvert.SerializeObject(single));
            }
        }

        /// <summary>
        /// 从顶部插入数据
        /// </summary>
        public static void ListLeftPush<T>(string key, List<T> data, int db = 0)
        {
            foreach (var single in data)
            {
                GetDatabase(db).ListLeftPush(key, JsonConvert.SerializeObject(single));
            }
        }

        /// <summary>
        /// 从底部拿出数据,并删除此行数据
        /// </summary>
        public static T ListRightPop<T>(string key, int db = 0)
        {
            var rightPop = GetDatabase(db).ListRightPop(key);
            return rightPop.HasValue ? JsonConvert.DeserializeObject<T>(rightPop) : default;
        }

        /// <summary>
        /// 从顶部拿出数据,并删除此行数据
        /// </summary>
        public static T ListLeftPop<T>(string key, int db = 0)
        {
            RedisValue leftpop = GetDatabase(db).ListLeftPop(key);
            return leftpop.HasValue ? JsonConvert.DeserializeObject<T>(leftpop) : default;
        }

        #endregion

        #region 简单 redis 队列

        /// <summary>
        /// 存,从顶部插入数据,简单 redis 队列
        /// </summary>
        public static long LeftPush(string key, string data, int db = 0)
        {
            return GetDatabase(db).ListLeftPush(key, data);
        }

        /// <summary>
        /// 存,从顶部插入数据,简单 redis 队列
        /// </summary>
        public static long LeftPushByList(string key, List<string> list, int db = 0)
        {
            if (list != null && list.Count > 0)
            {
                return GetDatabase(db).ListLeftPush(key, list.Select(o => (RedisValue)o).ToArray());
            }
            return 0;
        }

        /// <summary>
        /// 取,从底部拿出数据,并删除此行数据,简单 redis 队列
        /// </summary>
        /// <param name="key"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static string RightPop(string key, int db = 0)
        {
            return GetDatabase(db).ListRightPop(key);
        }

        #endregion

        #region 其他

        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="db">数据库编号</param>
        /// <returns></returns>
        public static bool Remove(string key, int db = 0)
        {
            return GetDatabase(db).KeyDelete(key, CommandFlags.HighPriority);
        }

        /// <summary>
        /// 是否存在
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <param name="db">数据库编号</param>
        /// <returns></returns>
        public static bool Exists(string key, int db = 0)
        {
            try
            {
                return GetDatabase(db).KeyExists(key);
            }
            catch (Exception e)
            {

                return false;
            }

        }

        /// <summary>
        /// 实现递增
        /// </summary>
        public static async Task<long> Increment(string key, long value, int db = 0)
        {
            // 三种命令模式
            // Sync,同步模式会直接阻塞调用者,但是显然不会阻塞其他线程。
            // Async,异步模式直接走的是Task模型。
            // Fire - and - Forget,就是发送命令,然后完全不关心最终什么时候完成命令操作。
            // 即发即弃:通过配置 CommandFlags 来实现即发即弃功能,在该实例中该方法会立即返回,如果是string则返回null 如果是int则返回0.这个操作将会继续在后台运行,一个典型的用法页面计数器的实现:
            return await GetDatabase(db).StringIncrementAsync(key, value, CommandFlags.None);
        }

        /// <summary>
        /// 实现递减
        /// </summary>
        public static long Decrement(string key, string datakey, long value, int db = 0)
        {
            return GetDatabase(db).HashDecrement(key, datakey, value, flags: CommandFlags.FireAndForget);
        }

        /// <summary>
        /// 发送信息
        /// </summary>
        public static long Publish(string channel, object message)
        {
            return GetSubscriber().Publish(channel, JsonConvert.SerializeObject(message));
        }

        /// <summary>
        /// 在消费者端得到该消息并输出
        /// </summary>
        public static void Subscribe(string channelFrom)
        {
            GetSubscriber().Subscribe(channelFrom, (channel, message) =>
            {
                Console.WriteLine((string)message);
            });
        }

        /// <summary>
        /// GetServer方法会接收一个EndPoint类或者一个唯一标识一台服务器的键值对
        /// 有时候需要为单个服务器指定特定的命令
        /// 使用IServer可以使用所有的shell命令,比如:
        /// DateTime lastSave = server.LastSave();
        /// ClientInfo[] clients = server.ClientList();
        /// 如果报错在连接字符串后加 ,allowAdmin=true;
        /// </summary>
        public static IServer GetServer(string host, int port)
        {
            IServer server = Instance.GetServer(host, port);
            return server;
        }

        /// <summary>
        /// 获取全部终结点
        /// </summary>
        public static EndPoint[] GetEndPoints()
        {
            EndPoint[] endpoints = Instance.GetEndPoints();
            return endpoints;
        }

        #endregion

        #region 事件
        /// <summary>
        /// 配置更改时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
        {
            // LogHelper.WriteInfoLog("Configuration changed: " + e.EndPoint);
        }
        /// <summary>
        /// 发生错误时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
        {
            // LogHelper.WriteInfoLog("ErrorMessage: " + e.Message);
        }

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

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

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

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

        #region ZSet

        /// <summary>
        /// 操作ZSet
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="score">权重值</param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static bool SortedSetAdd(string key, string data, double score, int db = 0)
        {
            return GetDatabase(db).SortedSetAdd(key, data, score);
        }

        /// <summary>
        /// 操作ZSet 递增
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="score">权重值</param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<double> SortedSetIncrementAsync(string key, string data, double score, int db = 0)
        {
            return await GetDatabase(db).SortedSetIncrementAsync(key, data, score, CommandFlags.None);
        }


        /// <summary>
        /// 查询ZSet 返回排名 与 分数
        /// </summary>
        /// <param name="key"></param>
        /// <param name="order">排序方式</param>
        /// <param name="start">查找开始位置,从索引0开始</param>
        /// <param name="stop">查找个数</param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<long> SortedSetRangeByRankWithScores(RedisKey key, SortedSetEntry[] values, CommandFlags flags, int db = 0)
        {
            try
            {
                var context = GetDatabase(db);
                var vs = await context.SortedSetAddAsync(key, values, CommandFlags.None);
                return vs;
            }
            catch (Exception e)
            {
                return 0;
            }

        }




        /// <summary>
        /// 查询ZSet 返回排名 与 分数
        /// </summary>
        /// <param name="key"></param>
        /// <param name="order">排序方式</param>
        /// <param name="start">查找开始位置,从索引0开始</param>
        /// <param name="stop">查找个数</param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<List<RespZSet>> SortedSetRangeByRankWithScores(string key, Func<List<RespZSet>> fun, int start = 0, int stop = -1, int order = 1, int db = 0)
        {
            try
            {
                var context = GetDatabase(db);

                SortedSetEntry[] vs = await context.SortedSetRangeByRankWithScoresAsync(key, start, stop, (Order)order, CommandFlags.None);

                List<RespZSet> list = new List<RespZSet>();
                int i = 0;
                foreach (var item in vs)
                {
                    list.Add(new RespZSet()
                    {
                        Key = key,
                        Data = item.Element.ToString(),
                        Score = item.Score,
                        Ranking = start + 1 + i
                    });
                    i++;
                }
                return list;
            }
            catch (Exception e)
            {

                return fun.Invoke();
            }

        }
        /// <summary>
        /// 获取有序有序列表所有数据值
        /// </summary>
        /// <param name="key"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<long> SortedSetLengthAsync(string key, int db = 0)
        {
            var result = await GetDatabase(db).SortedSetLengthAsync(key);
            return result;
        }

        /// <summary>
        /// 根据key 与值获取排名
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="order">0 正序 1倒叙</param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<long> SortedSetRankAsync(string key, string data, int order, int db = 0)
        {
            var result = await GetDatabase(db).SortedSetRankAsync(key, data, (Order)order, CommandFlags.None);
            return result == null ? 0 : result.Value + 1;
        }



        /// <summary>
        /// 根据key 与值获取积分
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<long> SortedSetScoreAsync(string key, string data, int db = 0)
        {
            var result = await GetDatabase(db).SortedSetScoreAsync(key, data, CommandFlags.None);
            return result == null ? 0 : (long)result.Value;
        }
        #endregion

        #region 锁  LockTake
        /// <summary>
        /// 分布式锁
        /// </summary>
        public static bool LockTake(string key, string datakey, int db = 0)
        //定义一个名为 LockTake 的静态方法,该方法接受三个参数:key、datakey 和 db,返回布尔值。
        {
            while (true)
            // 进入一个无限循环,直到加锁成功为止。
            {
                var flag = GetDatabase(db).LockTake(key, datakey, TimeSpan.FromSeconds(10.0), CommandFlags.None);
                // 调用 GetDatabase 方法获取指定数据库的实例,然后调用 LockTake 方法尝试获取锁,如果成功获取锁,则将 flag 设置为 true,否则将 flag 设置为 false。
                if (flag)
                {
                    return true;
                    // 如果获取锁成功,则返回 true。
                }
                Thread.Sleep(500);
                // 如果获取锁失败,则让当前线程休眠 500 毫秒后再次尝试获取锁。
            }
        }


        /// <summary>
        /// 分布式锁封装(委托)
        /// </summary>
        /// <param name="key"></param>
        /// <param name="action"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public static async Task<T> LockTakeFunc<T>(string key, Func<Task<T>> action, int db = 0)
        {
            string lockval = Guid.NewGuid().ToString();

            var lockobj = LockTake(key, lockval, db);
            if (lockobj)//如果加锁成功
            {
                //维护一个线程,更新锁的过期时间
                bool actBool = true;
                //Action act = () =>
                //{
                //    int i = 0;
                //    while (actBool)
                //    {
                //        if (i > 10) break;//超过10次,无论如何也停下来吧
                //        Thread.Sleep(3000);
                //        if (actBool == false) break;//优化,刚等完3秒如果需要退出进程,立即退出,不再更新过期时间
                //        Set(key, lockval, DateTime.Now.ToARCBjTime().AddSeconds(10), db);
                //        i++;
                //    }
                //};
                //act.BeginInvoke(null, null);
                var result = default(T);
                try
                {
                    result = await action.Invoke();
                }
                catch (Exception e)
                {
                    //redisLogger.LogContent( JsonConvert.SerializeObject(e) );
                }
                finally
                {
                    string value = Get(key, db);
                    if (value == lockval)
                    {
                        actBool = false;//结束维护锁的异步线程
                        Remove(key, db);
                    }
                }

                return result;
            }
            return default;
        }
        #endregion

    }
    public class RespZSet
    {
        public string Key { get; set; }
        public string Data { get; set; }
        public double Score { get; set; }
        public long Ranking { get; set; }
    }
}

②⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

using Newtonsoft.Json;
using StackExchange.Redis;

namespace RedisCeShi.Common
{
    public class RedisHelper
    {
        private static RedisHelper instance;
        public static RedisHelper Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new RedisHelper(Connection);
                }
                return instance;
            }
        }
        //redis连接
        //构造方法为private,可以避免外界通过利用new创建此类实例的可能
        private RedisHelper(string connection)
        {
            Redis = ConnectionMultiplexer.Connect(connection);
            DB = Redis.GetDatabase(DataBaseIndex);
        }

        /// <summary>
        /// redis连接字符串  默认等于本地redis连接
        /// </summary>
        public static string Connection { get; set; } = "Redis服务连接地址";
        /// <summary>
        /// DB索引  默认等于0  比如 有两个同名的redis库  默认读取第一个
        /// </summary>
        public static int DataBaseIndex { get; set; } = 0;
        /// <summary>
        /// redis连接类   默认连接本地redis库
        /// </summary>
        public ConnectionMultiplexer Redis { get; set; }
        /// <summary>
        /// redis库连接  数据读取
        /// </summary>
        public IDatabase DB { get; set; }




        /// <summary>
        /// 增加/修改 redis Key
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetValue(string key, string value)
        {
            return DB.StringSet(key, value);
        }

        public bool SetValue(string key, string value, TimeSpan time)
        {
            return DB.StringSet(key, value, time);
        }

        /// <summary>
        /// 查询redis Key
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetValue(string key)
        {
            return DB.StringGet(key);
        }

        /// <summary>
        /// 删除redis Key
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool DeleteKey(string key)
        {
            return DB.KeyDelete(key);
        }

        /// <summary>
        /// 根据key获取对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T GetObjectByKey<T>(string key)
        {
            string value = DB.StringGet(key);
            if (value == null)
            {
                return default;
            }

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

        /// <summary>
        /// 根据key和obj保存数据设置缓存时间
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public bool SetObjectWithKey<T>(string key, T obj, TimeSpan time)
        {
            string json = JsonConvert.SerializeObject(obj);
            return DB.StringSet(key, json, time);
        }



        /// <summary>
        /// 根据key和obj保存数据
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public bool SetObjectWithKey<T>(string key, T obj)
        {
            string json = JsonConvert.SerializeObject(obj);
            return DB.StringSet(key, json);
        }



    }
}

3、调用上面两个类的方法

下面代码均是调用的上面两个辅助类的方法,以下是一些简单基础的使用方法示例

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using RedisCeShi.Common;
using RedisCeShi.Model;

namespace RedisCeShi.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class RedisTowController : ControllerBase
    {
        /// <summary>
        /// 添加多个学生对象到文件夹
        /// </summary>
        /// <param name="foldername">文件夹名称</param>
        /// <param name="students">对象</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult CreateStudentListNotime(string foldername, List<Students> students)
        {
            添加一个json
            //var b = RedisHelper.Instance.SetObjectWithKey<List<Students>>("Student", students, TimeSpan.FromMinutes(1));
            try
            {
                int cont = 0;
                foreach (var item in students)
                {
                    var a = RedisHelper.Instance.SetObjectWithKey<Students>($"{foldername}:" + item.Id, item);
                    if (a)
                    {
                        cont++;
                    }
                }
                if (cont > 0)
                {
                    return Ok(students);
                }
                return Ok("添加失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 添加多个学生对象到文件夹并计时销毁
        /// </summary>
        /// <param name="foldername">文件夹名称</param>
        /// <param name="students">对象</param>
        /// <param name="time">过期时间</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult CreateStudentListIstime(string foldername,int time, List<Students> students)
        {
            添加一个json
            //var b = RedisHelper.Instance.SetObjectWithKey<List<Students>>("Student", students, TimeSpan.FromMinutes(1));
            try
            {
                int cont = 0;
                foreach (var item in students)
                {
                    var a = RedisHelper.Instance.SetObjectWithKey<Students>($"{foldername}:" + item.Id, item, TimeSpan.FromMinutes(time));
                    if (a)
                    {
                        cont++;
                    }
                }
                if (cont > 0)
                {
                    return Ok(students);
                }
                return Ok("添加失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }


        /// <summary>
        /// 添加一个学生对象Json
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="student">对象</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult TianjiaDangGe(Guid key, Students student)
        {
            try
            {
                var a = RedisHelper.Instance.SetObjectWithKey<Students>(key.ToString(), student);
                if (a)
                {
                    return Ok(a);
                }
                return Ok("添加失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 查询某个文件夹下中的某个对象
        /// </summary>
        /// <param name="foldername">文件夹名称</param>
        /// <param name="key">键值</param>
        /// <returns></returns>
        [HttpGet]
        public ActionResult ChaXundDuiXiang(string foldername,string key)
        {
            try
            {
                Students student = RedisHelper.Instance.GetObjectByKey<Students>($"{foldername}:" + key);
                if (student == null)
                {
                    return Ok(student);
                }
                return Ok("没有找到该元素");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 查询所有学生Student仅支持为数字的Guid不行
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public List<Students> ChaXun()
        {
            List<Students> students = new List<Students>();
            Students a;
            for (int i = 1; i < 2; i++)
            {
                a = RedisHelper.Instance.GetObjectByKey<Students>("Student:" + i);
                students.Add(a);
            }
            return students;
        }

        /// <summary>
        /// 过期设置
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="time">过期时间</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult YanZhengMa(string key = "验证码", int time = 1)
        {
            #region 验证码6位
            int rep = 0;
            string str = string.Empty;
            long num2 = DateTime.Now.Ticks + rep;
            rep++;
            Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> rep)));
            for (int i = 0; i < 6; i++)
            {
                char ch;
                int num = random.Next();
                if ((num % 2) == 0)
                {
                    ch = (char)(0x30 + ((ushort)(num % 10)));
                }
                else
                {
                    ch = (char)(0x41 + ((ushort)(num % 0x1a)));
                }
                str = str + ch.ToString();
            }
            #endregion
            try
            {
                var b = RedisHelper.Instance.SetValue(key, str, TimeSpan.FromMinutes(time));
                if (b)
                {
                    return Ok($"验证码{str}已添加");
                }
                return Ok("添加失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 根据key查询
        /// </summary>
        /// <param name="key">键</param>
        /// <returns></returns>
        [HttpGet]
        public ActionResult HuoQuYanZhengMa(string key,int db)
        {
            try
            {
                var a = RedisHelper.Instance.GetValue(key);
                var b = RedisCache.GetString(key,db);
                if (a != "" || a == null)
                {
                    return Ok("还存在");
                }
                return Ok("可能过期了");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 根据key删除
        /// </summary>
        /// <param name="key">键</param>
        /// <returns></returns>
        [HttpDelete]
        public ActionResult ShanChu(string key)
        {
            try
            {
                var a = RedisHelper.Instance.DeleteKey(key);
                if (a)
                {
                    return Ok("删除成功");
                }
                return Ok("删除失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// ZSet添加
        /// </summary>
        /// <param name="students"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult ZSetTianJia(List<ZSetKeyValueScore> data)
        {
            try
            {
                int a = 0;
                foreach (var item in data)
                {
                    var b = RedisCache.SortedSetAdd(item.Key, item.Value, item.Score);
                    if (b)
                    {
                        a++;
                    }
                }
                //var a = RedisCache.SortedSetAdd("ZSet测试", "你好", 2);
                //RedisCache.SortedSetAdd("ZSet测试", "不好", 3);
                //RedisCache.SortedSetAdd("ZSet测试", "世界", 4);
                //RedisCache.SortedSetAdd("ZSet测试", "啊啊啊", 5);
                if (a > 0)
                {
                    return Ok("添加成功");
                }
                return Ok("添加失败");
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 返回ZSet类型某个键里面的条数
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="db">仓库编号</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<ActionResult> Aaaaa(string key, int db)
        {
            try
            {
                var a = await RedisCache.SortedSetLengthAsync(key, db);
                return Ok(a);
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 公司方法:排名顺序:排在第几位
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="Member">内容</param>
        /// <param name="order">0正序,1倒叙</param>
        /// <param name="db">仓库编号</param>
        /// <returns></returns>
        [HttpGet] 
        public async Task<ActionResult> Bbbbbb(string key, string Member, int order, int db)
        {
            try
            {
                var a = await RedisCache.SortedSetRankAsync(key, Member, order, db);
                return Ok(a);
            }
            catch (Exception e)
            {

                return Ok(e.Message);
            }
        }

        /// <summary>
        /// 加锁
        /// </summary>
        /// <param name="key"></param>
        /// <param name="data"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        [HttpGet]
        public  ActionResult FenBuShiSuo(string key,string data,int db = 0)
        {
            try
            {
                var a = RedisCache.LockTake(key, data, db);
                return Ok(a);
            }
            catch (Exception e)
            {

                return BadRequest("错误信息:" + e);
            }
        }

    }
}

上述代码是,一些比较常用的,存储数据读取数据,里面还有一些方法我没有给出示例,是因为用的不是很广泛,而且我也用的不是很熟。目前还在研究阶段。所接触到的业务也达不到很大的并发量。大家可以根据上面列举的一些示例进行Redis的操作。

共同学习共同进步!!!!!!

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值