zoukankan      html  css  js  c++  java
  • StackExchange.Redis 之 SortedSet 类型示例

     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
  • 相关阅读:
    2019年第九周作业
    2019年春第八周作业
    2019年春第七周作业
    2019春第六周作业
    2019年春季学期第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业 ----PTA作业
    2019年春季学期第三周作业
    2019春第七周作业
    第五周作业
  • 原文地址:https://www.cnblogs.com/peterzhang123/p/12346499.html
Copyright © 2011-2022 走看看