redis的應用,RedisHelper幫助類

 2023-10-21 阅读 26 评论 0

摘要:using Newtonsoft.Json; using RedLockNet.SERedis; using RedLockNet.SERedis.Configuration; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;namespace 秒殺系統 {public class RedisHelp
using Newtonsoft.Json;
using RedLockNet.SERedis;
using RedLockNet.SERedis.Configuration;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace 秒殺系統
{public class RedisHelper{private static readonly string RedisHost = "127.0.0.1:6379";private static readonly string RedisHost1 = "127.0.0.2:6379";private static readonly string RedisPwd = "sa123456";private static readonly int RedisDbIndex = 0;private static readonly object LockObject = new object();private static ConnectionMultiplexer _connection;public static ConnectionMultiplexer Connection{get{if (_connection == null){lock (LockObject){if (_connection == null || !_connection.IsConnected){var config = new ConfigurationOptions{AbortOnConnectFail = false,ConnectRetry = 10,ConnectTimeout = 5000,SyncTimeout = 5000,EndPoints = { { RedisHost } },AllowAdmin = true,KeepAlive = 180,Password = RedisPwd};_connection = ConnectionMultiplexer.Connect(config);//注冊如下事件_connection.ConnectionFailed += MuxerConnectionFailed;_connection.ErrorMessage += MuxerErrorMessage;_connection.InternalError += MuxerInternalError;}}}return _connection;}}public static RedLockFactory redLockFactory;public static RedLockFactory RedlockFactory{get{if (redLockFactory != null) return redLockFactory;var multiplexers = new List<RedLockMultiplexer>(){Connection};var redlockFactory = RedLockFactory.Create(multiplexers);return redlockFactory;}}/// <summary>/// 獲取redis的DB/// </summary>/// <returns></returns>private static IDatabase GetDatabase(){if (Connection == null || !Connection.IsConnected){throw new Exception("redis連接有誤");}return Connection.GetDatabase(RedisDbIndex);}#region 記錄redis的連接日志/// <summary>/// 連接失敗 , 如果重新連接成功你將不會收到這個通知/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e){}/// <summary>/// redis類庫錯誤/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private static void MuxerInternalError(object sender, InternalErrorEventArgs e){}/// <summary>/// 發生錯誤時/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e){}#endregion 記錄redis的連接日志#region String#region 同步方法/// <summary>/// 保存單個key value/// </summary>/// <param name="key">Redis Key</param>/// <param name="value">保存的值</param>/// <param name="secondTimeout">過期時間</param>/// <returns></returns>public static bool StringSet(string key, string value, int secondTimeout){return Do(db => db.StringSet(key, value, TimeSpan.FromSeconds(secondTimeout)));}/// <summary>/// 保存多個key value/// </summary>/// <param name="keyValues">鍵值對</param>/// <returns></returns>public static bool StringSet(List<KeyValuePair<RedisKey, RedisValue>> keyValues){List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(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="secondTimeout"></param>/// <returns></returns>public static bool StringSet<T>(string key, T obj, int secondTimeout){var json = ConvertJson(obj);return Do(db => db.StringSet(key, json, TimeSpan.FromSeconds(secondTimeout)));}/// <summary>/// 獲取單個key的值/// </summary>/// <param name="key">Redis Key</param>/// <returns></returns>public static string StringGet(string key){return Do(db => db.StringGet(key));}/// <summary>/// 獲取一個key的對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static T StringGet<T>(string key){return Do(db => ConvertObj<T>(db.StringGet(key)));}/// <summary>/// 為數字增長val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>增長后的值</returns>public static long StringIncrement(string key, long val = 1){return Do(db => db.StringIncrement(key, val));}/// <summary>/// 為數字減少val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>減少后的值</returns>public static long StringDecrement(string key, long val = 1){return Do(db => db.StringDecrement(key, val));}/// <summary>/// 為數字增長val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>增長后的值</returns>public static double StringIncrement(string key, double val = 1){return Do(db => db.StringIncrement(key, val));}/// <summary>/// 為數字減少val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>減少后的值</returns>public static double StringDecrement(string key, double val = 1){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="secondTimeout">過期時間</param>/// <returns></returns>public static async Task<bool> StringSetAsync(string key, string value, int secondTimeout){return await Do(db => db.StringSetAsync(key, value, TimeSpan.FromSeconds(secondTimeout)));}/// <summary>/// 保存多個key value/// </summary>/// <param name="keyValues">鍵值對</param>/// <returns></returns>public static async Task<bool> StringSetAsync(List<KeyValuePair<RedisKey, RedisValue>> keyValues){List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(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="secondTimeout"></param>/// <returns></returns>public static async Task<bool> StringSetAsync<T>(string key, T obj, int secondTimeout){string json = ConvertJson(obj);return await Do(db => db.StringSetAsync(key, json, TimeSpan.FromSeconds(secondTimeout)));}/// <summary>/// 獲取單個key的值/// </summary>/// <param name="key">Redis Key</param>/// <returns></returns>public static async Task<string> StringGetAsync(string key){return await Do(db => db.StringGetAsync(key));}/// <summary>/// 獲取一個key的對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static async Task<T> StringGetAsync<T>(string 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 static async Task<long> StringIncrementAsync(string key, long val = 1){return await Do(db => db.StringIncrementAsync(key, val));}/// <summary>/// 為數字減少val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>減少后的值</returns>public static async Task<long> StringDecrementAsync(string key, long val = 1){return await Do(db => db.StringDecrementAsync(key, val));}/// <summary>/// 為數字增長val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>增長后的值</returns>public static async Task<double> StringIncrementAsync(string key, double val = 1){return await Do(db => db.StringIncrementAsync(key, val));}/// <summary>/// 為數字減少val/// </summary>/// <param name="key"></param>/// <param name="val">可以為負</param>/// <returns>減少后的值</returns>public static async Task<double> StringDecrementAsync(string key, double val = 1){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 static bool HashExists(string key, string dataKey){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 static bool HashSet<T>(string key, string dataKey, T t){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 static bool HashDel(string key, string dataKey){return Do(db => db.HashDelete(key, dataKey));}/// <summary>/// 移除hash中的多個值/// </summary>/// <param name="key"></param>/// <param name="dataKeys"></param>/// <returns></returns>public static long HashDel(string key, List<RedisValue> dataKeys){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 static T HashGet<T>(string key, string dataKey){return Do(db =>{if (!HashExists(key, dataKey)) return default(T);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 static double HashIncrement(string key, string dataKey, double val = 1){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 static double HashDecrement(string key, string dataKey, double val = 1){return Do(db => db.HashDecrement(key, dataKey, val));}/// <summary>/// 獲取hashkey所有Redis key/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static List<T> HashKeys<T>(string key){return Do(db =>{RedisValue[] values = db.HashKeys(key);return ConvetList<T>(values);});}/// <summary>/// 獲取hashkey所有Redis key/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public static List<T> HashGetAll<T>(string key){var values = Do(db => db.HashGetAll(key));return ConvetList<T>(values);}#endregion 同步方法#region 異步方法/// <summary>/// 判斷某個數據是否已經被緩存/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <returns></returns>public static async Task<bool> HashExistsAsync(string key, string dataKey){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 static async Task<bool> HashSetAsync<T>(string key, string dataKey, T t){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 static async Task<bool> HashDelAsync(string key, string dataKey){return await Do(db => db.HashDeleteAsync(key, dataKey));}/// <summary>/// 移除hash中的多個值/// </summary>/// <param name="key"></param>/// <param name="dataKeys"></param>/// <returns></returns>public static async Task<long> HashDelAsync(string key, List<RedisValue> dataKeys){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 static async Task<T> HashGeAsync<T>(string key, string dataKey){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 static async Task<double> HashIncrementAsync(string key, string dataKey, double val = 1){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 static async Task<long> HashDecrementAsync(string key, string dataKey, long val = 1){return await Do(db => db.HashDecrementAsync(key, dataKey, val));}/// <summary>/// 為數字增長val/// </summary>/// <param name="key"></param>/// <param name="dataKey"></param>/// <param name="val">可以為負</param>/// <returns>增長后的值</returns>public static async Task<long> HashIncrementAsync(string key, string dataKey, long val = 1){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 static async Task<double> HashDecrementAsync(string key, string dataKey, double val = 1){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 static async Task<List<T>> HashKeysAsync<T>(string key){RedisValue[] values = await Do(db => db.HashKeysAsync(key));return ConvetList<T>(values);}/// <summary>/// 獲取hashkey所有Redis key/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static async Task<List<T>> HashGetAllAsync<T>(string key){var values = await Do(db => db.HashGetAllAsync(key));return ConvetList<T>(values);}#endregion 異步方法#endregion Hash#region List#region 同步方法/// <summary>/// 移除指定ListId的內部List的值/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static void ListRemove<T>(string key, T value){Do(db => db.ListRemove(key, ConvertJson(value)));}/// <summary>/// 獲取指定key的List/// </summary>/// <param name="key"></param>/// <returns></returns>public static List<T> ListRange<T>(string key){return Do(redis =>{var values = redis.ListRange(key);return ConvetList<T>(values);});}/// <summary>/// 入隊/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static void ListRightPush<T>(string key, T value){Do(db => db.ListRightPush(key, ConvertJson(value)));}/// <summary>/// 出隊/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static T ListRightPop<T>(string 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 static void ListLeftPush<T>(string key, T value){Do(db => db.ListLeftPush(key, ConvertJson(value)));}/// <summary>/// 出棧/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static T ListLeftPop<T>(string key){return Do(db =>{var value = db.ListLeftPop(key);return ConvertObj<T>(value);});}/// <summary>/// 獲取集合中的數量/// </summary>/// <param name="key"></param>/// <returns></returns>public static long ListLength(string key){return Do(redis => redis.ListLength(key));}#endregion 同步方法#region 異步方法/// <summary>/// 移除指定ListId的內部List的值/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static async Task<long> ListRemoveAsync<T>(string key, T value){return await Do(db => db.ListRemoveAsync(key, ConvertJson(value)));}/// <summary>/// 獲取指定key的List/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<List<T>> ListRangeAsync<T>(string key){var values = await Do(redis => redis.ListRangeAsync(key));return ConvetList<T>(values);}/// <summary>/// 入隊/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static async Task<long> ListRightPushAsync<T>(string key, T value){return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));}/// <summary>/// 出隊/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static async Task<T> ListRightPopAsync<T>(string 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 static async Task<long> ListLeftPushAsync<T>(string key, T value){return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));}/// <summary>/// 出棧/// </summary>/// <typeparam name="T"></typeparam>/// <param name="key"></param>/// <returns></returns>public static async Task<T> ListLeftPopAsync<T>(string key){var value = await Do(db => db.ListLeftPopAsync(key));return ConvertObj<T>(value);}/// <summary>/// 獲取集合中的數量/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<long> ListLengthAsync(string 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 static bool SortedSetAdd<T>(string key, T value, double score){return Do(redis => redis.SortedSetAdd(key, ConvertJson<T>(value), score));}/// <summary>/// 刪除/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static bool SortedSetRemove<T>(string key, T value){return Do(redis => redis.SortedSetRemove(key, ConvertJson(value)));}/// <summary>/// 獲取全部/// </summary>/// <param name="key"></param>/// <returns></returns>public static List<T> SortedSetRangeByRank<T>(string key){return Do(redis =>{var values = redis.SortedSetRangeByRank(key);return ConvetList<T>(values);});}/// <summary>/// 獲取集合中的數量/// </summary>/// <param name="key"></param>/// <returns></returns>public static long SortedSetLength(string key){return Do(redis => redis.SortedSetLength(key));}#endregion 同步方法#region 異步方法/// <summary>/// 添加/// </summary>/// <param name="key"></param>/// <param name="value"></param>/// <param name="score"></param>public static async Task<bool> SortedSetAddAsync<T>(string key, T value, double score){return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson<T>(value), score));}/// <summary>/// 刪除/// </summary>/// <param name="key"></param>/// <param name="value"></param>public static async Task<bool> SortedSetRemoveAsync<T>(string key, T value){return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value)));}/// <summary>/// 獲取全部/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<List<T>> SortedSetRangeByRankAsync<T>(string key){var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));return ConvetList<T>(values);}/// <summary>/// 獲取集合中的數量/// </summary>/// <param name="key"></param>/// <returns></returns>public static async Task<long> SortedSetLengthAsync(string key){return await Do(redis => redis.SortedSetLengthAsync(key));}#endregion 異步方法#endregion SortedSet 有序集合#region key/// <summary>/// 刪除單個key/// </summary>/// <param name="key">redis key</param>/// <returns>是否刪除成功</returns>public static bool KeyDel(string key){return Do(db => db.KeyDelete(key));}/// <summary>/// 刪除多個key/// </summary>/// <param name="keys">rediskey</param>/// <returns>成功刪除的個數</returns>public static long KeyDel(List<string> keys){return Do(db => db.KeyDelete(ConvertRedisKeys(keys)));}/// <summary>/// 判斷key是否存儲/// </summary>/// <param name="key">redis key</param>/// <returns></returns>public static bool KeyExists(string key){return Do(db => db.KeyExists(key));}/// <summary>/// 設置Key的時間/// </summary>/// <param name="key">redis key</param>/// <param name="secondTimeout"></param>/// <returns></returns>public static bool KeyExpire(string key, int secondTimeout){return Do(db => db.KeyExpire(key, TimeSpan.FromSeconds(secondTimeout)));}#endregion key#region 輔助方法private static T Do<T>(Func<IDatabase, T> func){try{var database = GetDatabase();return func(database);}catch (Exception ex){return default(T);}}private static string ConvertJson<T>(T value){string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);return result;}private static T ConvertObj<T>(RedisValue value){if (value.IsNullOrEmpty){return default(T);}return JsonConvert.DeserializeObject<T>(value.ToString());}private static 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 static RedisKey[] ConvertRedisKeys(List<string> redisKeys){return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();}private static List<T> ConvetList<T>(HashEntry[] values){List<T> result = new List<T>();foreach (var item in values){if (!item.Value.IsNullOrEmpty){var model = ConvertObj<T>(item.Value);result.Add(model);}}return result;}#endregion 輔助方法public static IBatch CreateBatch(){return GetDatabase().CreateBatch();}public static ITransaction CreateTransaction(){return GetDatabase().CreateTransaction();}//使用Keys *模糊匹配Keypublic static List<string> GetMatchKeys(string key){var result = (string[])GetDatabase().ScriptEvaluate(LuaScript.Prepare("return redis.call('KEYS',@keypattern)"), new { keypattern = key });return result.ToList();}//使用SCAN模糊匹配Keypublic static List<string> ScanMatchKeys(string key){var result = (string[])GetDatabase().ScriptEvaluate(LuaScript.Prepare("local dbsize=redis.call('dbsize') local res=redis.call('scan',0,'match',KEYS[1],'count',dbsize) return res[2]"),new RedisKey[] { key });return result.ToList();}}
}

?

轉載于:https://www.cnblogs.com/yxlblogs/p/9134554.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/155079.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息