1,增加操作
RedisCacheHelper.Instance.ZSortadd("zsortkey", "A1", 5);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "B1", 6);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "C1", 2);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "D1", 1);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "1", 9);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "2", 8);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "3", 7);
RedisCacheHelper.Instance.ZSortadd("zsortkey", "4", 1);

RedisCacheHelper.Instance.ZSortIncr("zsortkey", "D1", 2); //增加2
RedisCacheHelper.Instance.ZSortDecr("zsortkey", "A1", 1); //減去1
//擷取長度
var getlength = RedisCacheHelper.Instance.SortedSetLength("zsortkey");
Console.WriteLine(getlength);
//移除某個元素
var getok = RedisCacheHelper.Instance.ZSortedRemove("zsortkey", "1");
Console.WriteLine(getok);
//擷取榜單某個元素的排名
var getsort = RedisCacheHelper.Instance.ZSortedRank("zsortkey", "2");
Console.WriteLine(getsort);
//擷取有序集合中的某個元素的值
//擴充的有
//SortedSetRangeByRank 根據索引擷取member值,預設是升序,可以擷取指定索引内的member值
//SortedSetRangeByScore:根據score擷取member值,預設是升序,可以擷取指定score開始和結束的member值,後面的skip和take用于分頁
//SortedSetRangeByValue:根據member擷取member值,預設是升序,可以擷取指定member開始和結束的值,後面的skip和take用于分頁
//SortedSetRangeByRankWithScores:擷取member和score值,可以隻傳回 start-stop 這個索引排序内的值(預設升序),後面的skip和take用于分頁
var getvalue = RedisCacheHelper.Instance.ZSortedScore("zsortkey", "4");
Console.WriteLine(getvalue);
使用場景:
Redis sorted set 的使用場景與 set 類似,差別是 set 不是自動有序的,而 sorted set 可以通過使用者額外提供一個優先級 (score) 的參數來為成員排序,并且是插入有序的,即自動排序。當你需要一個有序的并且不重複的集合清單,那麼可以選擇 sorted set 資料結構,比如 twitter 的 public timeline 可以以發表時間作為 score 來存儲,這樣擷取時就是自動按時間排好序的。
實作方式:
Redis sorted set 的内部使用 HashMap 和跳躍表 (SkipList) 來保證資料的存儲和有序,HashMap 裡放的是成員到 score 的映射,而跳躍表裡存放的是所有的成員,排序依據是 HashMap 裡存的 score, 使用跳躍表的結構可以獲得比較高的查找效率,并且在實作上比較簡單。
這裡附上Helper類
#region SortSet類型 有序集合
/// <summary>
/// 增加,可以一次增加一個member,也可以一次增加多個member
/// </summary>
/// <param name="key"></param>
/// <param name="member"></param>
/// <param name="score"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool ZSortadd(string key, string member, double score, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return false;
else
return _db.SortedSetAdd(key, member, score);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 對Score值自增
/// 如果不存在這member值,則執行增加member操作,并傳回目前Score值
/// </summary>
/// <param name="key">The key.</param>
/// <param name="member">The member.</param>
/// <param name="score">The score.</param>
/// <param name="db">The database.</param>
/// <returns></returns>
public double ZSortIncr(string key, string member, double score, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return 0;
else
return _db.SortedSetIncrement(key, member, score);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 對Score值自減
/// 如果不存在這member值,則執行增加member操作,并傳回目前Score值
/// </summary>
/// <param name="key">The key.</param>
/// <param name="member">The member.</param>
/// <param name="score">The score.</param>
/// <param name="db">The database.</param>
/// <returns></returns>
public double ZSortDecr(string key, string member, double score, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return 0;
else
return _db.SortedSetDecrement(key, member, score);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 長度
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SortedSetLength(string redisKey, int db = -1)
{
var _db = GetDatabase(db);
return _db.SortedSetLength(redisKey);
}
/// <summary>
/// 移除某個元素
/// </summary>
/// <param name="key"></param>
/// <param name="memebr"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool ZSortedRemove(string key, string memebr, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return false;
else
return _db.SortedSetRemove(key, memebr);
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 擷取榜單某個元素的排名、排行
/// </summary>
/// <param name="key"></param>
/// <param name="mumber"></param>
/// <param name="db"></param>
/// <returns></returns>
public double ZSortedRank(string key, string mumber, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return 0;
else
return _db.SortedSetRank(key, mumber) ?? 0;
}
catch (Exception)
{
return 0;
}
}
/// <summary>
/// 擷取有序集合中的某個元素的值
/// </summary>
/// <param name="key">The key.</param>
/// <param name="member">The member.</param>
/// <param name="db">The database.</param>
/// <returns></returns>
public double ZSortedScore(string key, string member, int db = -1)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return 0;
else
return Convert.ToDouble(_db.SortedSetScore(key, member));
}
catch (Exception ex)
{
throw;
}
}
#endregion
View Code
作者:PeterZhang
出處:https://www.cnblogs.com/peterzhang123
本文版權歸作者和部落格園共有,歡迎轉載,但必須給出原文連結,并保留此段聲明,否則保留追究法律責任的權利。