C# 通過ServiceStack 操作Redis——ZSet類型的使用及示例

Sorted Sets是將 Set 中的元素增加了一個權重參數 score,使得集合中的元素能夠按 score 進行有序排列

    /// <summary>
    /// Sorted Sets是將 Set 中的元素增加了一個權重參數 score,使得集合中的元素能夠按 score 進行有序排列
    /// 1.帶有權重的元素,比如一個遊戲的用戶得分排行榜
    /// 2.比較複雜的數據結構,一般用到的場景不算太多
    /// </summary>
    public class RedisZSetService : RedisBase
    {
        #region 添加
        /// <summary>
        /// 添加key/value,默認分數是從1.多*10的9次方以此遞增的,自帶自增效果
        /// </summary>
        public bool Add(string key, string value)
        {
            return base.iClient.AddItemToSortedSet(key, value);
        }
        /// <summary>
        /// 添加key/value,並設置value的分數
        /// </summary>
        public bool AddItemToSortedSet(string key, string value, double score)
        {
            return base.iClient.AddItemToSortedSet(key, value, score);
        }
        /// <summary>
        /// 為key添加values集合,values集合中每個value的分數設置為score
        /// </summary>
        public bool AddRangeToSortedSet(string key, List<string> values, double score)
        {
            return base.iClient.AddRangeToSortedSet(key, values, score);
        }
        /// <summary>
        /// 為key添加values集合,values集合中每個value的分數設置為score
        /// </summary>
        public bool AddRangeToSortedSet(string key, List<string> values, long score)
        {
            return base.iClient.AddRangeToSortedSet(key, values, score);
        }
        #endregion

        #region 獲取
        /// <summary>
        /// 獲取key的所有集合
        /// </summary>
        public List<string> GetAll(string key)
        {
            return base.iClient.GetAllItemsFromSortedSet(key);
        }
        /// <summary>
        /// 獲取key的所有集合,倒敘輸出
        /// </summary>
        public List<string> GetAllDesc(string key)
        {
            return base.iClient.GetAllItemsFromSortedSetDesc(key);
        }
        /// <summary>
        /// 獲取集合,帶分數
        /// </summary>
        public IDictionary<string, double> GetAllWithScoresFromSortedSet(string key)
        {
            return base.iClient.GetAllWithScoresFromSortedSet(key);
        }
        /// <summary>
        /// 獲取key為value的下標值
        /// </summary>
        public long GetItemIndexInSortedSet(string key, string value)
        {
            return base.iClient.GetItemIndexInSortedSet(key, value);
        }
        /// <summary>
        /// 倒敘排列獲取key為value的下標值
        /// </summary>
        public long GetItemIndexInSortedSetDesc(string key, string value)
        {
            return base.iClient.GetItemIndexInSortedSetDesc(key, value);
        }
        /// <summary>
        /// 獲取key為value的分數
        /// </summary>
        public double GetItemScoreInSortedSet(string key, string value)
        {
            return base.iClient.GetItemScoreInSortedSet(key, value);
        }
        /// <summary>
        /// 獲取key所有集合的數據總數
        /// </summary>
        public long GetSortedSetCount(string key)
        {
            return base.iClient.GetSortedSetCount(key);
        }
        /// <summary>
        /// key集合數據從分數為fromscore到分數為toscore的數據總數
        /// </summary>
        public long GetSortedSetCount(string key, double fromScore, double toScore)
        {
            return base.iClient.GetSortedSetCount(key, fromScore, toScore);
        }
        /// <summary>
        /// 獲取key集合從高分到低分排序數據,分數從fromscore到分數為toscore的數據
        /// </summary>
        public List<string> GetRangeFromSortedSetByHighestScore(string key, double fromscore, double toscore)
        {
            return base.iClient.GetRangeFromSortedSetByHighestScore(key, fromscore, toscore);
        }
        /// <summary>
        /// 獲取key集合從低分到高分排序數據,分數從fromscore到分數為toscore的數據
        /// </summary>
        public List<string> GetRangeFromSortedSetByLowestScore(string key, double fromscore, double toscore)
        {
            return base.iClient.GetRangeFromSortedSetByLowestScore(key, fromscore, toscore);
        }
        /// <summary>
        /// 獲取key集合從高分到低分排序數據,分數從fromscore到分數為toscore的數據,帶分數
        /// </summary>
        public IDictionary<string, double> GetRangeWithScoresFromSortedSetByHighestScore(string key, double fromscore, double toscore)
        {
            return base.iClient.GetRangeWithScoresFromSortedSetByHighestScore(key, fromscore, toscore);
        }
        /// <summary>
        ///  獲取key集合從低分到高分排序數據,分數從fromscore到分數為toscore的數據,帶分數
        /// </summary>
        public IDictionary<string, double> GetRangeWithScoresFromSortedSetByLowestScore(string key, double fromscore, double toscore)
        {
            return base.iClient.GetRangeWithScoresFromSortedSetByLowestScore(key, fromscore, toscore);
        }
        /// <summary>
        ///  獲取key集合數據,下標從fromRank到分數為toRank的數據
        /// </summary>
        public List<string> GetRangeFromSortedSet(string key, int fromRank, int toRank)
        {
            return base.iClient.GetRangeFromSortedSet(key, fromRank, toRank);
        }
        /// <summary>
        /// 獲取key集合倒敘排列數據,下標從fromRank到分數為toRank的數據
        /// </summary>
        public List<string> GetRangeFromSortedSetDesc(string key, int fromRank, int toRank)
        {
            return base.iClient.GetRangeFromSortedSetDesc(key, fromRank, toRank);
        }
        /// <summary>
        /// 獲取key集合數據,下標從fromRank到分數為toRank的數據,帶分數
        /// </summary>
        public IDictionary<string, double> GetRangeWithScoresFromSortedSet(string key, int fromRank, int toRank)
        {
            return base.iClient.GetRangeWithScoresFromSortedSet(key, fromRank, toRank);
        }
        /// <summary>
        ///  獲取key集合倒敘排列數據,下標從fromRank到分數為toRank的數據,帶分數
        /// </summary>
        public IDictionary<string, double> GetRangeWithScoresFromSortedSetDesc(string key, int fromRank, int toRank)
        {
            return base.iClient.GetRangeWithScoresFromSortedSetDesc(key, fromRank, toRank);
        }
        #endregion

        #region 刪除
        /// <summary>
        /// 刪除key為value的數據
        /// </summary>
        public bool RemoveItemFromSortedSet(string key, string value)
        {
            return base.iClient.RemoveItemFromSortedSet(key, value);
        }
        /// <summary>
        /// 刪除下標從minRank到maxRank的key集合數據
        /// </summary>
        public long RemoveRangeFromSortedSet(string key, int minRank, int maxRank)
        {
            return base.iClient.RemoveRangeFromSortedSet(key, minRank, maxRank);
        }
        /// <summary>
        /// 刪除分數從fromscore到toscore的key集合數據
        /// </summary>
        public long RemoveRangeFromSortedSetByScore(string key, double fromscore, double toscore)
        {
            return base.iClient.RemoveRangeFromSortedSetByScore(key, fromscore, toscore);
        }
        /// <summary>
        /// 刪除key集合中分數最大的數據
        /// </summary>
        public string PopItemWithHighestScoreFromSortedSet(string key)
        {
            return base.iClient.PopItemWithHighestScoreFromSortedSet(key);
        }
        /// <summary>
        /// 刪除key集合中分數最小的數據
        /// </summary>
        public string PopItemWithLowestScoreFromSortedSet(string key)
        {
            return base.iClient.PopItemWithLowestScoreFromSortedSet(key);
        }
        #endregion

        #region 其它
        /// <summary>
        /// 判斷key集合中是否存在value數據
        /// </summary>
        public bool SortedSetContainsItem(string key, string value)
        {
            return base.iClient.SortedSetContainsItem(key, value);
        }
        /// <summary>
        /// 為key集合值為value的數據,分數加scoreby,返回相加後的分數
        /// </summary>
        public double IncrementItemInSortedSet(string key, string value, double scoreBy)
        {
            return base.iClient.IncrementItemInSortedSet(key, value, scoreBy);
        }
        /// <summary>
        /// 獲取keys多個集合的交集,並把交集添加的newkey集合中,返回交集數據的總數
        /// </summary>
        public long StoreIntersectFromSortedSets(string newkey, string[] keys)
        {
            return base.iClient.StoreIntersectFromSortedSets(newkey, keys);
        }
        /// <summary>
        /// 獲取keys多個集合的並集,並把並集數據添加到newkey集合中,返回並集數據的總數
        /// </summary>
        public long StoreUnionFromSortedSets(string newkey, string[] keys)
        {
            return base.iClient.StoreUnionFromSortedSets(newkey, keys);
        }
        #endregion
    }

View Code

ServiceStack 程式集裡面沒有方法註解,我在這裡將註解添加上去,有不當之處,歡迎指正、

                //添加setId/value,默認分數是從1.多*10的9次方以此遞增的,自帶自增效果
                client.AddItemToSortedSet(setId, value);
                // 添加setId/value,並設置value的分數
                client.AddItemToSortedSet(setId, value, score);
                //獲取setId的所有集合
                client.GetAllItemsFromSortedSet(setId);
                //獲取setId的所有集合,倒敘輸出
                client.GetAllItemsFromSortedSetDesc(setId);
                //獲取setId集合,帶分數
                client.GetAllWithScoresFromSortedSet(setId);
                //獲取setId為value的下標值
                client.GetItemIndexInSortedSet(setId, value);
                //獲取setId為value的分數
                client.GetItemScoreInSortedSet(setId, value);
                //獲取setId所有集合的數據總數
                client.GetSortedSetCount(setId);
                // 獲取setId集合從高分到低分排序數據,分數從fromScore到分數為toScore的數據
                client.GetRangeFromSortedSetByHighestScore(setId, fromScore, toScore);
                //獲取setId集合從高分到低分排序數據,分數從fromScore到分數為toScore的數據,帶分數
                client.GetRangeWithScoresFromSortedSetByHighestScore(setId, fromScore, toScore);
                //獲取setId集合數據,下標從fromRank到分數為toRank的數據
                client.GetRangeFromSortedSet(setId, fromRank, toRank);
                ///獲取setId集合數據,下標從fromRank到分數為toRank的數據,帶分數
                client.GetRangeWithScoresFromSortedSet(setId, fromRank, toRank);
                // 刪除setId集合中值為value的數據
                client.RemoveItemFromSortedSet(setId, value);
                //刪除下標從minRank到maxRank的setId集合數據
                client.RemoveRangeFromSortedSet(setId, minRank, maxRank);
                //刪除分數從fromScore到toScore的setId集合數據
                client.RemoveRangeFromSortedSetByScore(setId, fromScore, toScore);
                // 刪除key集合中分數最大的數據
                client.PopItemWithHighestScoreFromSortedSet(setId);
                //判斷setId集合中是否存在value數據
                client.SortedSetContainsItem(setId, value);
                //為setId集合值為value的數據,分數加incrementBy,返回相加後的分數
                client.IncrementItemInSortedSet(setId, value, incrementBy);
                // 獲取setId多個集合的交集,並把交集添加的intoSetId集合中,返回交集數據的總數
                client.StoreIntersectFromSortedSets(intoSetId, setIds);
                /// 獲取setId多個集合的並集,並把交集添加的intoSetId集合中,返回交集數據的總數
                client.StoreUnionFromSortedSets(intoSetId, setIds);

添加

                //1. 增加
                client.AddItemToSortedSet("一年級", "zxl_1", 1);
                for (int i = 2; i < 11; i++)
                {
                    client.AddItemToSortedSet("一年級", "zxl_"+i, i);
                }
                //會覆蓋前面的score
                client.AddItemToSortedSet("一年級", "zxl_1", 100);
                //1.1  如果沒有這個value,會默認添加進去
                var dd1= client.IncrementItemInSortedSet("一年級", "zxl", 100);

                var dd2 = client.IncrementItemInSortedSet("一年級", "zxl", -30);

 

 獲取

                //2.獲取
                //2.1 升序獲取setId="一年級"的value值
                var dd3 = client.GetAllItemsFromSortedSet("一年級");
                //2.2降序獲取setId="一年級"的value值
                var dd4 = client.GetAllItemsFromSortedSetDesc("一年級");
                //2.3 降序獲取排名前4的value值
                var dd5 = client.GetRangeFromSortedSet("一年級", 0, 3);
                //2.3 降序獲取排名前4的value值,帶分數
                var dd6 = client.GetRangeWithScoresFromSortedSet("一年級", 0, 3);
                //2.4 降序獲取分數在【2,6】分內的值
                var dd7 = client.GetRangeFromSortedSetByHighestScore("一年級", 2, 6);
                //2.5 獲取指定setId集合中 zxl_2值得 分數
                var dd8=  client.GetItemScoreInSortedSet("一年級", "zxl_2");
                //2.6 獲取集合的數量
               var dd9= client.GetSortedSetCount("一年級");

刪除

                //3.刪除
                //3.1 setId集合中刪除最高分
                client.PopItemWithHighestScoreFromSortedSet("一年級");

                //3.2 setId集合中刪除setId中指定value
                client.RemoveItemFromSortedSet("一年級", "zxl_2");

                //3.3 setId集合中刪除下標從1到2的數據
                client.RemoveRangeFromSortedSet("一年級", 1, 2);

                //3.4 setId集合中刪除分數從fromScore到toScore的setId集合數據
                client.RemoveRangeFromSortedSetByScore("一年級", 8, 8);

 集合類型的操作,同Set類型一樣的寫法,這裡就不重複了。