StackExchange.Redis 之 SortedSet 类型示例
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 类型示例的更多相关文章
- StackExchange.Redis 之 hash 类型示例
StackExchange.Redis 的组件封装示例网上有很多,自行百度搜索即可. 这里只演示如何使用Hash类型操作数据: // 在 hash 中存入或修改一个值 并设置order_hashkey ...
- StackExchange.Redis 之 String 类型示例
String类型很简单,就不做示例演示了,这里只贴出Helper类 /// <summary> /// 判断key是否存在 /// </summary> /// <par ...
- 怎样在Redis通过StackExchange.Redis 存储集合类型List
StackExchange 是由StackOverFlow出品, 是对Redis的.NET封装,被越来越多的.NET开发者使用在项目中. 绝大部分原先使用ServiceStack的开发者逐渐都转了过来 ...
- redis命令Sortedset 类型(八)
Sortedset又叫zset Sortedset是有序集合,可排序的,但是唯一. Sortedset和set的不同之处, 是会给set中的元素添加一个分数,然后通过这个分数进行排序. 命令 1> ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...
- Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager 转发非原创
Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager Redis缓存服务器是一款key/value数据库,读11 ...
- [转]Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager
转自:http://www.cnblogs.com/oppoic/p/6165581.html Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存 ...
- StackExchange.Redis 官方文档(五) Keys, Values and Channels
原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels Keys, Values and Channels 在使用redis的过程中,要注意到 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
随机推荐
- 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 ...
- warning Unexpected use of undefined no-undefined
报错翻译:警告意外使用未定义的no-undefined(谷歌这次翻译的不行) 报错原因undefined直接使用了,如下↓ 其实报错的意思就是这样不安全,看下面一个例子 var foo = undef ...
- <Wonder Woman> 摘抄
<Wonder Woman> My father told me once, he said,“ If you see something wrong happening in the w ...
- Jenkins+robotframework持续集成环境(一)
一.安装JDK 系统环境:CentOS Linux release 7.3.1611 x86_64 GNU/Linux Jenkins是基于Java开发的持续集成系统(CI),所以运行环境必须安装JD ...
- nginx模块之ngx_http_upstream_module
ngx_http_upstream_module 示例: http上下文: upstream upservers{ ip_hash; //根据客户端IP进行调度,每个客户端ip地址访问时每个ip生成一 ...
- Flink架构,源码及debug
序 工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效.所以想写点东西,记录一下,如果能 ...
- Mysql常见注入
Mysql显错注入 1.判断注入类型为字符型:http://219.153.49.228:43074/new_list.php?id=tingjigonggao' and 1=1 --+2.判断字段为 ...
- java 8 supplier object区别
起初用supplier的时候,发现用法和object一样呀,只是一个用于生产object工厂方法而已,为什么要新引起这样一个对象呢. 后面查到这篇英语文档,才发现,相比object有如下三个用法: ( ...
- BZOJ3172&&lg3966 TJOI单词(广义后缀自动机)
BZOJ3172&&lg3966 TJOI单词(广义后缀自动机) 题面 自己找去 HINT 给出多个文本串,让你查找每个文本串一共出现了多少次,广义后缀自动机建出parent tree ...
- Socket之UDP
相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于 ...