安装 StackExchange.Redis

在 NuGet 中搜索 StackExchange.Redis 和 Newtonsoft.Json,直接点击按钮安装即可。

StackExchange.Redis 是 C# 操作 Redis 数据库的客户端。

Newtonsoft.Json 用来序列化 Josn 字符串及反序列化拿到对象。

引用及初始化

引用

using StackExchange.Redis;
using Newtonsoft.Json;

初始化 redis

ConnectionMultiplexer _conn = RedisConnectionHelp.Instance;//初始化
var database = _conn.GetDatabase();//指定连接的库 0

String(字符串)

String 是最常用的一种数据类型,普通的 key/value 存储都可以归为此类 。

一个 Key 对应一个 Value,string 类型是二进制安全的。Redis 的 string 可以包含任何数据,比如 jpg 图片(生成二进制)或者序列化的对象。

database.StringSet("name", "苍");//设置StringSet(key, value)
string str = database.StringGet("name");//结果:苍
database.StringSet("name_two", str, TimeSpan.FromSeconds());//设置时间,10s后过期。

存对象(对象需要序列化转成字符串,再存进库中)

取对象(反序列化)

//创建对象
Demo demo = new Demo()
{
Name = "苍",
Age = ,
Height = 1.83
};
string demojson = JsonConvert.SerializeObject(demo);//序列化
database.StringSet("model", demojson); string model = database.StringGet("model");
demo = JsonConvert.DeserializeObject<Demo>(model);//反序列化

StringIncrement 增量、StringDecrement 减量(默认值同为1)

double increment = ;
double decrement = ;
for (int i = ; i < ; i++)
{
increment = database.StringIncrement("StringIncrement", );//增量,每次+2
}
for (int i = ; i < ; i++)
{
decrement = database.StringDecrement("StringIncrement");//减量,每次-1
}

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部。

一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过 40 亿个元素)。

for (int i = ; i < ; i++)
{
database.ListRightPush("list", i);//从底部插入数据
}
for (int i = ; i < ; i++)
{
database.ListLeftPush("list", i);//从顶部插入数据
}
var length = database.ListLength("list");//长度 20 var rightPop = database.ListRightPop("list");//从底部拿出数据 var leftpop = database.ListLeftPop("list");//从顶部拿出数据 var list = database.ListRange("list");

Hash(哈希)

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。相对于将对象的每个字段存成单个 string 类型。一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

Hash 的存储,给我的感觉类似于关系型数据库。以下面的例子为例,存储一个 user 对象(关系型数据库里的表名), cang、shan、yun (关系型数据库里的数据的主键、唯一值),json(字段)

string json = JsonConvert.SerializeObject(demo);//序列化
database.HashSet("user", "cang", json);
database.HashSet("user", "shan", json);
database.HashSet("user", "yun", json);

//获取Model
string hashcang = database.HashGet("user", "cang");
demo = JsonConvert.DeserializeObject<Demo>(hashcang);//反序列化 //获取List
RedisValue[] values = database.HashValues("user");//获取所有value
IList<Demo> demolist = new List<Demo>();
foreach (var item in values)
{
Demo hashmodel = JsonConvert.DeserializeObject<Demo>(item);
demolist.Add(hashmodel);
}

发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式,可以用于消息的传输,Redis 的发布订阅机制包括三个部分,发布者,订阅者和 Channel。适宜做在线聊天、消息推送等。

发布者和订阅者都是 Redis 客户端,Channel 则为 Redis 服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息,客户端可以订阅任意数量的频道。

ISubscriber sub = _conn.GetSubscriber();

//订阅 Channel1 频道
sub.Subscribe("Channel1", new Action<RedisChannel, RedisValue>((channel, message) =>
{
Console.WriteLine("Channel1" + " 订阅收到消息:" + message);
})); for (int i = ; i < ; i++)
{
sub.Publish("Channel1", "msg" + i);//向频道 Channel1 发送信息
if (i == )
{
sub.Unsubscribe("Channel1");//取消订阅
}
}

因为当 i == 2 的时候取消订阅,所以收到的订阅消息只有3条。

事务

事物开启后,会在调用 Execute 方法时把相应的命令操作封装成一个请求发送给 Redis 一起执行。

这里通过 CreateTransaction 函数(multi)来创建一个事物,调用其 Execute 函数(exec)提交事物。

其中的 "Condition.StringEqual("name", name)" 就相当于 Redis 命令中的 watch name。

string name = database.StringGet("name");
string age = database.StringGet("age");
var tran = database.CreateTransaction();//创建事物
tran.AddCondition(Condition.StringEqual("name", name));//乐观锁
tran.StringSetAsync("name", "海");
tran.StringSetAsync("age", );
database.StringSet("name", "Cang");//此时更改 name 值,提交事物的时候会失败。
bool committed = tran.Execute();//提交事物,true成功,false回滚。

因为提交事物的过程中,name 值被修改,所以造成了回滚,所有给 name 赋值海,age 赋值25都失败了。

Batch 批量操作

batch 会把所需要执行的命令打包成一条请求发到 Redis,然后一起等待返回结果。减少网络开销。

var batch = database.CreateBatch();

//批量写
Task t1 = batch.StringSetAsync("name", "羽");
Task t2 = batch.StringSetAsync("age", );
batch.Execute();
Task.WaitAll(t1, t2);
Console.WriteLine("Age:" + database.StringGet("age"));
Console.WriteLine("Name:" + database.StringGet("name")); //批量写
for (int i = ; i < ; i++)
{
batch.StringSetAsync("age" + i, i);
}
batch.Execute(); //批量读
List<Task<RedisValue>> valueList = new List<Task<RedisValue>>();
for (int i = ; i < ; i++)
{
Task<RedisValue> tres = batch.StringGetAsync("age" + i);
valueList.Add(tres);
}
batch.Execute();
foreach (var redisValue in valueList)
{
string value = redisValue.Result;//取出对应的value值
}

Lock(分布式锁)

由于 Redis 是单线程模型,命令操作原子性,所以利用这个特性可以很容易的实现分布式锁。

RedisValue token = Environment.MachineName;
//lock_key表示的是redis数据库中该锁的名称,不可重复。
//token用来标识谁拥有该锁并用来释放锁。
//TimeSpan表示该锁的有效时间。10秒后自动释放,避免死锁。
if (database.LockTake("lock_key", token, TimeSpan.FromSeconds()))
{
try
{
//TODO:开始做你需要的事情
Thread.Sleep();
}
finally
{
database.LockRelease("lock_key", token);//释放锁
}
}

StackExchange.Redis 封装

里面是封装及测试代码

链接: https://pan.baidu.com/s/1rT9z567MVtfzQtnvdUxffw 密码: 5k1b

环境:vs2013 + .NET framework 4.5


相关文章:Redis Windows版下载与安装

Redis 可视化工具 Redis Desktop Manager

Redis 主从配置(Windows版)

C# StackExchange.Redis 用法总结的更多相关文章

  1. StackExchange.Redis.Extensions.Core 源码解读之 Configuration用法

    前言 之前接触到Redis,然后选用了对StackExchange.Redis又一层封装的StackExchange.Redis.Extensions.Core类库.阅读源代码的过程中发现了他使用Co ...

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

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

  3. StackExchange.Redis 使用-配置

    Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.Redis 提供了一个丰富的配置模型,当调用Connect 或者 ConnectAsync 时需要 ...

  4. StackExchange.Redis 访问封装类

    最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...

  5. StackExchange.Redis 使用-配置 (四)

    Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.Redis 提供了一个丰富的配置模型,当调用Connect 或者 ConnectAsync 时需要 ...

  6. StackExchange.Redis 使用-同步 异步 即发即弃 (三)

    访问单个服务器 有时候需要为单个服务器指定特定的命令 . IServer server = redis.GetServer("localhost", 6379); GetServe ...

  7. StackExchange.Redis的使用 Redis五种数据类型的应用

    ConnectionMultiplexer ConnectionMultiplexer 是StackExchange.Redis的核心对象,用这个类的实例来进行Redis的一系列操作,对于一个整个应用 ...

  8. StackExchange.Redis学习笔记(五) 发布和订阅

    Redis命令中的Pub/Sub Redis在 2.0之后的版本中 实现了 事件推送的  发布订阅命令 以下是Redis关于发布和订阅提供的相关命令 SUBSCRIBE channel [channe ...

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

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

随机推荐

  1. JAVA中static的作用

    static表示"全局"."静态"的意思,用来修饰成员变量和成员方法,不过在JAVA中没有全局的意思. 1. 被static修饰的成员变量和成员方法独立于该类的 ...

  2. history.go(-1)和History.back()的区别

    简单的说就是:go(-1): 返回上一页,原页面表单中的内容会丢失:back(-1): 返回上一页,原页表表单中的内容会保留,一般还是back(-1)用的多

  3. 初识 Nginx

    Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器. Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名.很多高知名度的网站 ...

  4. Docker实现容器具有固定IP

    Docker的网络类型 Docker安装后,默认会创建三种网络 $ docker network ls NETWORK ID NAME DRIVER SCOPE 6bdc00ad2a8d bridge ...

  5. ABAP WB01 BDC ”No batch input data for screen & &“ ”没有屏幕 & & 的批输入数据“

    公司今年计划大批扩建门店,需要自动化维护相关主数据,其中就有一步通过调用 WB01的BDC录屏来自动创建地点,前台跑没有问题,但后台JOB死活不行,屏幕是以前同事录好的,只能硬着头皮修改. 后台任务日 ...

  6. 使用Deeplearning4j进行GPU训练时,出错的解决方法

    一.问题 使用deeplearning4j进行GPU训练时,可能会出现java.lang.UnsatisfiedLinkError: no jnicudnn in java.library.path错 ...

  7. CentOS7中设置Tomcat8开机自启动

    CentOS7中设置Tomcat8开机自启动 本文介绍了在centos7中配置tomcat的开机自启动的一些操作步骤,仅供参考. 环境是CentOS 7 ,jdk版本是1.8.0_191,tomcat ...

  8. Canvas 旋转的图片

    var image = new Image(), counter = 0; image.onload = function () { var CANVAS_WIDTH = 300, CANVAS_HE ...

  9. Linux系统查毒软件ClamAV (online)

    ClamAV是一个可用于Linux平台上的开源杀毒引擎,可检测木马.病毒.恶意软件和其他恶意的威胁. 官网:http://www.clamav.net/ 一.CentOS环境安装 # yum inst ...

  10. CentOS7单独安装Apache Bench压力测试工具

    用于并发测试. 1.安装 # need to run ab,apache portable runtime yum install apr-util # yum install yum-utils # ...