1,增加操作

            RedisCacheHelper.Instance.ZSortadd("zsortkey", "A1", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "B1", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "C1", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "D1", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "", );
RedisCacheHelper.Instance.ZSortadd("zsortkey", "", );

            RedisCacheHelper.Instance.ZSortIncr("zsortkey", "D1", );   //增加2
RedisCacheHelper.Instance.ZSortDecr("zsortkey", "A1", ); //减去1

            //获取长度
var getlength = RedisCacheHelper.Instance.SortedSetLength("zsortkey");
Console.WriteLine(getlength); //移除某个元素
var getok = RedisCacheHelper.Instance.ZSortedRemove("zsortkey", "");
Console.WriteLine(getok); //获取榜单某个元素的排名
var getsort = RedisCacheHelper.Instance.ZSortedRank("zsortkey", "");
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", "");
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 = -)
{
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 = -)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return ;
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 = -)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return ;
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 = -)
{
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 = -)
{
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 = -)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return ;
else
return _db.SortedSetRank(key, mumber) ?? ; }
catch (Exception)
{
return ;
}
} /// <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 = -)
{
try
{
var _db = GetDatabase(db);
if ((object)key == null)
return ;
else
return Convert.ToDouble(_db.SortedSetScore(key, member));
}
catch (Exception ex)
{
throw;
}
} #endregion

StackExchange.Redis 之 SortedSet 类型示例的更多相关文章

  1. StackExchange.Redis 之 hash 类型示例

    StackExchange.Redis 的组件封装示例网上有很多,自行百度搜索即可. 这里只演示如何使用Hash类型操作数据: // 在 hash 中存入或修改一个值 并设置order_hashkey ...

  2. StackExchange.Redis 之 String 类型示例

    String类型很简单,就不做示例演示了,这里只贴出Helper类 /// <summary> /// 判断key是否存在 /// </summary> /// <par ...

  3. 怎样在Redis通过StackExchange.Redis 存储集合类型List

    StackExchange 是由StackOverFlow出品, 是对Redis的.NET封装,被越来越多的.NET开发者使用在项目中. 绝大部分原先使用ServiceStack的开发者逐渐都转了过来 ...

  4. redis命令Sortedset 类型(八)

    Sortedset又叫zset Sortedset是有序集合,可排序的,但是唯一. Sortedset和set的不同之处, 是会给set中的元素添加一个分数,然后通过这个分数进行排序. 命令 1> ...

  5. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

  6. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager 转发非原创

    Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager   Redis缓存服务器是一款key/value数据库,读11 ...

  7. [转]Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    转自:http://www.cnblogs.com/oppoic/p/6165581.html Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存 ...

  8. StackExchange.Redis 官方文档(五) Keys, Values and Channels

    原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...

  9. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

随机推荐

  1. idea unable to import maven see logs for details

    问题描述 环境IEAD,Maven3.6.2 2019-09-09 17:29:10,751 [ 839683] ERROR - #org.jetbrains.idea.maven - Intelli ...

  2. warning Unexpected use of undefined no-undefined

    报错翻译:警告意外使用未定义的no-undefined(谷歌这次翻译的不行) 报错原因undefined直接使用了,如下↓ 其实报错的意思就是这样不安全,看下面一个例子 var foo = undef ...

  3. <Wonder Woman> 摘抄

    <Wonder Woman> My father told me once, he said,“ If you see something wrong happening in the w ...

  4. Jenkins+robotframework持续集成环境(一)

    一.安装JDK 系统环境:CentOS Linux release 7.3.1611 x86_64 GNU/Linux Jenkins是基于Java开发的持续集成系统(CI),所以运行环境必须安装JD ...

  5. nginx模块之ngx_http_upstream_module

    ngx_http_upstream_module 示例: http上下文: upstream upservers{ ip_hash; //根据客户端IP进行调度,每个客户端ip地址访问时每个ip生成一 ...

  6. Flink架构,源码及debug

    序 工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效.所以想写点东西,记录一下,如果能 ...

  7. Mysql常见注入

    Mysql显错注入 1.判断注入类型为字符型:http://219.153.49.228:43074/new_list.php?id=tingjigonggao' and 1=1 --+2.判断字段为 ...

  8. java 8 supplier object区别

    起初用supplier的时候,发现用法和object一样呀,只是一个用于生产object工厂方法而已,为什么要新引起这样一个对象呢. 后面查到这篇英语文档,才发现,相比object有如下三个用法: ( ...

  9. BZOJ3172&&lg3966 TJOI单词(广义后缀自动机)

    BZOJ3172&&lg3966 TJOI单词(广义后缀自动机) 题面 自己找去 HINT 给出多个文本串,让你查找每个文本串一共出现了多少次,广义后缀自动机建出parent tree ...

  10. Socket之UDP

    相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于 ...