話不多說直接上代碼:
// set添加單個元素
stopwatch.Start();
var isok = RedisCacheHelper.Instance.SetAdd("setkey", "10");
stopwatch.Stop();
Console.WriteLine("set添加單個元素消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
// set添加多個元素 sting類型集合
List<string> strlist = new List<string>() { "1", "2", "A", "B", "你", "好" };
stopwatch.Start();
var getlong = RedisCacheHelper.Instance.SetAdd("setkeylist", strlist);
stopwatch.Stop();
Console.WriteLine("set添加多個元素消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("傳回集合長度:" + getlong);
//從資料庫擷取10條資料
stopwatch.Start();
var getlist = TestRedis.GetOrderFormAll(10);
stopwatch.Stop();
Console.WriteLine("從資料庫擷取10條資料消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
// set添加多個對象集合 序列化
stopwatch.Start();
var getvalue = RedisCacheHelper.Instance.SetAddList("setkeyobjlist", getlist);
stopwatch.Stop();
Console.WriteLine("set添加多個對象集合消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("傳回集合長度:" + getvalue);

// 擷取set集合的長度
var getleng = RedisCacheHelper.Instance.SetLength("setkeylist");
Console.WriteLine("擷取 setkeylist 的長度:" + getleng);
var getobjleng = RedisCacheHelper.Instance.SetLength("setkeyobjlist");
Console.WriteLine("擷取 setkeyobjlist 的長度:" + getobjleng);
// 檢查元素是否屬于Set集合
var getisA = RedisCacheHelper.Instance.ExistsInSet("setkeylist", "A");
var getisC = RedisCacheHelper.Instance.ExistsInSet("setkeylist", "C");
Console.WriteLine("檢查 A 是否屬于setkeylist集合:" + getisA);
Console.WriteLine("檢查 C 是否屬于setkeylist集合:" + getisC);
// 根據key擷取所有Set元素
stopwatch.Start();
var getlist = RedisCacheHelper.Instance.GetMembers("setkeylist");
stopwatch.Stop();
Console.WriteLine("擷取所有Set元素消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getlist)
{
Console.WriteLine(item);
}
// 根據key擷取所有對象元素 反序列化
stopwatch.Start();
var getobjlist = RedisCacheHelper.Instance.GetAllMembers<OrderForm>("setkeyobjlist");
stopwatch.Stop();
Console.WriteLine("擷取所有對象集合消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getobjlist)
{
Console.WriteLine("列印Area: " + item.Area);
}
//求 交集、差集、并集
string[] arry2 = { "setkeylist", "setkeylist2" };
var d1 = RedisCacheHelper.Instance.GetCombines(SetOperation.Union, arry2.ToList()); //并集
var d2 = RedisCacheHelper.Instance.GetCombines(SetOperation.Intersect, arry2.ToList()); //交集
var d3 = RedisCacheHelper.Instance.GetCombines(SetOperation.Difference, arry2.ToList()); //差集
foreach (var item in d1)
{
Console.WriteLine("setkeylist和setkeylist2的并集有:" + item);
}
foreach (var item in d2)
{
Console.WriteLine("setkeylist和setkeylist2的交集有:" + item);
}
foreach (var item in d3)
{
Console.WriteLine("setkeylist和setkeylist2的差集有:" + item);
}
// 根據key随機擷取Set中的1個元素 循環擷取會得到重複内容,
for (int i = 0; i < 5; i++)
{
stopwatch.Start();
var getone = RedisCacheHelper.Instance.GetRandomMember("setkeyobjlist");
stopwatch.Stop();
//Console.WriteLine("根據key随機擷取Set中的1個元素消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("列印: " + getone);
}
// 根據key随機擷取Set中的n個元素 一次性擷取,無重複值
stopwatch.Start();
var getobjlist = RedisCacheHelper.Instance.GetRandomMembers("setkeyobjlist", 5);
stopwatch.Stop();
Console.WriteLine("根據key随機擷取Set中的n個元素消耗時間:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getobjlist)
{
Console.WriteLine("列印: " + item);
}
應用場景:
Redis set 對外提供的功能與 list 類似是一個清單的功能,特殊之處在于 set 是可以自動排重的,當你需要存儲一個清單資料,又不希望出現重複資料時,set 是一個很好的選擇,并且 set 提供了判斷某個成員是否在一個 set 集合内的重要接口,這個也是 list 所不能提供的。
實作方式:
set 的内部實作是一個 value 永遠為 null 的 HashMap,實際就是通過計算 hash 的方式來快速排重的,這也是 set 能提供判斷一個成員是否在集合内的原因。
最後附上Helper幫助類
/// <summary>
/// set添加單個元素
/// 具有唯一性 比如線上人數/點贊人數/收藏人數等
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool SetAdd(string key, string value, TimeSpan? span = null, int db = -1)
{
try
{
_db = GetDatabase(db);
//設定過期時間
if (span != null)
{
this.KeyExpire(key, span);
}
return _db.SetAdd(key, value);
}
catch (Exception ex)
{
return false;
}
}
/// <summary>
/// set添加多個元素集合
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetAdd(string key, List<string> arryList, int db = -1)
{
try
{
_db = GetDatabase(db);
RedisValue[] valueList = arryList.Select(u => (RedisValue)u).ToArray();
return _db.SetAdd(key, valueList);
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// set添加多個對象集合 序列化
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetAddList<T>(string key, IEnumerable<T> list, int db = -1) where T : class
{
try
{
_db = GetDatabase(db);
List<RedisValue> listRedisValue = new List<RedisValue>();
foreach (var item in list)
{
string json = JsonConvert.SerializeObject(item);
listRedisValue.Add(json);
}
return _db.SetAdd(key, listRedisValue.ToArray());
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// 擷取set集合的長度
/// </summary>
/// <param name="key"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetLength(string key, int db = -1)
{
try
{
_db = GetDatabase(db);
return _db.SetLength(key);
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// 檢查元素是否屬于Set集合
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool ExistsInSet(string key, string value, int db = -1)
{
try
{
_db = GetDatabase(db);
return _db.SetContains(key, value);
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 根據key擷取所有Set元素
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetMembers(string redisKey, int db = -1)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetMembers(redisKey);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 根據key擷取所有Set對象集合 反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public List<T> GetAllMembers<T>(string redisKey, int db = -1) where T : class
{
List<T> result = new List<T>();
try
{
_db = GetDatabase(db);
var arr = _db.SetMembers(redisKey);
foreach (var item in arr)
{
if (!item.IsNullOrEmpty)
{
var t = JsonConvert.DeserializeObject<T>(item);
if (t != null)
{
result.Add(t);
}
}
}
}
catch (Exception)
{
return null;
}
return result;
}
/// <summary>
/// 根據key随機擷取Set中的1個元素 不删除該元素
/// 可應用于中獎類的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public string GetRandomMember(string redisKey, int db = -1)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetRandomMember(redisKey);
return rValue.ToString();
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 根據key随機擷取Set中的n個元素 不删除該元素
/// 可應用于中獎類的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="count"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetRandomMembers(string redisKey, long count, int db = -1)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetRandomMembers(redisKey, count);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 随機删除指定key集合中的一個值,并傳回這些值
/// 可應用于抽獎類的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public string GetRandomRemovePop(string redisKey, int db = -1)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetPop(redisKey);
return rValue.ToString();
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 随機删除指定key集合中的n個值,并傳回這些值
/// 可應用于抽獎類的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="count"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetRandomRemovePops(string redisKey, long count, int db = -1)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetPop(redisKey, count);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 傳回指定rediskey集合的交集、差集、并集
/// 隻能在同一個庫内查詢,跨庫則不行
/// </summary>
/// <param name="operation"></param>
/// <param name="keyList"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetCombines(SetOperation operation, List<string> keyList, int db = -1)
{
try
{
_db = GetDatabase(db);
RedisKey[] valueList = keyList.Select(u => (RedisKey)u).ToArray();
var rValue = _db.SetCombine(operation, valueList);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
}
View Code
作者:PeterZhang
出處:https://www.cnblogs.com/peterzhang123
本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。