|
@@ -2,10 +2,11 @@
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Threading.Tasks;
|
|
|
+using Masuit.Tools.Core.NoSQL;
|
|
|
using Newtonsoft.Json;
|
|
|
using StackExchange.Redis;
|
|
|
|
|
|
-namespace Masuit.Tools.Core.NoSQL
|
|
|
+namespace Masuit.Tools.NoSQL
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// Redis操作
|
|
@@ -14,15 +15,49 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
{
|
|
|
private int DbNum { get; }
|
|
|
private readonly ConnectionMultiplexer _conn;
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 自定义键
|
|
|
/// </summary>
|
|
|
public string CustomKey;
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 连接失败 , 如果重新连接成功你将不会收到这个通知
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<ConnectionFailedEventArgs> ConnectionFailed;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 重新建立连接之前的错误
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<ConnectionFailedEventArgs> ConnectionRestored;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 发生错误时
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<RedisErrorEventArgs> ErrorMessage;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 配置更改时
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<EndPointEventArgs> ConfigurationChanged;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 更改集群时
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<HashSlotMovedEventArgs> HashSlotMoved;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// redis类库错误时
|
|
|
+ /// </summary>
|
|
|
+ public event EventHandler<InternalErrorEventArgs> InternalError;
|
|
|
+
|
|
|
#region 构造函数
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 构造函数,使用该构造函数需要先配置链接字符串,连接字符串通过RedisConnectionHelp.RedisConnectionString属性进行获取,若未正确配置,将按默认值“127.0.0.1:6379,allowadmin=true”进行操作<br/>
|
|
|
+ /// 构造函数,使用该构造函数需要先在config中配置链接字符串,连接字符串在config配置文件中的ConnectionStrings节下配置,name固定为RedisHosts,值的格式:127.0.0.1:6379,allowadmin=true,若未正确配置,将按默认值“127.0.0.1:6379,allowadmin=true”进行操作,如:<br/>
|
|
|
+ /// <connectionStrings><br/>
|
|
|
+ /// <add name = "RedisHosts" connectionString="127.0.0.1:6379,allowadmin=true"/><br/>
|
|
|
+ /// </connectionStrings>
|
|
|
/// </summary>
|
|
|
/// <param name="dbNum">数据库编号</param>
|
|
|
public RedisHelper(int dbNum = 0) : this(dbNum, null)
|
|
@@ -34,10 +69,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// </summary>
|
|
|
/// <param name="dbNum">数据库的编号</param>
|
|
|
/// <param name="readWriteHosts">Redis服务器连接字符串,格式:127.0.0.1:6379,allowadmin=true</param>
|
|
|
- public RedisHelper(int dbNum, string readWriteHosts)
|
|
|
+ public RedisHelper(int dbNum = 0, string readWriteHosts = "127.0.0.1:6379,allowadmin=true")
|
|
|
{
|
|
|
DbNum = dbNum;
|
|
|
- _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionHelp.Instance : RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
|
|
|
+ _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? RedisConnectionManager.Instance : RedisConnectionManager.GetConnectionMultiplexer(readWriteHosts);
|
|
|
+ _conn.ConfigurationChanged += ConfigurationChanged;
|
|
|
+ _conn.ConnectionFailed += ConnectionFailed;
|
|
|
+ _conn.ConnectionRestored += ConnectionRestored;
|
|
|
+ _conn.ErrorMessage += ErrorMessage;
|
|
|
+ _conn.HashSlotMoved += HashSlotMoved;
|
|
|
+ _conn.InternalError += InternalError;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -113,8 +154,12 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>值</returns>
|
|
|
public string GetString(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(db => db.StringGet(key));
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(db => db.StringGet(key));
|
|
|
+ }
|
|
|
+ return string.Empty;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -136,8 +181,12 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>实例对象</returns>
|
|
|
public T GetString<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(db => ConvertObj<T>(db.StringGet(key)));
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(db => ConvertObj<T>(db.StringGet(key)));
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -215,8 +264,12 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>值</returns>
|
|
|
public async Task<string> GetStringAsync(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return await Do(db => db.StringGetAsync(key));
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return await Do(db => db.StringGetAsync(key));
|
|
|
+ }
|
|
|
+ return string.Empty;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -238,9 +291,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>实例对象</returns>
|
|
|
public async Task<T> GetStringAsync<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- string result = await Do(db => db.StringGetAsync(key));
|
|
|
- return ConvertObj<T>(result);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ string result = await Do(db => db.StringGetAsync(key));
|
|
|
+ return ConvertObj<T>(result);
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -339,12 +396,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>对象实例</returns>
|
|
|
public T GetHash<T>(string key, string dataKey)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(db =>
|
|
|
+ if (KeyExists(key))
|
|
|
{
|
|
|
- string value = db.HashGet(key, dataKey);
|
|
|
- return ConvertObj<T>(value);
|
|
|
- });
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(db =>
|
|
|
+ {
|
|
|
+ string value = db.HashGet(key, dataKey);
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -456,9 +517,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>对象实例</returns>
|
|
|
public async Task<T> GetHashAsync<T>(string key, string dataKey)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- string value = await Do(db => db.HashGetAsync(key, dataKey));
|
|
|
- return ConvertObj<T>(value);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ string value = await Do(db => db.HashGetAsync(key, dataKey));
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -528,12 +593,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>数据集</returns>
|
|
|
public List<T> ListRange<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(redis =>
|
|
|
+ if (KeyExists(key))
|
|
|
{
|
|
|
- var values = redis.ListRange(key);
|
|
|
- return ConvetList<T>(values);
|
|
|
- });
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(redis =>
|
|
|
+ {
|
|
|
+ var values = redis.ListRange(key);
|
|
|
+ return ConvetList<T>(values);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return new List<T>();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -556,12 +625,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>值</returns>
|
|
|
public T ListRightPop<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(db =>
|
|
|
- {
|
|
|
- var value = db.ListRightPop(key);
|
|
|
- return ConvertObj<T>(value);
|
|
|
- });
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(db =>
|
|
|
+ {
|
|
|
+ var value = db.ListRightPop(key);
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -584,12 +657,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>对象实例</returns>
|
|
|
public T ListLeftPop<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(db =>
|
|
|
+ if (KeyExists(key))
|
|
|
{
|
|
|
- var value = db.ListLeftPop(key);
|
|
|
- return ConvertObj<T>(value);
|
|
|
- });
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(db =>
|
|
|
+ {
|
|
|
+ var value = db.ListLeftPop(key);
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -626,9 +703,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <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);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ var values = await Do(redis => redis.ListRangeAsync(key));
|
|
|
+ return ConvetList<T>(values);
|
|
|
+ }
|
|
|
+ return new List<T>();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -651,9 +732,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <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);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ var value = await Do(db => db.ListRightPopAsync(key));
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -676,9 +761,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <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);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ var value = await Do(db => db.ListLeftPopAsync(key));
|
|
|
+ return ConvertObj<T>(value);
|
|
|
+ }
|
|
|
+ return default(T);
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -730,12 +819,16 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <returns>数据集合</returns>
|
|
|
public List<T> SetRangeSortedByRank<T>(string key)
|
|
|
{
|
|
|
- key = AddSysCustomKey(key);
|
|
|
- return Do(redis =>
|
|
|
+ if (KeyExists(key))
|
|
|
{
|
|
|
- var values = redis.SortedSetRangeByRank(key);
|
|
|
- return ConvetList<T>(values);
|
|
|
- });
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ return Do(redis =>
|
|
|
+ {
|
|
|
+ var values = redis.SortedSetRangeByRank(key);
|
|
|
+ return ConvetList<T>(values);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return new List<T>();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -783,9 +876,13 @@ namespace Masuit.Tools.Core.NoSQL
|
|
|
/// <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);
|
|
|
+ if (KeyExists(key))
|
|
|
+ {
|
|
|
+ key = AddSysCustomKey(key);
|
|
|
+ var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
|
|
|
+ return ConvetList<T>(values);
|
|
|
+ }
|
|
|
+ return new List<T>();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|