using Newtonsoft.Json;
using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
namespace CP.Common.redis
{
public class RedisHelper : IDisposable
{
private static RedisClient redisCli = null;
///
/// 建立连接
///
/// redis配置节点
public static void CreateClient(string redisConfig, bool isAuto = false)
{
var json = string.Empty;
if (!isAuto)
json = ConfigurationManager.AppSettings["ReidsConfig"]?.ToString().Trim() ?? "";
else
json = ConfigurationManager.AppSettings[redisConfig]?.ToString().Trim() ?? "";
if (string.IsNullOrEmpty(json))
throw new Exception("初始化redis失败:未找到配置节点");
RedisConfig config = null;
try
{
config = JsonConvert.DeserializeObject(json);
}
catch (Exception ex)
{
throw new Exception("初始化redis失败:配置节点json数据格式错误。" + ex.Message);
}
if (redisCli == null)
{
try
{
redisCli = new RedisClient(config.host, config.port, config.password, config.db);
}
catch (Exception ex)
{
throw new Exception("初始化redis失败:" + string.Format("{0}:{1} {2} {3}", config.host, config.port, config.password, config.db) + "\n" + ex.Message);
}
}
}
public static RedisClient CreateClient2(string redisConfig, bool isAuto = false)
{
var json = string.Empty;
if (!isAuto)
json = ConfigurationManager.AppSettings["ReidsConfig"]?.ToString().Trim() ?? "";
else
json = ConfigurationManager.AppSettings[redisConfig]?.ToString().Trim() ?? "";
if (string.IsNullOrEmpty(json))
throw new Exception("初始化redis失败:未找到配置节点");
RedisConfig config = null;
try
{
config = JsonConvert.DeserializeObject(json);
}
catch (Exception ex)
{
throw new Exception("初始化redis失败:配置节点json数据格式错误。" + ex.Message);
}
if (redisCli == null)
{
try
{
redisCli = new RedisClient(config.host, config.port);
}
catch (Exception ex)
{
throw new Exception("初始化redis失败:" + string.Format("{0}:{1} {2} {3}", config.host, config.port, config.password, config.db) + "\n" + ex.Message);
}
}
return redisCli;
}
///
/// 创建连接池
///
///
///
///
private static PooledRedisClientManager CreatePool(string[] readWriteHosts, string[] readOnlyHosts, int db)
{
//支持读写分离,均衡负载
return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
{
DefaultDb = db,
MaxWritePoolSize = 50,//“写”链接池链接数
MaxReadPoolSize = 50,//“读”链接池链接数
AutoStart = true,
});
}
///
/// 使用连接池获取链接
///
public static void CreateClientByPool(string[] readWriteHosts, string[] readOnlyHosts, int db)
{
redisCli = (RedisClient)CreatePool(readWriteHosts, readOnlyHosts, db).GetClient();
}
#region string
///
/// 获取key,返回string格式
///
///
///
public static string GetValueString(string key)
{
string value = redisCli.GetValue(key);
return value;
}
public static bool AddValue(string key, T value)
{
return redisCli.Add(key, value);
}
///
/// 获取key,返回byte[]格式
///
///
///
public static byte[] GetValueByte(string key)
{
byte[] value = redisCli.Get(key);
return value;
}
///
/// 删除key
///
///
///
public static bool DeleteKey(string key)
{
if (Exists(key))
return redisCli.Remove(key);
return false;
}
public static bool Exists(string key)
{
return redisCli.Exists(key) > 0 ? true : false;
}
#endregion
#region Hash
public static bool SetEntryInHash(string hashId, string key, string value)
{
return redisCli.SetEntryInHash(hashId, key, value);
}
public static bool RemoveEntryFromHash(string hashId, string key)
{
return redisCli.RemoveEntryFromHash(hashId, key);
}
///
/// 获得某个hash型key下的所有字段
///
///
///
public static List GetHashFields(string hashId)
{
List hashFields = redisCli.GetHashKeys(hashId);
return hashFields;
}
///
/// 获得某个hash型key下的所有值
///
///
///
public static List GetHashValues(string hashId)
{
List hashValues = redisCli.GetHashValues(hashId);
return hashValues;
}
///
/// 获得hash型key某个字段的值
///
///
///
///
public static string GetHashField(string key, string field)
{
string value = redisCli.GetValueFromHash(key, field);
return value;
}
///
/// 设置hash型key某个字段的值
///
///
///
///
public static void SetHashField(string key, string field, string value)
{
//return redisCli.SetEntryInHash(key, field, value);
redisCli.SetEntryInHash(key, field, value);
}
///
/// 使某个字段增加
///
///
///
///
public static void SetHashIncr(string key, string field, long incre)
{
redisCli.IncrementValueInHash(key, field, incre);
}
#endregion
#region List
///
/// 向list类型数据添加成员,向列表底部(右侧)添加
///
///
///
public static void AddItemToListRight(string list, string item)
{
redisCli.AddItemToList(list, item);
}
///
/// 获取list元素个数
///
///
///
public static long GetListCount(string list)
{
return redisCli.GetListCount(list);
}
///
/// 获取list所有元素
///
///
///
public static List GetAllItemsFromList(string list)
{
return redisCli.GetAllItemsFromList(list);
}
///
/// 获取list中某个元素的值
///
///
///
public static void SetItemInList(string list, int index, string value)
{
redisCli.SetItemInList(list, index, value);
}
///
/// 删除list中某个元素
///
///
///
public static void RemoveItemFromList(string list, int index)
{
var value = redisCli.GetItemFromList(list, index);
if (value != null)
redisCli.RemoveItemFromList(list, value);
}
///
/// 向list类型数据添加成员,向列表顶部(左侧)添加
///
///
///
public static void AddItemToListLeft(string list, string item)
{
redisCli.LPush(list, Encoding.Default.GetBytes(item));
}
///
/// 从list类型数据读取所有成员
///
///
///
public static List GetListAllItems(string list)
{
List listMembers = redisCli.GetAllItemsFromList(list);
return listMembers;
}
///
/// 从list类型数据指定索引处获取数据,支持正索引和负索引
///
///
///
///
public static string GetItemFromList(string list, int index)
{
string item = redisCli.GetItemFromList(list, index);
return item;
}
///
/// 向列表底部(右侧)批量添加数据
///
///
///
public static void GetRangeToList(string list, List values)
{
redisCli.AddRangeToList(list, values);
}
#endregion
#region Set
///
/// 向集合中添加数据
///
///
///
public static void AddItemToSet(string setId, string item)
{
redisCli.AddItemToSet(setId, item);
}
///
/// 从集合中移除数据
///
///
///
public static void RemoveItemFromSet(string setId, string item)
{
redisCli.RemoveItemFromSet(setId, item);
}
///
/// 获得集合中所有数据
///
///
///
public static HashSet GetAllItemsFromSet(string set)
{
HashSet items = redisCli.GetAllItemsFromSet(set);
return items;
}
///
/// 获取fromSet集合和其他集合不同的数据
///
///
///
///
public static HashSet GetSetDiff(string fromSet, params string[] toSet)
{
HashSet diff = redisCli.GetDifferencesFromSet(fromSet, toSet);
return diff;
}
///
/// 获得所有集合的并集
///
///
///
public static HashSet GetSetUnion(params string[] set)
{
HashSet union = redisCli.GetUnionFromSets(set);
return union;
}
///
/// 获得所有集合的交集
///
///
///
public static HashSet GetSetInter(params string[] set)
{
HashSet inter = redisCli.GetIntersectFromSets(set);
return inter;
}
#endregion
#region SortedSet
///
/// 向有序集合中添加元素
///
///
///
///
public static bool AddItemToSortedSet(string set, string value, long score)
{
return redisCli.AddItemToSortedSet(set, value, score);
}
public static bool AddItemToSortedSet(string set, string value, double score)
{
return redisCli.AddItemToSortedSet(set, value, score);
}
///
/// 获得某个值在有序集合中的排名,按分数的降序排列
///
///
///
///
public static long GetItemIndexInSortedSetDesc(string set, string value)
{
long index = redisCli.GetItemIndexInSortedSetDesc(set, value);
return index;
}
///
/// 获得某个值在有序集合中的排名,按分数的升序排列
///
///
///
///
public static long GetItemIndexInSortedSet(string set, string value)
{
long index = redisCli.GetItemIndexInSortedSet(set, value);
return index;
}
///
/// 获得有序集合中某个值得分数
///
///
///
///
public static double GetItemScoreInSortedSet(string set, string value)
{
double score = redisCli.GetItemScoreInSortedSet(set, value);
return score;
}
///
/// 获得有序集合中,某个排名范围的所有值
///
///
///
///
///
public static List GetRangeFromSortedSet(string set, int beginRank, int endRank)
{
List valueList = redisCli.GetRangeFromSortedSet(set, beginRank, endRank);
return valueList;
}
///
/// 获得有序集合中,某个分数范围内的所有值,升序
///
///
///
///
///
public static List GetRangeFromSortedSet(string set, double beginScore, double endScore)
{
List valueList = redisCli.GetRangeFromSortedSetByHighestScore(set, beginScore, endScore);
return valueList;
}
///
/// 获得有序集合中,某个分数范围内的所有值,降序
///
///
///
///
///
public static List GetRangeFromSortedSetDesc(string set, double beginScore, double endScore)
{
List vlaueList = redisCli.GetRangeFromSortedSetByLowestScore(set, beginScore, endScore);
return vlaueList;
}
public static bool RemoveItemFromScoredSet(string setId, string value)
{
bool flag = redisCli.RemoveItemFromSortedSet(setId, value);
return flag;
}
public static bool HasItemFromScoredSet(string setId, string value)
{
long index = redisCli.GetItemIndexInSortedSet(setId, value);
return index < 0 ? false : true;
}
#endregion
public void Dispose()
{
redisCli.Dispose();
}
}
}