文章目錄
如何在 .NET 程式中使用 Redis 做為 Cache Server - Part 5 (使用 Sorted Sets 型別)
今天來看看 Sorted Sets 該怎麼使用,建議可與 如何在 .NET 程式中使用 Redis 做為 Cache Server - Part 4 (使用 Sets 型別) 參照
一樣先說重點:用法與 Sets 幾乎相同,差別是 Sorted Sets 多了一個分數值可以用來自訂優先順序,如果有興趣多瞭解 StackExchange.Redis 指令對應文中有對應與簡介說明表
基礎建設
處理 redis 連線 factory
使用 StackExchange.Redis 套件,記得 nuget 安裝
public static class RedisConnectionFactory { private static readonly Lazy<ConnectionMultiplexer> Connection; static RedisConnectionFactory() { var connectionString = "localhost:6379"; var options = ConfigurationOptions.Parse(connectionString); Connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(options)); } public static ConnectionMultiplexer GetConnection => Connection.Value; public static IDatabase RedisDB => GetConnection.GetDatabase(); }
測試用自訂 class
public class Person { public string ID{ get; set; } public string Name { get; set; } public string Tel { get; set; } }
存取 redis 用的 object
IDatabase _db = RedisConnectionFactory.RedisDB;
使用 batch 來批次處理指令
var batch = _db.CreateBatch();
製造假資料
Dictionary<string, List<Person>> peopleDic = new Dictionary<string, List<Person>>(); for (int i = 0; i < 3; i++) { var _id = Guid.NewGuid().ToString(); List<Person> people = new List<UserQuery.Person>(); for (int j = 0; j < 3; j++) { var element = new Person { ID = $"{i}_{j}_ID", Name = $"{i}_{j}_yowko", Tel = $"{i}_{j}_0123456789" }; _db.SortedSetAddAsync(_id, JsonConvert.SerializeObject(element), i * 10 + j); } }
使用 Sorted Sets 型別
相關指令介紹
指令 參數 對應 StackExchange.Redis 指令 說明 ZADD key [NX|XX] [CH] [INCR] score member [score member …] SortedSetAdd/SortedSetAddAsync 加一個或多個成員到 sorted set (如果 key 已經存在則更新的分數) ZCARD key SortedSetLength/SortedSetLengthAsync 傳回特定 key 的元素數量 ZCOUNT key min max SortedSetLength/SortedSetLengthAsync 傳回分數 min 至 max 範圍內的元素數量 ZINCRBY key increment member SortedSetIncrement
SortedSetIncrementAsync將 key 元素 member 的分數值加上 increment ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] SortedSetCombineAndStore
SortedSetCombineAndStoreAsync將指定數量(numkeys) 的 sorted set(key) 交集結果,儲存至 destination ZREVRANGEZLEXCOUNT key min max - 傳回分數介於 min - max 間的元素數量 ZRANGE key start stop [WITHSCORES] SortedSetRangeByRank
SortedSetRangeByRankAsync
SortedSetRangeByRankWithScores
SortedSetRangeByRankWithScoresAsync取得 key 中從 start 至 stop 的元素 ZRANGEBYLEX key min max [LIMIT offset count] SortedSetRangeByValue
SortedSetRangeByValueAsync取得 key 中依名稱正向排序後從 min 至 max 間分數相同的元素 ZREVRANGEBYLEX key max min [LIMIT offset count] - 取得 key 中依名稱逆向排序後從 max 至 min 間分數相同的元素 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] SortedSetRangeByScore
SortedSetRangeByScoreAsync
SortedSetRangeByScoreWithScores
SortedSetRangeByScoreWithScoresAsync取得 key 中分數從低至高排序後從 min 至 max 的所有元素 ZRANK key member SortedSetRank
SortedSetRankAsync取得 member 元素在 key 中的排序位置 ZREM key member [member …] SortedSetRemove
SortedSetRemoveAsync刪除 key 中一個或多個 member 元素 ZREMRANGEBYLEX key min max SortedSetRemoveRangeByValue
SortedSetRemoveRangeByValueAsync刪除 key 中名稱按由低到高排序後 從 min 至 max 元素間所有元素 ZREMRANGEBYRANK key start stop SortedSetRemoveRangeByRank
SortedSetRemoveRangeByRankAsync在排序設置的所有成員在給定的索引中刪除 ZREMRANGEBYSCORE key min max SortedSetRemoveRangeByScore
SortedSetRemoveRangeByScoreAsync刪除 key 中依分數由低至高排序後,從 min 至 max 元素間所有元素 ZREVRANGE key start stop [WITHSCORES] SortedSetRangeByRank
SortedSetRangeByRankAsync
SortedSetRangeByRankWithScores
SortedSetRangeByRankWithScoresAsync取得 key 中在分數由高至低排序後,從位置 start 至 stop 的所有元素 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] SortedSetRangeByRank
SortedSetRangeByRankAsync
SortedSetRangeByRankWithScores
SortedSetRangeByRankWithScoresAsync取得 key 中分數由高至低排序後 從分數 max 至 min 的所有元素 ZREVRANK key member SortedSetRank
SortedSetRankAsync取得 key 中分數由高至低排序後 member 的排序位置 ZSCORE key member SortedSetScore
SortedSetScoreAsync取得 key 中 member 的分數 ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] SortedSetCombineAndStore
SortedSetCombineAndStoreAsync將指定數量(numkeys) 的 sorted set (key) 聯集結果,儲存至 destination ZSCAN key cursor [MATCH pattern] [COUNT count] SortedSetScan 逐一列出 sorted set (key) 中的元素
實際使用
範例程式碼
var batch = _db.CreateBatch(); foreach (var item in peopleDic) { foreach (var element in item.Value) { _db.SetAddAsync(item.Key, JsonConvert.SerializeObject(element)); } } batch.Execute();
儲存狀況
完整程式碼
void Main()
{
IDatabase _db = RedisConnectionFactory.RedisDB;
Dictionary<string, List<Person>> peopleDic = new Dictionary<string, List<Person>>();
var batch = _db.CreateBatch();
for (int i = 0; i < 3; i++)
{
var _id = Guid.NewGuid().ToString();
List<Person> people = new List<UserQuery.Person>();
for (int j = 0; j < 3; j++)
{
var element = new Person { ID = $"{i}_{j}_ID", Name = $"{i}_{j}_yowko", Tel = $"{i}_{j}_0123456789" };
_db.SortedSetAddAsync(_id, JsonConvert.SerializeObject(element), i * 10 + j);
}
}
batch.Execute();
}
public class Person
{
public string ID { get; set; }
public string Name { get; set; }
public string Tel { get; set; }
}
參考資料
文章作者 Yowko Tsai
上次更新 2021-11-03
授權合約
本部落格 (Yowko's Notes) 所有的文章內容(包含圖片),任何轉載行為,必須通知並獲本部落格作者 (Yowko Tsai) 的同意始得轉載,且轉載皆須註明出處與作者。
Yowko's Notes 由 Yowko Tsai 製作,以創用CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款 釋出。