usingNewtonsoft.Json;usingStackExchange.Redis;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;usingSystem.Web;namespaceRedisTest.RedisCommon
{public classRedisHelper
{private int DbNum { get; }private readonlyConnectionMultiplexer _conn;public stringCustomKey;#region 构造函数
public RedisHelper(int dbNum = 0)
:this(dbNum, null)
{
}public RedisHelper(int dbNum, stringreadWriteHosts)
{
DbNum=dbNum;
_conn=
string.IsNullOrWhiteSpace(readWriteHosts) ?RedisConnectionHelp.Instance :
RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
}#endregion
#region 辅助方法
private string AddSysCustomKey(stringoldKey)
{var prefixKey = CustomKey ??RedisConnectionHelp.SysCustomKey;return prefixKey +oldKey;
}private T Do(Funcfunc)
{var database =_conn.GetDatabase(DbNum);returnfunc(database);
}private string ConvertJson(T value)
{string result = value is string ?value.ToString() : JsonConvert.SerializeObject(value);returnresult;
}private T ConvertObj(RedisValue value)
{return JsonConvert.DeserializeObject(value);
}private List ConvetList(RedisValue[] values)
{
List result = new List();foreach (var item invalues)
{var model = ConvertObj(item);
result.Add(model);
}returnresult;
}private RedisKey[] ConvertRedisKeys(ListredisKeys)
{return redisKeys.Select(redisKey =>(RedisKey)redisKey).ToArray();
}#endregion 辅助方法
#region String
#region 同步方法
///
///保存单个key value///
/// Redis Key
/// 保存的值
/// 过期时间
///
public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
{
key=AddSysCustomKey(key);return Do(db =>db.StringSet(key, value, expiry));
}///
///保存多个key value///
/// 键值对
///
public bool StringSet(List>keyValues)
{
List> newkeyValues =keyValues.Select(p=> new KeyValuePair(AddSysCustomKey(p.Key), p.Value)).ToList();return Do(db =>db.StringSet(newkeyValues.ToArray()));
}///
///保存一个对象///
///
///
///
///
///
public bool StringSet(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
{
key=AddSysCustomKey(key);string json =ConvertJson(obj);return Do(db =>db.StringSet(key, json, expiry));
}///
///获取单个key的值///
/// Redis Key
///
public string StringGet(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>db.StringGet(key));
}///
///获取多个Key///
/// Redis Key集合
///
public RedisValue[] StringGet(ListlistKey)
{
List newKeys =listKey.Select(AddSysCustomKey).ToList();return Do(db =>db.StringGet(ConvertRedisKeys(newKeys)));
}///
///获取一个key的对象///
///
///
///
public T StringGet(stringkey)
{
key=AddSysCustomKey(key);return Do(db => ConvertObj(db.StringGet(key)));
}///
///为数字增长val///
///
/// 可以为负
/// 增长后的值
public double StringIncrement(string key, double val = 1)
{
key=AddSysCustomKey(key);return Do(db =>db.StringIncrement(key, val));
}///
///为数字减少val///
///
/// 可以为负
/// 减少后的值
public double StringDecrement(string key, double val = 1)
{
key=AddSysCustomKey(key);return Do(db =>db.StringDecrement(key, val));
}#endregion 同步方法
#region 异步方法
///
///保存单个key value///
/// Redis Key
/// 保存的值
/// 过期时间
///
public async Task StringSetAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))
{
key=AddSysCustomKey(key);return await Do(db =>db.StringSetAsync(key, value, expiry));
}///
///保存多个key value///
/// 键值对
///
public async Task StringSetAsync(List>keyValues)
{
List> newkeyValues =keyValues.Select(p=> new KeyValuePair(AddSysCustomKey(p.Key), p.Value)).ToList();return await Do(db =>db.StringSetAsync(newkeyValues.ToArray()));
}///
///保存一个对象///
///
///
///
///
///
public async Task StringSetAsync(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
{
key=AddSysCustomKey(key);string json =ConvertJson(obj);return await Do(db =>db.StringSetAsync(key, json, expiry));
}///
///获取单个key的值///
/// Redis Key
///
public async Task StringGetAsync(stringkey)
{
key=AddSysCustomKey(key);return await Do(db =>db.StringGetAsync(key));
}///
///获取多个Key///
/// Redis Key集合
///
public async Task StringGetAsync(ListlistKey)
{
List newKeys =listKey.Select(AddSysCustomKey).ToList();return await Do(db =>db.StringGetAsync(ConvertRedisKeys(newKeys)));
}///
///获取一个key的对象///
///
///
///
public async Task StringGetAsync(stringkey)
{
key=AddSysCustomKey(key);string result = await Do(db =>db.StringGetAsync(key));return ConvertObj(result);
}///
///为数字增长val///
///
/// 可以为负
/// 增长后的值
public async Task StringIncrementAsync(string key, double val = 1)
{
key=AddSysCustomKey(key);return await Do(db =>db.StringIncrementAsync(key, val));
}///
///为数字减少val///
///
/// 可以为负
/// 减少后的值
public async Task StringDecrementAsync(string key, double val = 1)
{
key=AddSysCustomKey(key);return await Do(db =>db.StringDecrementAsync(key, val));
}#endregion 异步方法
#endregion String
#region List
#region 同步方法
///
///移除指定ListId的内部List的值///
///
///
public void ListRemove(stringkey, T value)
{
key=AddSysCustomKey(key);
Do(db=>db.ListRemove(key, ConvertJson(value)));
}///
///获取指定key的List///
///
///
public List ListRange(stringkey)
{
key=AddSysCustomKey(key);return Do(redis =>{var values =redis.ListRange(key);return ConvetList(values);
});
}///
///入队///
///
///
public void ListRightPush(stringkey, T value)
{
key=AddSysCustomKey(key);
Do(db=>db.ListRightPush(key, ConvertJson(value)));
}///
///出队///
///
///
///
public T ListRightPop(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>{var value =db.ListRightPop(key);return ConvertObj(value);
});
}///
///入栈///
///
///
///
public void ListLeftPush(stringkey, T value)
{
key=AddSysCustomKey(key);
Do(db=>db.ListLeftPush(key, ConvertJson(value)));
}///
///出栈///
///
///
///
public T ListLeftPop(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>{var value =db.ListLeftPop(key);return ConvertObj(value);
});
}///
///获取集合中的数量///
///
///
public long ListLength(stringkey)
{
key=AddSysCustomKey(key);return Do(redis =>redis.ListLength(key));
}#endregion 同步方法
#region 异步方法
///
///移除指定ListId的内部List的值///
///
///
public async Task ListRemoveAsync(stringkey, T value)
{
key=AddSysCustomKey(key);return await Do(db =>db.ListRemoveAsync(key, ConvertJson(value)));
}///
///获取指定key的List///
///
///
public async Task> ListRangeAsync(stringkey)
{
key=AddSysCustomKey(key);var values = await Do(redis =>redis.ListRangeAsync(key));return ConvetList(values);
}///
///入队///
///
///
public async Task ListRightPushAsync(stringkey, T value)
{
key=AddSysCustomKey(key);return await Do(db =>db.ListRightPushAsync(key, ConvertJson(value)));
}///
///出队///
///
///
///
public async Task ListRightPopAsync(stringkey)
{
key=AddSysCustomKey(key);var value = await Do(db =>db.ListRightPopAsync(key));return ConvertObj(value);
}///
///入栈///
///
///
///
public async Task ListLeftPushAsync(stringkey, T value)
{
key=AddSysCustomKey(key);return await Do(db =>db.ListLeftPushAsync(key, ConvertJson(value)));
}///
///出栈///
///
///
///
public async Task ListLeftPopAsync(stringkey)
{
key=AddSysCustomKey(key);var value = await Do(db =>db.ListLeftPopAsync(key));return ConvertObj(value);
}///
///获取集合中的数量///
///
///
public async Task ListLengthAsync(stringkey)
{
key=AddSysCustomKey(key);return await Do(redis =>redis.ListLengthAsync(key));
}#endregion 异步方法
#endregion List
#region Hash
#region 同步方法
///
///判断某个数据是否已经被缓存///
///
///
///
public bool HashExists(string key, stringdataKey)
{
key=AddSysCustomKey(key);return Do(db =>db.HashExists(key, dataKey));
}///
///存储数据到hash表///
///
///
///
///
///
public bool HashSet(string key, stringdataKey, T t)
{
key=AddSysCustomKey(key);return Do(db =>{string json =ConvertJson(t);returndb.HashSet(key, dataKey, json);
});
}///
///移除hash中的某值///
///
///
///
public bool HashDelete(string key, stringdataKey)
{
key=AddSysCustomKey(key);return Do(db =>db.HashDelete(key, dataKey));
}///
///移除hash中的多个值///
///
///
///
public long HashDelete(string key, ListdataKeys)
{
key=AddSysCustomKey(key);//List dataKeys1 = new List() {"1","2"};
return Do(db =>db.HashDelete(key, dataKeys.ToArray()));
}///
///从hash表获取数据///
///
///
///
///
public T HashGet(string key, stringdataKey)
{
key=AddSysCustomKey(key);return Do(db =>{string value =db.HashGet(key, dataKey);return ConvertObj(value);
});
}///
///为数字增长val///
///
///
/// 可以为负
/// 增长后的值
public double HashIncrement(string key, string dataKey, double val = 1)
{
key=AddSysCustomKey(key);return Do(db =>db.HashIncrement(key, dataKey, val));
}///
///为数字减少val///
///
///
/// 可以为负
/// 减少后的值
public double HashDecrement(string key, string dataKey, double val = 1)
{
key=AddSysCustomKey(key);return Do(db =>db.HashDecrement(key, dataKey, val));
}///
///获取hashkey所有Redis key///
///
///
///
public List HashKeys(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>{
RedisValue[] values=db.HashKeys(key);return ConvetList(values);
});
}#endregion 同步方法
#region 异步方法
///
///判断某个数据是否已经被缓存///
///
///
///
public async Task HashExistsAsync(string key, stringdataKey)
{
key=AddSysCustomKey(key);return await Do(db =>db.HashExistsAsync(key, dataKey));
}///
///存储数据到hash表///
///
///
///
///
///
public async Task HashSetAsync(string key, stringdataKey, T t)
{
key=AddSysCustomKey(key);return await Do(db =>{string json =ConvertJson(t);returndb.HashSetAsync(key, dataKey, json);
});
}///
///移除hash中的某值///
///
///
///
public async Task HashDeleteAsync(string key, stringdataKey)
{
key=AddSysCustomKey(key);return await Do(db =>db.HashDeleteAsync(key, dataKey));
}///
///移除hash中的多个值///
///
///
///
public async Task HashDeleteAsync(string key, ListdataKeys)
{
key=AddSysCustomKey(key);//List dataKeys1 = new List() {"1","2"};
return await Do(db =>db.HashDeleteAsync(key, dataKeys.ToArray()));
}///
///从hash表获取数据///
///
///
///
///
public async Task HashGeAsync(string key, stringdataKey)
{
key=AddSysCustomKey(key);string value = await Do(db =>db.HashGetAsync(key, dataKey));return ConvertObj(value);
}///
///为数字增长val///
///
///
/// 可以为负
/// 增长后的值
public async Task HashIncrementAsync(string key, string dataKey, double val = 1)
{
key=AddSysCustomKey(key);return await Do(db =>db.HashIncrementAsync(key, dataKey, val));
}///
///为数字减少val///
///
///
/// 可以为负
/// 减少后的值
public async Task HashDecrementAsync(string key, string dataKey, double val = 1)
{
key=AddSysCustomKey(key);return await Do(db =>db.HashDecrementAsync(key, dataKey, val));
}///
///获取hashkey所有Redis key///
///
///
///
public async Task> HashKeysAsync(stringkey)
{
key=AddSysCustomKey(key);
RedisValue[] values= await Do(db =>db.HashKeysAsync(key));return ConvetList(values);
}#endregion 异步方法
#endregion Hash
#region SortedSet 有序集合
#region 同步方法
///
///添加///
///
///
///
public bool SortedSetAdd(string key, T value, doublescore)
{
key=AddSysCustomKey(key);return Do(redis => redis.SortedSetAdd(key, ConvertJson(value), score));
}///
///删除///
///
///
public bool SortedSetRemove(stringkey, T value)
{
key=AddSysCustomKey(key);return Do(redis =>redis.SortedSetRemove(key, ConvertJson(value)));
}///
///获取全部///
///
///
public List SortedSetRangeByRank(stringkey)
{
key=AddSysCustomKey(key);return Do(redis =>{var values =redis.SortedSetRangeByRank(key);return ConvetList(values);
});
}///
///获取集合中的数量///
///
///
public long SortedSetLength(stringkey)
{
key=AddSysCustomKey(key);return Do(redis =>redis.SortedSetLength(key));
}#endregion 同步方法
#region 异步方法
///
///添加///
///
///
///
public async Task SortedSetAddAsync(string key, T value, doublescore)
{
key=AddSysCustomKey(key);return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson(value), score));
}///
///删除///
///
///
public async Task SortedSetRemoveAsync(stringkey, T value)
{
key=AddSysCustomKey(key);return await Do(redis =>redis.SortedSetRemoveAsync(key, ConvertJson(value)));
}///
///获取全部///
///
///
public async Task> SortedSetRangeByRankAsync(stringkey)
{
key=AddSysCustomKey(key);var values = await Do(redis =>redis.SortedSetRangeByRankAsync(key));return ConvetList(values);
}///
///获取集合中的数量///
///
///
public async Task SortedSetLengthAsync(stringkey)
{
key=AddSysCustomKey(key);return await Do(redis =>redis.SortedSetLengthAsync(key));
}#endregion 异步方法
#endregion SortedSet 有序集合
#region key
///
///删除单个key///
/// redis key
/// 是否删除成功
public bool KeyDelete(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>db.KeyDelete(key));
}///
///删除多个key///
/// rediskey
/// 成功删除的个数
public long KeyDelete(Listkeys)
{
List newKeys =keys.Select(AddSysCustomKey).ToList();return Do(db =>db.KeyDelete(ConvertRedisKeys(newKeys)));
}///
///判断key是否存储///
/// redis key
///
public bool KeyExists(stringkey)
{
key=AddSysCustomKey(key);return Do(db =>db.KeyExists(key));
}///
///重新命名key///
/// 就的redis key
/// 新的redis key
///
public bool KeyRename(string key, stringnewKey)
{
key=AddSysCustomKey(key);return Do(db =>db.KeyRename(key, newKey));
}///
///设置Key的时间///
/// redis key
///
///
public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))
{
key=AddSysCustomKey(key);return Do(db =>db.KeyExpire(key, expiry));
}#endregion key
#region 发布订阅
///
///Redis发布订阅 订阅///
///
///
public void Subscribe(string subChannel, Action handler = null)
{
ISubscriber sub=_conn.GetSubscriber();
sub.Subscribe(subChannel, (channel, message)=>{if (handler == null)
{
Console.WriteLine(subChannel+ "订阅收到消息:" +message);
}else{
handler(channel, message);
}
});
}///
///Redis发布订阅 发布///
///
///
///
///
public long Publish(stringchannel, T msg)
{
ISubscriber sub=_conn.GetSubscriber();returnsub.Publish(channel, ConvertJson(msg));
}///
///Redis发布订阅 取消订阅///
///
public void Unsubscribe(stringchannel)
{
ISubscriber sub=_conn.GetSubscriber();
sub.Unsubscribe(channel);
}///
///Redis发布订阅 取消全部订阅///
public voidUnsubscribeAll()
{
ISubscriber sub=_conn.GetSubscriber();
sub.UnsubscribeAll();
}#endregion 发布订阅
#region 其他
publicITransaction CreateTransaction()
{returnGetDatabase().CreateTransaction();
}publicIDatabase GetDatabase()
{return_conn.GetDatabase(DbNum);
}public IServer GetServer(stringhostAndPort)
{return_conn.GetServer(hostAndPort);
}///
///设置前缀///
///
public void SetSysCustomKey(stringcustomKey)
{
CustomKey=customKey;
}#endregion 其他}
}