StackExchange.Redis 之 Set集合 类型示例
话不多说直接上代码:
// set添加单个元素
stopwatch.Start();
var isok = RedisCacheHelper.Instance.SetAdd("setkey", "");
stopwatch.Stop();
Console.WriteLine("set添加单个元素消耗时间:" + stopwatch.ElapsedMilliseconds.ToString()); // set添加多个元素 sting类型集合
List<string> strlist = new List<string>() { "", "", "A", "B", "你", "好" };
stopwatch.Start();
var getlong = RedisCacheHelper.Instance.SetAdd("setkeylist", strlist);
stopwatch.Stop();
Console.WriteLine("set添加多个元素消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("返回集合长度:" + getlong); //从数据库获取10条数据
stopwatch.Start();
var getlist = TestRedis.GetOrderFormAll();
stopwatch.Stop();
Console.WriteLine("从数据库获取10条数据消耗时间:" + stopwatch.ElapsedMilliseconds.ToString()); // set添加多个对象集合 序列化
stopwatch.Start();
var getvalue = RedisCacheHelper.Instance.SetAddList("setkeyobjlist", getlist);
stopwatch.Stop();
Console.WriteLine("set添加多个对象集合消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("返回集合长度:" + getvalue);




// 获取set集合的长度
var getleng = RedisCacheHelper.Instance.SetLength("setkeylist");
Console.WriteLine("获取 setkeylist 的长度:" + getleng);
var getobjleng = RedisCacheHelper.Instance.SetLength("setkeyobjlist");
Console.WriteLine("获取 setkeyobjlist 的长度:" + getobjleng); // 检查元素是否属于Set集合
var getisA = RedisCacheHelper.Instance.ExistsInSet("setkeylist", "A");
var getisC = RedisCacheHelper.Instance.ExistsInSet("setkeylist", "C");
Console.WriteLine("检查 A 是否属于setkeylist集合:" + getisA);
Console.WriteLine("检查 C 是否属于setkeylist集合:" + getisC); // 根据key获取所有Set元素
stopwatch.Start();
var getlist = RedisCacheHelper.Instance.GetMembers("setkeylist");
stopwatch.Stop();
Console.WriteLine("获取所有Set元素消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getlist)
{
Console.WriteLine(item);
} // 根据key获取所有对象元素 反序列化
stopwatch.Start();
var getobjlist = RedisCacheHelper.Instance.GetAllMembers<OrderForm>("setkeyobjlist");
stopwatch.Stop();
Console.WriteLine("获取所有对象集合消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getobjlist)
{
Console.WriteLine("打印Area: " + item.Area);
}

//求 交集、差集、并集
string[] arry2 = { "setkeylist", "setkeylist2" };
var d1 = RedisCacheHelper.Instance.GetCombines(SetOperation.Union, arry2.ToList()); //并集
var d2 = RedisCacheHelper.Instance.GetCombines(SetOperation.Intersect, arry2.ToList()); //交集
var d3 = RedisCacheHelper.Instance.GetCombines(SetOperation.Difference, arry2.ToList()); //差集
foreach (var item in d1)
{
Console.WriteLine("setkeylist和setkeylist2的并集有:" + item);
}
foreach (var item in d2)
{
Console.WriteLine("setkeylist和setkeylist2的交集有:" + item);
}
foreach (var item in d3)
{
Console.WriteLine("setkeylist和setkeylist2的差集有:" + item);
}



// 根据key随机获取Set中的1个元素 循环获取会得到重复内容,
for (int i = ; i < ; i++)
{
stopwatch.Start();
var getone = RedisCacheHelper.Instance.GetRandomMember("setkeyobjlist");
stopwatch.Stop();
//Console.WriteLine("根据key随机获取Set中的1个元素消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
Console.WriteLine("打印: " + getone);
} // 根据key随机获取Set中的n个元素 一次性获取,无重复值
stopwatch.Start();
var getobjlist = RedisCacheHelper.Instance.GetRandomMembers("setkeyobjlist", );
stopwatch.Stop();
Console.WriteLine("根据key随机获取Set中的n个元素消耗时间:" + stopwatch.ElapsedMilliseconds.ToString());
foreach (var item in getobjlist)
{
Console.WriteLine("打印: " + item);
}

应用场景:
Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
实现方式:
set 的内部实现是一个 value 永远为 null 的 HashMap,实际就是通过计算 hash 的方式来快速排重的,这也是 set 能提供判断一个成员是否在集合内的原因。
最后附上Helper帮助类
/// <summary>
/// set添加单个元素
/// 具有唯一性 比如在线人数/点赞人数/收藏人数等
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool SetAdd(string key, string value, TimeSpan? span = null, int db = -)
{
try
{
_db = GetDatabase(db);
//设置过期时间
if (span != null)
{
this.KeyExpire(key, span);
}
return _db.SetAdd(key, value);
}
catch (Exception ex)
{
return false;
}
} /// <summary>
/// set添加多个元素集合
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetAdd(string key, List<string> arryList, int db = -)
{
try
{
_db = GetDatabase(db);
RedisValue[] valueList = arryList.Select(u => (RedisValue)u).ToArray();
return _db.SetAdd(key, valueList);
}
catch (Exception)
{
return ;
}
} /// <summary>
/// set添加多个对象集合 序列化
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetAddList<T>(string key, IEnumerable<T> list, int db = -) where T : class
{
try
{
_db = GetDatabase(db);
List<RedisValue> listRedisValue = new List<RedisValue>();
foreach (var item in list)
{
string json = JsonConvert.SerializeObject(item);
listRedisValue.Add(json);
}
return _db.SetAdd(key, listRedisValue.ToArray());
}
catch (Exception)
{
return ;
}
} /// <summary>
/// 获取set集合的长度
/// </summary>
/// <param name="key"></param>
/// <param name="db"></param>
/// <returns></returns>
public long SetLength(string key, int db = -)
{
try
{
_db = GetDatabase(db);
return _db.SetLength(key);
}
catch (Exception)
{
return ;
}
} /// <summary>
/// 检查元素是否属于Set集合
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="db"></param>
/// <returns></returns>
public bool ExistsInSet(string key, string value, int db = -)
{
try
{
_db = GetDatabase(db);
return _db.SetContains(key, value);
}
catch (Exception)
{
return false;
}
} /// <summary>
/// 根据key获取所有Set元素
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetMembers(string redisKey, int db = -)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetMembers(redisKey);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
} /// <summary>
/// 根据key获取所有Set对象集合 反序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public List<T> GetAllMembers<T>(string redisKey, int db = -) where T : class
{
List<T> result = new List<T>();
try
{
_db = GetDatabase(db);
var arr = _db.SetMembers(redisKey);
foreach (var item in arr)
{
if (!item.IsNullOrEmpty)
{
var t = JsonConvert.DeserializeObject<T>(item);
if (t != null)
{
result.Add(t);
}
}
}
}
catch (Exception)
{
return null;
}
return result;
} /// <summary>
/// 根据key随机获取Set中的1个元素 不删除该元素
/// 可应用于中奖类的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public string GetRandomMember(string redisKey, int db = -)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetRandomMember(redisKey);
return rValue.ToString();
}
catch (Exception)
{
throw;
}
} /// <summary>
/// 根据key随机获取Set中的n个元素 不删除该元素
/// 可应用于中奖类的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="count"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetRandomMembers(string redisKey, long count, int db = -)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetRandomMembers(redisKey, count);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
} /// <summary>
/// 随机删除指定key集合中的一个值,并返回这些值
/// 可应用于抽奖类的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="db"></param>
/// <returns></returns>
public string GetRandomRemovePop(string redisKey, int db = -)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetPop(redisKey);
return rValue.ToString();
}
catch (Exception)
{
throw;
}
} /// <summary>
/// 随机删除指定key集合中的n个值,并返回这些值
/// 可应用于抽奖类的案例
/// </summary>
/// <param name="redisKey"></param>
/// <param name="count"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetRandomRemovePops(string redisKey, long count, int db = -)
{
try
{
_db = GetDatabase(db);
var rValue = _db.SetPop(redisKey, count);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
} /// <summary>
/// 返回指定rediskey集合的交集、差集、并集
/// 只能在同一个库内查询,跨库则不行
/// </summary>
/// <param name="operation"></param>
/// <param name="keyList"></param>
/// <param name="db"></param>
/// <returns></returns>
public IEnumerable<string> GetCombines(SetOperation operation, List<string> keyList, int db = -)
{
try
{
_db = GetDatabase(db);
RedisKey[] valueList = keyList.Select(u => (RedisKey)u).ToArray();
var rValue = _db.SetCombine(operation, valueList);
return rValue.Select(ob => ob.ToString());
}
catch (Exception)
{
throw;
}
}
StackExchange.Redis 之 Set集合 类型示例的更多相关文章
- StackExchange.Redis 之 List队列 类型示例
//从第1个开始,依次向左插入值.如果键不存在,先创建再插入值 队列形式 先进后出,后进先出 //插入后形式 <-- 10,9,8,7,6,5,4,3,2,1 <-- 方向向左依次进行 ...
- 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表
python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...
- Redis之无序集合类型命令
Redis 集合(Set) Redis 的 Set 是 String 类型的无序集合.集合成员是唯一的,这就意味着集合中不能出现重复的数据. Redis 中集合是通过哈希表实现的,所以添加,删除,查找 ...
- redis之(八)redis的有序集合类型的命令
[一]增加元素 --->命令:ZADD key score member [score member] --->向有序集合放入一个分数为score的member元素 --->元素存在 ...
- redis之有序集合类型(Zset)——排行榜的实现
当数据库对排序支持的不是很好,可以利用redis有序集合排序 原文链接:http://blog.csdn.net/loophome/article/details/50373202
- redis: Set集合类型(五)
Set里面的值是不能重复的 Set设置值(头部):sadd myset hello Set获取值:smembers myset 检查Set是否包含某个元素:sismember myset hello ...
- redis: Hash集合类型(六)
存值:hset myhash name applesnt 取值:hget myhash name 批量存值:hmset myhash name lisi address bj age 12 批量取值: ...
- Scala集合类型详解
Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...
- StackExchange.Redis 之 hash 类型示例
StackExchange.Redis 的组件封装示例网上有很多,自行百度搜索即可. 这里只演示如何使用Hash类型操作数据: // 在 hash 中存入或修改一个值 并设置order_hashkey ...
随机推荐
- Manipulating Data from Oracle Object Storage to ADW with Oracle Data Integrator (ODI)
0. Introduction and Prerequisites This article presents an overview on how to use Oracle Data Integr ...
- [洛谷P4097] [HEOI2013] Segment
Description 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 \(i\) 条被插入的线段的标号为 \(i\) 2.给定一个数 \(k\) ,询问与直线 \(x = k\ ...
- [bzoj3143] [洛谷P3232] [HNOI2013] 游走
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- Sublime Text 3 安装包
摘要 Error while loading PyV8 binary:exit code 3 .sublime-package报错 安装SublimeREPL,可以运行python代码 安装local ...
- Hyper-V 搭建独臂路由器(单网卡也可以)
2020年原本难得清闲的春节,由于疫情的原因只能在家里看视频打发时间.打开某奇艺,全是某某公寓的推荐真的是受不了.一群人在那里叽叽喳喳,超前点播更是吃像难看,实在是没意思,所以决定搞一个独臂路由器玩一 ...
- 链接拼接的方法(用于解决同一个脚本返回两种不同的url链接的问题)
实例一: 上图所示 爬虫返回的链接有一部分带有http前缀,有一部分没有,且也不知道具体哪些链接会出现没有前缀的情况 后面如果通过返回链接进行再次访问,那么肯定会出现报错的问题 思路: 判断 返回值内 ...
- zookeeper3.4.6安装
1.关闭防火墙 service iptables stop chkconfig iptables off 2.编辑hosts文件: vi /etc/hosts 192.168.99.6 JacK6 1 ...
- 架构模式中的Active Record和Data Mapper
架构模式中的Active Record和Data Mapper 概念 在简单应用中,领域模型是一种和数据库结构一致的简单结构,对应每个数据库表都有一个领域类,在这种情况下,有必要让每个对象负责数据库的 ...
- ios--->const 用法总结
const 用法总结 宏.变量.常量区分 宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化.只保存一份到 .rodata 段.甚至有相同后缀的字符串也可以 ...
- [白话解析] 带你一起梳理Word2vec相关概念
[白话解析] 带你一起梳理Word2vec相关概念 0x00 摘要 本文将尽量使用易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来说,运用感性直觉的思考来帮大家梳理Word2vec相关概念. 0 ...