zoukankan      html  css  js  c++  java
  • StackExchange.Redis.DLL 操作redis加强版

    直接引用StackExchange.Redis.dll这一个dll来操作redis

    App.config配置

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
        </startup>
    <appSettings>
      <!--redis配置-->
        <add key="RedisHosts" value="127.0.0.1:6379,allowadmin=true,password=zoulu19900206" />
        <add key="RedisKey" value="PubSub:" />
    </appSettings>
    </configuration>

    调用事例一、

    using Common;
    using StackExchange.Redis;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Lock
    {
        class Program
        {
            static RedisStackExchangeHelper _redis = new RedisStackExchangeHelper();
            static void Main(string[] args)
            {
                Lock();
               
            }
    
            static void Lock()
            {
                Console.WriteLine("Start..........");
                var db = _redis.GetDatabase();
                RedisValue token = Environment.MachineName;
                //实际项目秒杀此处可换成商品ID
                if (db.LockTake("test", token, TimeSpan.FromSeconds(10)))
                {
                    try
                    {
                        Console.WriteLine("Working..........");
                        Thread.Sleep(5000);
                    }
                    finally
                    {
                        db.LockRelease("test", token);
                    }
                }
    
                Console.WriteLine("Over..........");
            }
        }
    }

    调用事例二、

    using Common;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace PubSub
    {
        class Program
        {
            static RedisStackExchangeHelper _redis = new RedisStackExchangeHelper();
            static void Main(string[] args)
            {
                Console.WriteLine("请输入发布订阅类型?1:发布;2:订阅");
                var type = Console.ReadLine();
                if (type == "1")
                {
                    Pub();
                }
                else if(type=="2")
                {
                    Sub();
                }
    
    
                Console.ReadLine();
            }
    
            static async Task Pub()
            {
                Console.WriteLine("请输入要发布向哪个通道?");
                var channel = Console.ReadLine();
    
                await Task.Delay(10);
                for(int i = 0; i < 10; i++)
                {
                    await _redis.PublishAsync(channel, i.ToString());
                }
                    
            }
    
            static async Task Sub()
            {
                Console.WriteLine("请输入您要订阅哪个通道的信息?");
                var channelKey = Console.ReadLine();
                await _redis.SubscribeAsync(channelKey, (channel, message) =>
                {
                    Console.WriteLine("接受到发布的内容为:" + message);
                });
                Console.WriteLine("您订阅的通道为:<< " + channelKey + " >> ! 请耐心等待消息的到来!!");
            }
        }
    }

    调用事例三、

    using Common;
    using StackExchange.Redis;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Transaction
    {
        class Program
        {
            static RedisStackExchangeHelper _redis = new RedisStackExchangeHelper();
            static void Main(string[] args)
            {
                Tran();
                Console.ReadLine();
            }
            static void Tran()
            {
                var tran = _redis.CreateTransaction();
                 tran.StringSetAsync("test1", "xiaopotian");
                 tran.StringSetAsync("test2", "xiaopangu");
                var commit = tran.ExecuteAsync();
                Console.WriteLine(commit);
            }
        }
    }

    两个帮助类

    using Newtonsoft.Json;
    using StackExchange.Redis;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Common
    {
        /// <summary>
        /// Redis操作
        /// </summary>
        public class RedisStackExchangeHelper
        {
            private readonly ConnectionMultiplexer _conn;
            public string CustomKey;
    
            private int DbNum { get; }
    
            #region 构造函数
    
            public RedisStackExchangeHelper(int dbNum = 0)
                    : this(dbNum, null)
            {
            }
    
            public RedisStackExchangeHelper(int dbNum, string readWriteHosts)
            {
                DbNum = DbNum;
                _conn =
                    string.IsNullOrWhiteSpace(readWriteHosts) ?
                    RedisConnectionHelp.Instance :
                    RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
            }
    
            #endregion 构造函数
    
            #region String
    
            #region 同步方法
    
            /// <summary>
            /// 保存单个key value
            /// </summary>
            /// <param name="key">Redis Key</param>
            /// <param name="value">保存的值</param>
            /// <param name="expiry">过期时间</param>
            /// <returns></returns>
            public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                return Do(db => db.StringSet(key, value, expiry));
            }
    
            /// <summary>
            /// 保存多个key value
            /// </summary>
            /// <param name="keyValues">键值对</param>
            /// <returns></returns>
            public bool StringSet(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
            {
                List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
                    keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
                return Do(db => db.StringSet(newkeyValues.ToArray()));
            }
    
            /// <summary>
            /// 保存一个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="obj"></param>
            /// <param name="expiry"></param>
            /// <returns></returns>
            public bool StringSet<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                string json = ConvertJson(obj);
                return Do(db => db.StringSet(key, json, expiry));
            }
    
            /// <summary>
            /// 获取单个key的值
            /// </summary>
            /// <param name="key">Redis Key</param>
            /// <returns></returns>
            public string StringGet(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.StringGet(key));
            }
    
            /// <summary>
            /// 获取多个Key
            /// </summary>
            /// <param name="listKey">Redis Key集合</param>
            /// <returns></returns>
            public RedisValue[] StringGet(List<string> listKey)
            {
                List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
                return Do(db => db.StringGet(ConvertRedisKeys(newKeys)));
            }
    
            /// <summary>
            /// 获取一个key的对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public T StringGet<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db => ConvertObj<T>(db.StringGet(key)));
            }
    
            /// <summary>
            /// 为数字增长val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="val">可以为负</param>
            /// <returns>增长后的值</returns>
            public long StringIncrement(string key, long val = 1)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.StringIncrement(key, val));
            }
    
            /// <summary>
            /// 为数字减少val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="val">可以为负</param>
            /// <returns>减少后的值</returns>
            public long StringDecrement(string key, long val = 1)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.StringDecrement(key, val));
            }
    
            #endregion 同步方法
    
            #region 异步方法
    
            /// <summary>
            /// 保存单个key value
            /// </summary>
            /// <param name="key">Redis Key</param>
            /// <param name="value">保存的值</param>
            /// <param name="expiry">过期时间</param>
            /// <returns></returns>
            public async Task<bool> StringSetAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.StringSetAsync(key, value, expiry));
            }
    
            /// <summary>
            /// 保存多个key value
            /// </summary>
            /// <param name="keyValues">键值对</param>
            /// <returns></returns>
            public async Task<bool> StringSetAsync(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
            {
                List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
                    keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
                return await Do(db => db.StringSetAsync(newkeyValues.ToArray()));
            }
    
            /// <summary>
            /// 保存一个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="obj"></param>
            /// <param name="expiry"></param>
            /// <returns></returns>
            public async Task<bool> StringSetAsync<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                string json = ConvertJson(obj);
                return await Do(db => db.StringSetAsync(key, json, expiry));
            }
    
            /// <summary>
            /// 获取单个key的值
            /// </summary>
            /// <param name="key">Redis Key</param>
            /// <returns></returns>
            public async Task<string> StringGetAsync(string key)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.StringGetAsync(key));
            }
    
            /// <summary>
            /// 获取多个Key
            /// </summary>
            /// <param name="listKey">Redis Key集合</param>
            /// <returns></returns>
            public async Task<RedisValue[]> StringGetAsync(List<string> listKey)
            {
                List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
                return await Do(db => db.StringGetAsync(ConvertRedisKeys(newKeys)));
            }
    
            /// <summary>
            /// 获取一个key的对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<T> StringGetAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                string result = await Do(db => db.StringGetAsync(key));
                return ConvertObj<T>(result);
            }
    
            /// <summary>
            /// 为数字增长val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="val">可以为负</param>
            /// <returns>增长后的值</returns>
            public async Task<double> StringIncrementAsync(string key, double val = 1)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.StringIncrementAsync(key, val));
            }
    
            /// <summary>
            /// 为数字减少val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="val">可以为负</param>
            /// <returns>减少后的值</returns>
            public async Task<double> StringDecrementAsync(string key, double val = 1)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.StringDecrementAsync(key, val));
            }
    
            #endregion 异步方法
    
            #endregion String
    
            #region Hash
    
            #region 同步方法
    
            /// <summary>
            /// 判断某个数据是否已经被缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public bool HashExists(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.HashExists(key, dataKey));
            }
    
            /// <summary>
            /// 存储数据到hash表
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="t"></param>
            /// <returns></returns>
            public bool HashSet<T>(string key, string dataKey, T t)
            {
                key = AddSysCustomKey(key);
                return Do(db =>
                {
                    string json = ConvertJson(t);
                    return db.HashSet(key, dataKey, json);
                });
            }
    
            /// <summary>
            /// 移除hash中的某值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public bool HashDelete(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.HashDelete(key, dataKey));
            }
    
            /// <summary>
            /// 移除hash中的多个值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKeys"></param>
            /// <returns></returns>
            public long HashDelete(string key, List<RedisValue> dataKeys)
            {
                key = AddSysCustomKey(key);
                //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
                return Do(db => db.HashDelete(key, dataKeys.ToArray()));
            }
    
            /// <summary>
            /// 从hash表获取数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public T HashGet<T>(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                return Do(db =>
                {
                    string value = db.HashGet(key, dataKey);
                    return ConvertObj<T>(value);
                });
            }
    
            /// <summary>
            /// 为数字增长val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="val">可以为负</param>
            /// <returns>增长后的值</returns>
            public double HashIncrement(string key, string dataKey, double val = 1)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.HashIncrement(key, dataKey, val));
            }
    
            /// <summary>
            /// 为数字减少val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="val">可以为负</param>
            /// <returns>减少后的值</returns>
            public double HashDecrement(string key, string dataKey, double val = 1)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.HashDecrement(key, dataKey, val));
            }
    
            /// <summary>
            /// 获取hashkey所有Redis key
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public List<T> HashKeys<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db =>
                {
                    RedisValue[] values = db.HashKeys(key);
                    return ConvetList<T>(values);
                });
            }
            #endregion 同步方法
    
            #region 异步方法
    
            /// <summary>
            /// 判断某个数据是否已经被缓存
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public async Task<bool> HashExistsAsync(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.HashExistsAsync(key, dataKey));
            }
    
            /// <summary>
            /// 存储数据到hash表
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="t"></param>
            /// <returns></returns>
            public async Task<bool> HashSetAsync<T>(string key, string dataKey, T t)
            {
                key = AddSysCustomKey(key);
                return await Do(db =>
                {
                    string json = ConvertJson(t);
                    return db.HashSetAsync(key, dataKey, json);
                });
            }
    
            /// <summary>
            /// 移除hash中的某值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public async Task<bool> HashDeleteAsync(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.HashDeleteAsync(key, dataKey));
            }
    
            /// <summary>
            /// 移除hash中的多个值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKeys"></param>
            /// <returns></returns>
            public async Task<long> HashDeleteAsync(string key, List<RedisValue> dataKeys)
            {
                key = AddSysCustomKey(key);
                //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
                return await Do(db => db.HashDeleteAsync(key, dataKeys.ToArray()));
            }
    
            /// <summary>
            /// 从hash表获取数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <returns></returns>
            public async Task<T> HashGeAsync<T>(string key, string dataKey)
            {
                key = AddSysCustomKey(key);
                string value = await Do(db => db.HashGetAsync(key, dataKey));
                return ConvertObj<T>(value);
            }
    
            /// <summary>
            /// 为数字增长val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="val">可以为负</param>
            /// <returns>增长后的值</returns>
            public async Task<double> HashIncrementAsync(string key, string dataKey, double val = 1)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.HashIncrementAsync(key, dataKey, val));
            }
    
            /// <summary>
            /// 为数字减少val
            /// </summary>
            /// <param name="key"></param>
            /// <param name="dataKey"></param>
            /// <param name="val">可以为负</param>
            /// <returns>减少后的值</returns>
            public async Task<double> HashDecrementAsync(string key, string dataKey, double val = 1)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.HashDecrementAsync(key, dataKey, val));
            }
    
            /// <summary>
            /// 获取hashkey所有Redis key
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<List<T>> HashKeysAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                RedisValue[] values = await Do(db => db.HashKeysAsync(key));
                return ConvetList<T>(values);
            }
    
            #endregion 异步方法
    
            #endregion Hash
    
            #region List
    
            #region 同步方法
    
            /// <summary>
            /// 移除指定ListId的内部List的值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public void ListRemove<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                Do(db => db.ListRemove(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 获取指定key的List
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public List<T> ListRange<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(redis =>
                {
                    var values = redis.ListRange(key);
                    return ConvetList<T>(values);
                });
            }
    
            /// <summary>
            /// 入队
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public void ListRightPush<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                Do(db => db.ListRightPush(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 出队
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public T ListRightPop<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db =>
                {
                    var value = db.ListRightPop(key);
                    return ConvertObj<T>(value);
                });
            }
    
            /// <summary>
            /// 入栈
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public void ListLeftPush<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                Do(db => db.ListLeftPush(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 出栈
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public T ListLeftPop<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db =>
                {
                    var value = db.ListLeftPop(key);
                    return ConvertObj<T>(value);
                });
            }
    
            /// <summary>
            /// 获取集合中的数量
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public long ListLength(string key)
            {
                key = AddSysCustomKey(key);
                return Do(redis => redis.ListLength(key));
            }
    
            #endregion 同步方法
    
            #region 异步方法
    
            /// <summary>
            /// 移除指定ListId的内部List的值
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public async Task<long> ListRemoveAsync<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.ListRemoveAsync(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 获取指定key的List
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<List<T>> ListRangeAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                var values = await Do(redis => redis.ListRangeAsync(key));
                return ConvetList<T>(values);
            }
    
            /// <summary>
            /// 入队
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public async Task<long> ListRightPushAsync<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 出队
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<T> ListRightPopAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                var value = await Do(db => db.ListRightPopAsync(key));
                return ConvertObj<T>(value);
            }
    
            /// <summary>
            /// 入栈
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public async Task<long> ListLeftPushAsync<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 出栈
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<T> ListLeftPopAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                var value = await Do(db => db.ListLeftPopAsync(key));
                return ConvertObj<T>(value);
            }
    
            /// <summary>
            /// 获取集合中的数量
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<long> ListLengthAsync(string key)
            {
                key = AddSysCustomKey(key);
                return await Do(redis => redis.ListLengthAsync(key));
            }
    
            #endregion 异步方法
    
            #endregion List
    
            #region SortedSet 有序集合
    
            #region 同步方法
    
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="score"></param>
            public bool SortedSetAdd<T>(string key, T value, double score)
            {
                key = AddSysCustomKey(key);
                return Do(redis => redis.SortedSetAdd(key, ConvertJson<T>(value), score));
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public bool SortedSetRemove<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                return Do(redis => redis.SortedSetRemove(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 获取全部
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public List<T> SortedSetRangeByRank<T>(string key)
            {
                key = AddSysCustomKey(key);
                return Do(redis =>
                {
                    var values = redis.SortedSetRangeByRank(key);
                    return ConvetList<T>(values);
                });
            }
    
            /// <summary>
            /// 获取集合中的数量
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public long SortedSetLength(string key)
            {
                key = AddSysCustomKey(key);
                return Do(redis => redis.SortedSetLength(key));
            }
    
            #endregion 同步方法
    
            #region 异步方法
    
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            /// <param name="score"></param>
            public async Task<bool> SortedSetAddAsync<T>(string key, T value, double score)
            {
                key = AddSysCustomKey(key);
                return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson<T>(value), score));
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public async Task<bool> SortedSetRemoveAsync<T>(string key, T value)
            {
                key = AddSysCustomKey(key);
                return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value)));
            }
    
            /// <summary>
            /// 获取全部
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key)
            {
                key = AddSysCustomKey(key);
                var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
                return ConvetList<T>(values);
            }
    
            /// <summary>
            /// 获取集合中的数量
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public async Task<long> SortedSetLengthAsync(string key)
            {
                key = AddSysCustomKey(key);
                return await Do(redis => redis.SortedSetLengthAsync(key));
            }
    
            #endregion 异步方法
    
            #endregion SortedSet 有序集合
    
            #region key
    
            #region 同步
            /// <summary>
            /// 删除单个key
            /// </summary>
            /// <param name="key">redis key</param>
            /// <returns>是否删除成功</returns>
            public bool KeyDelete(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.KeyDelete(key));
            }
    
            /// <summary>
            /// 删除多个key
            /// </summary>
            /// <param name="keys">rediskey</param>
            /// <returns>成功删除的个数</returns>
            public long KeyDelete(List<string> keys)
            {
                List<string> newKeys = keys.Select(AddSysCustomKey).ToList();
                return Do(db => db.KeyDelete(ConvertRedisKeys(newKeys)));
            }
    
            /// <summary>
            /// 判断key是否存储
            /// </summary>
            /// <param name="key">redis key</param>
            /// <returns></returns>
            public bool KeyExists(string key)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.KeyExists(key));
            }
    
            /// <summary>
            /// 重新命名key
            /// </summary>
            /// <param name="key">就的redis key</param>
            /// <param name="newKey">新的redis key</param>
            /// <returns></returns>
            public bool KeyRename(string key, string newKey)
            {
                key = AddSysCustomKey(key);
                return Do(db => db.KeyRename(key, newKey));
            }
    
            /// <summary>
            /// 设置Key的时间
            /// </summary>
            /// <param name="key">redis key</param>
            /// <param name="expiry"></param>
            /// <returns></returns>
            public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                return Do(db => db.KeyExpire(key, expiry));
            }
            #endregion
    
            #region 异步
            /// <summary>
            /// 删除单个key
            /// </summary>
            /// <param name="key">redis key</param>
            /// <returns>是否删除成功</returns>
            public async Task<bool> KeyDeleteAsync(string key)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.KeyDeleteAsync(key));
            }
    
            /// <summary>
            /// 删除多个key
            /// </summary>
            /// <param name="keys">rediskey</param>
            /// <returns>成功删除的个数</returns>
            public async Task<long> KeyDeleteAsync(List<string> keys)
            {
                List<string> newKeys = keys.Select(AddSysCustomKey).ToList();
                return await Do(db => db.KeyDeleteAsync(ConvertRedisKeys(newKeys)));
            }
    
            /// <summary>
            /// 判断key是否存储
            /// </summary>
            /// <param name="key">redis key</param>
            /// <returns></returns>
            public async Task<bool> KeyExistsAsync(string key)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.KeyExistsAsync(key));
            }
    
            /// <summary>
            /// 重新命名key
            /// </summary>
            /// <param name="key">就的redis key</param>
            /// <param name="newKey">新的redis key</param>
            /// <returns></returns>
            public async Task<bool> KeyRenameAsync(string key, string newKey)
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.KeyRenameAsync(key, newKey));
            }
    
            /// <summary>
            /// 设置Key的时间
            /// </summary>
            /// <param name="key">redis key</param>
            /// <param name="expiry"></param>
            /// <returns></returns>
            public async Task<bool> KeyExpireAsync(string key, TimeSpan? expiry = default(TimeSpan?))
            {
                key = AddSysCustomKey(key);
                return await Do(db => db.KeyExpireAsync(key, expiry));
            }
            #endregion
    
            #endregion key
    
            #region 发布订阅
    
            #region 同步
    
            /// <summary>
            /// 订阅
            /// </summary>
            /// <param name="subChannel"></param>
            /// <param name="handler"></param>
            public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)
            {
                ISubscriber sub = _conn.GetSubscriber();
                sub.Subscribe(subChannel, (channel, message) =>
                {
                    if (handler == null)
                    {
                        Console.WriteLine(subChannel + " 订阅收到消息:" + message);
                    }
                    else
                    {
                        handler(channel, message);
                    }
                });
            }
    
            /// <summary>
            /// 发布
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="channel"></param>
            /// <param name="msg"></param>
            /// <returns></returns>
            public long Publish<T>(string channel, T msg)
            {
                ISubscriber sub = _conn.GetSubscriber();
                return sub.Publish(channel, ConvertJson(msg));
            }
    
            /// <summary>
            /// 取消订阅
            /// </summary>
            /// <param name="channel"></param>
            public void Unsubscribe(string channel)
            {
                ISubscriber sub = _conn.GetSubscriber();
                sub.Unsubscribe(channel);
            }
    
            /// <summary>
            /// 取消全部订阅
            /// </summary>
            public void UnsubscribeAll()
            {
                ISubscriber sub = _conn.GetSubscriber();
                sub.UnsubscribeAll();
            }
    
            #endregion 发布订阅
    
            #region 异步
    
            /// <summary>
            /// 订阅
            /// </summary>
            /// <param name="subChannel"></param>
            /// <param name="handler"></param>
            public async Task SubscribeAsync(string subChannel, Action<RedisChannel, RedisValue> handler = null)
            {
                ISubscriber sub = _conn.GetSubscriber();
                await sub.SubscribeAsync(subChannel, (channel, message) =>
                {
                    if (handler == null)
                    {
                        Console.WriteLine(subChannel + " 订阅收到消息:" + message);
                    }
                    else
                    {
                        handler(channel, message);
                    }
                });
            }
    
            /// <summary>
            /// 发布
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="channel"></param>
            /// <param name="msg"></param>
            /// <returns></returns>
            public async Task<long> PublishAsync<T>(string channel, T msg)
            {
                ISubscriber sub = _conn.GetSubscriber();
                return await sub.PublishAsync(channel, ConvertJson(msg));
            }
    
            /// <summary>
            /// 取消订阅
            /// </summary>
            /// <param name="channel"></param>
            public async Task UnsubscribeAsync(string channel)
            {
                ISubscriber sub = _conn.GetSubscriber();
                await sub.UnsubscribeAsync(channel);
            }
    
            /// <summary>
            /// 取消全部订阅
            /// </summary>
            public async Task UnsubscribeAllAsync()
            {
                ISubscriber sub = _conn.GetSubscriber();
                await sub.UnsubscribeAllAsync();
            }
    
            #endregion 发布订阅
    
            #endregion
    
            #region 其他
    
            public ITransaction CreateTransaction()
            {
                return GetDatabase().CreateTransaction();
            }
    
            public IDatabase GetDatabase()
            {
                return _conn.GetDatabase(DbNum);
            }
    
            public IServer GetServer(string hostAndPort)
            {
                return _conn.GetServer(hostAndPort);
            }
    
            /// <summary>
            /// 设置前缀
            /// </summary>
            /// <param name="customKey"></param>
            public void SetSysCustomKey(string customKey)
            {
                CustomKey = customKey;
            }
    
            #endregion 其他
    
            #region 辅助方法
    
            private string AddSysCustomKey(string oldKey)
            {
                var prefixKey = CustomKey ?? RedisConnectionHelp.SysCustomKey;
                return prefixKey + oldKey;
            }
    
            private T Do<T>(Func<IDatabase, T> func)
            {
                var database = _conn.GetDatabase(DbNum);
                return func(database);
            }
    
            private string ConvertJson<T>(T value)
            {
                string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);
                return result;
            }
    
            private T ConvertObj<T>(RedisValue value)
            {
                if (value.IsNullOrEmpty)
                    return default(T);
                return JsonConvert.DeserializeObject<T>(value);
            }
    
            private List<T> ConvetList<T>(RedisValue[] values)
            {
                List<T> result = new List<T>();
                foreach (var item in values)
                {
                    var model = ConvertObj<T>(item);
                    result.Add(model);
                }
                return result;
            }
    
            private RedisKey[] ConvertRedisKeys(List<string> redisKeys)
            {
                return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
            }
    
            /// <summary>
            /// 转化为timespan
            /// </summary>
            /// <param name="expTime">过期时间,秒</param>
            /// <returns></returns>
            public TimeSpan ToTimeSpan(double expTime)
            {
                return DateTime.Now.AddSeconds(expTime) - DateTime.Now;
            }
            #endregion 辅助方法
        }
    }
    using StackExchange.Redis;
    using System;
    using System.Collections.Concurrent;
    using System.Configuration;
    
    namespace Common
    {
        /// <summary>
        /// ConnectionMultiplexer对象管理帮助类
        /// </summary>
        public static class RedisConnectionHelp
        {
            /// <summary>
            /// 系统自定义Key前缀
            /// </summary>
            public static readonly string SysCustomKey = ConfigurationManager.AppSettings["RedisKey"] ?? "";
    
            /// <summary>
            /// 连接字符串
            /// </summary>
            private static readonly string RedisConnectionString = ConfigurationManager.AppSettings["RedisHosts"] ?? "127.0.0.1:6379";
    
            private static readonly object Locker = new object();
            private static ConnectionMultiplexer _instance;
            /// <summary>
            /// 线程安全的字典
            /// </summary>
            private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache = new ConcurrentDictionary<string, ConnectionMultiplexer>();
    
            /// <summary>
            /// 单例获取
            /// </summary>
            public static ConnectionMultiplexer Instance
            {
                get
                {
                    if (_instance == null)
                    {
                        lock (Locker)
                        {
                            if (_instance == null || !_instance.IsConnected)
                            {
                                _instance = GetManager();
                            }
                        }
                    }
                    return _instance;
                }
            }
    
            /// <summary>
            /// 缓存获取
            /// </summary>
            /// <param name="connectionString"></param>
            /// <returns></returns>
            public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString)
            {
                if (!ConnectionCache.ContainsKey(connectionString))
                {
                    ConnectionCache[connectionString] = GetManager(connectionString);
                }
                return ConnectionCache[connectionString];
            }
    
            /// <summary>
            /// 获取连接  
            /// </summary>
            /// <param name="connectionString"></param>
            /// <returns></returns>
            private static ConnectionMultiplexer GetManager(string connectionString = null)
            {
                connectionString = connectionString ?? RedisConnectionString;
                var connect = ConnectionMultiplexer.Connect(connectionString);
    
                //注册如下事件
                connect.ConnectionFailed += MuxerConnectionFailed;
                connect.ConnectionRestored += MuxerConnectionRestored;
                connect.ErrorMessage += MuxerErrorMessage;
                connect.ConfigurationChanged += MuxerConfigurationChanged;
                connect.HashSlotMoved += MuxerHashSlotMoved;
                connect.InternalError += MuxerInternalError;
                connect.ConfigurationChangedBroadcast += MuxerConfigurationChangedBroadcast;
    
                return connect;
            }
    
            #region 事件
            /// <summary>
            /// 重新配置广播时(通常意味着主从同步更改)
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConfigurationChangedBroadcast(object sender, EndPointEventArgs e)
            {
                Console.WriteLine($"{nameof(MuxerConfigurationChangedBroadcast)}: {e.EndPoint}");
            }
    
    
            /// <summary>
            /// 配置更改时
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
            {
                Console.WriteLine("Configuration changed: " + e.EndPoint);
            }
    
            /// <summary>
            /// 发生内部错误时(主要用于调试)
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
            {
                Console.WriteLine("ErrorMessage: " + e.Message);
            }
    
            /// <summary>
            /// 重新建立连接之前的错误
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
            {
                Console.WriteLine("ConnectionRestored: " + e.EndPoint);
            }
    
            /// <summary>
            /// 连接失败 , 如果重新连接成功你将不会收到这个通知
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
            {
                Console.WriteLine("重新连接: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)
            {
                Console.WriteLine("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)
            {
                Console.WriteLine("InternalError:Message" + e.Exception.Message);
            }
    
            #endregion
        }
    }
  • 相关阅读:
    Ztree
    WebAPI
    数据传输
    jqyery+ajax 提交表单
    初试 MVC+Boostrap
    CSV 导入SQL Server 中
    10-C语言循环结构(一)
    Linux测试语句(test)
    C 链表
    C递归
  • 原文地址:https://www.cnblogs.com/macT/p/11288395.html
Copyright © 2011-2022 走看看