StackExchange.Redis的使用 Redis五种数据类型的应用
ConnectionMultiplexer
ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用程序应该只有一个ConnectionMultiplexer 类的实例。上一章中StackExchangeRedisHelper 的相关代码如下
private static ConnectionMultiplexer _instance = null;
/// <summary>
/// 使用一个静态属性来返回已连接的实例,如下列中所示。这样,一旦 ConnectionMultiplexer 断开连接,便可以初始化新的连接实例。
/// </summary>
public static ConnectionMultiplexer Instance
{
get
{
if (_instance == null)
{
lock (_locker)
{
if (_instance == null || !_instance.IsConnected)
{
_instance = ConnectionMultiplexer.Connect(Coonstr);
}
}
}
//注册如下事件
_instance.ConnectionFailed += MuxerConnectionFailed;
_instance.ConnectionRestored += MuxerConnectionRestored;
_instance.ErrorMessage += MuxerErrorMessage;
_instance.ConfigurationChanged += MuxerConfigurationChanged;
_instance.HashSlotMoved += MuxerHashSlotMoved;
_instance.InternalError += MuxerInternalError;
return _instance;
}
}
String
string类型应该是最长用到的了,用法也很简单,下面展示了用Redis来进行基本的字符串数字存储
public static IDatabase GetDatabase()
{
return Instance.GetDatabase();
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public static void Set(string key, object value, TimeSpan? expiry = default(TimeSpan?), When when = When.Always, CommandFlags flags = CommandFlags.None)
{
key = MergeKey(key);
GetDatabase().StringSet(key, Serialize(value), expiry, when, flags);
}
/// <summary>
/// 根据key获取缓存对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T Get<T>(string key)
{
key = MergeKey(key);
return Deserialize<T>(GetDatabase().StringGet(key));
}
/// <summary>
/// 移除指定key的缓存
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Remove(string key)
{
key = MergeKey(key);
return GetDatabase().KeyDelete(key);
}
除了基本的string类型操作,Redis同时支持以下几种类型的操作
- List 列表
- Set 无序集合
- SortedSet 有序集合
- Hash 哈希表
下面我依次来介绍下这四种类型在StackExchange.Redis中的基本用法
关于代码中的KeyDelete为删除对应的键,我这里是因为测试防止重复才加上的。大家不要误会
List
- 特点:有序排列,值可以重复。我们可以通过pop,push操作来从头部和尾部删除或者添加元素。这使得list既可以做栈也可以做队列
- 需求:要求一条微博将最新的10条评论用户名字直接显示在主页上
- 实现:
public static void LatestUserTop10()
{
IDatabase db = StackExchangeRedisHelper.GetDatabase();
//模拟有一百名用户
for (int i = ; i <= ; i++)
{
db.ListLeftPush("user", "用户"+i);
//每一名用户插入后都只保留最后的十个用户到redis数据库中
db.ListTrim("user", , );
}
RedisValue[] userStores = db.ListRange("user");
foreach (var item in userStores)
{
Console.Write((string)item + ",");
}
db.KeyDelete("user");
Console.ReadLine();
}
Set
- 特点:无序排列,值不可重复。增加删除查询都很快。提供了取并集交集差集等一些有用的操作
- 需求:取两篇文章的评论者的交集并集差集
- 实现:
public void RedisSetTest()
{
IDatabase db = StackExchangeRedisHelper.GetDatabase(); for (int i = ; i <= ; i++)
{
db.SetAdd("文章1", i);
}
for (int i = ; i <= ; i++)
{
db.SetAdd("文章2", i);
}
RedisValue[] inter = db.SetCombine(SetOperation.Intersect, "文章1", "文章2");
RedisValue[] union = db.SetCombine(SetOperation.Union, "文章1", "文章2");
RedisValue[] dif1 = db.SetCombine(SetOperation.Difference, "文章1", "文章2");
RedisValue[] dif2 = db.SetCombine(SetOperation.Difference, "文章2", "文章1");
int x = ;
Console.WriteLine("两篇文章都评论过的用户");
foreach (var item in inter.OrderBy(m => m).ToList())
{
Console.Write((string)item + " ");
}
Console.WriteLine("\n评论过两篇文章中任意一篇文章的用户");
foreach (var item in union.OrderBy(m => m).ToList())
{
Console.Write((string)item + " ");
}
Console.WriteLine("\n只评论过其第一篇文章的用户");
foreach (var item in dif1.OrderBy(m => m).ToList())
{
Console.Write((string)item + " ");
}
Console.WriteLine("\n只评论过其第二篇文章的用户");
foreach (var item in dif2.OrderBy(m => m).ToList())
{
Console.Write((string)item + " ");
}
db.KeyDelete("文章1");
db.KeyDelete("文章2");
Console.ReadLine();
}

SortedSet
- 特点:有序排列,值不可重复。类似Set,不同的是sortedset的每个元素都会关联一个double类型的score,用此元素来进行排序
- 需求:显示文章被赞最多的十条评论
- 实现:
public void HotestUserTop10()
{
IDatabase db = StackExchangeRedisHelper.GetDatabase();
//模拟有一百名评论者,开始每个用户被“赞”的次数为1
List<SortedSetEntry> entrys = new List<SortedSetEntry>();
for (int i = ; i <= ; i++)
{
db.SortedSetAdd("文章1", "评论者" + i, );
}
//评论者2又被赞了两次
db.SortedSetIncrement("文章1", "评论者2", ); //对应的值的score+2
//评论者101被赞了4次
db.SortedSetIncrement("文章1", "评论者101", ); //若不存在该值,则插入一个新的
RedisValue[] userStores = db.SortedSetRangeByRank("文章1", , , Order.Descending);
for (int i = ; i < userStores.Length; i++)
{
Console.WriteLine(userStores[i]+":"+ db.SortedSetScore("文章1", userStores[i]));
}
db.KeyDelete("文章1");
Console.ReadLine();
}

Hash
- 特点:Hash是一个string类型的field和value的对应表,它更适合来存储对象,相比于每个属性进行一次缓存,利用hash来存储整个对象会占用更小的内存。但是存储速度并不会更快
- 需求:存储一个学生的基本信息
- 实现:
public void RedisHashTest()
{
IDatabase db = StackExchangeRedisHelper.GetDatabase();
db.HashSet("student1", "name", "张三");
db.HashSet("student1", "age", );
db.HashSet("student1", "class", "五年级");
Console.WriteLine(db.HashGet("student1", "name"));
RedisValue[] result = db.HashGet("student1", new RedisValue[] { "name", "age","class" });
Console.WriteLine(string.Join(",",result));
db.KeyDelete("student1");
Console.ReadLine();
}

以下代码是我分别用stringset和hash来存储对象进行的时间及内存比较,内存可通过redis的info命令来查看。
最终显示耗时方面stringset稍微快一点点,内存占用stringset却是hash的二倍
public void RedisHashVsStringSet()
{
IDatabase db = StackExchangeRedisHelper.GetDatabase();
Stopwatch sw = new Stopwatch();
sw.Start();
//for (int i = 0; i < 100000; i++)
//{
// db.HashSet("studenths" + i, "name", "张三" + i);
// db.HashSet("studenths" + i, "age", 12 + i);
// db.HashSet("studenths" + i, "class", "五年级" + i);
//}
//Console.WriteLine(sw.Elapsed.TotalMilliseconds);
//sw.Restart();
for (int i = ; i < ; i++)
{
db.StringSet("studentstr_name" + i, "张三" + i);
db.StringSet("studentstr_age" + i, + i);
db.StringSet("studentstr_class" + i, "五年级" + i);
}
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
//for (int i = 0; i < 100000; i++)
//{
// db.KeyDelete("studenths" + i);
// db.KeyDelete("studentstr_name" + i);
// db.KeyDelete("studentstr_age" + i);
// db.KeyDelete("studentstr_class" + i);
//}
Console.ReadLine();
}
StackExchange.Redis的使用 Redis五种数据类型的应用的更多相关文章
- redis的入门篇---五种数据类型及基本操作
查看所有的key keys * 清空所有的key flushall 检查key是否存在 exists key 设置已存在的key的时长 expire key //设置key为10s 查看key还剩多少 ...
- redis五种数据类型的使用(zz)
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- redis五种数据类型的使用
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- redis五种数据类型的使用场景
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis五种数据类型-设置key的过期时间
1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...
- Redis安装及五种数据类型
redis是非关系型数据库,也叫内存数据库.数据是键值对的形式,通过key查找value 安装Radis:6379 sudo apt-get update sudo apt-get install r ...
- Redis: Redis支持五种数据类型
ylbtech-Redis: Redis支持五种数据类型 Redis支持五种数据类型:string(字符串) ,hash(哈希),list(列表),set(集合)及zset(sorted set:有序 ...
- Redis支持的五种数据类型
redis支持的五种数据类型: 1.string(字符串) 2.hash(哈希) Redis hash 是一个键值(key=>value)对集合. Redis hash是一个string类型的f ...
- Redis学习笔记(3)—— 五种数据类型&keys的通用操作
一.Redis数据结构介绍 redis是一种高级的key-value的存储系统,其中的key是字符串类型,尽可能满足如下几点: 1)key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低 ...
- (转) 淘淘商城系列——Redis五种数据类型介绍
http://blog.csdn.net/yerenyuan_pku/article/details/72855562 Redis支持五种数据类型:string(字符串),hash(哈希),list( ...
随机推荐
- Redis Windows版安装详解
一.下载Redis Redis下载有两个途径一是官网.二是Github,由于Redis官方只支持Linux系统,所以官网是没有Windows版本的,不过微软开源团队维护了一份所以我们可以使用这个. 官 ...
- cors解决ajax请求跨域问题
Access-Control-Allow-Origin: * 适用tomcat部署的项目 在web.xml里添加以下内容 <filter> <filter-name>CorsF ...
- 自动化selenium开发
一.开发环境搭建 1.Firefox浏览器 1.1 下载firefix并安装. 1.2 Firefox中打开"开始菜单“ -> ”开发者“ -> ”获取更多工具“ -> 搜 ...
- IDL 存储数组
IDL中的数组在内存中是按行存储的,这是因为IDL最初设计的设计目的是用来处理行扫描卫星数据. 1.一维数组 m个元素的一维数组arr[m]的存储方式为 arr[0]→arr[1]→...→arr[m ...
- asp.net mvc5中使用缓存依赖SqlCacheDependency
缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...
- Golang:使用自定义模板发送邮件
https://medium.com/@itsHabib/sending-emails-with-go-using-a-custom-template-ae863b65a859 作者:Michael ...
- JAVA继承:编译与运行的关系(编译看左边,运行看右边)
"成员变量,静态方法看左边:非静态方法:编译看左边,运行看右边." 意思是:当父类变量引用子类对象时(Fu f = new Zi();),在这个引用变量f指向的对象中,他的成员变量 ...
- 【特效】体验很好的导航hover效果移出恢复当前位置
很常见的一种导航的hover效果,鼠标放上后除了正常的hover,在移出整个导航后,会恢复当前栏目的特殊样式,分别有横向和纵向的导航.代码也比较简单,设置一个当前栏目的class,用index()找到 ...
- CSS之 relative 特性
1. 自身特性: 如left,right,top,bottom定位都是相对于自身位置定位. 当left与right同时存在,lfet生效. 当top与bottom同时存在,top生效. 无侵入,保留原 ...
- win10 uwp 参考
态度随意申请专栏,没想到通过 看了我的博客,都是在别的大神博客看到,然后修改他们的 我看到的大神博客 东邪独孤 http://www.cnblogs.com/tcjiaan/ 老周,买了他的<W ...