千家信息网

C#中StackExchange.Redis怎么用

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关C#中StackExchange.Redis怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。安装StackExchange.Redi
千家信息网最后更新 2025年01月19日C#中StackExchange.Redis怎么用

这篇文章将为大家详细讲解有关C#中StackExchange.Redis怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

安装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);//指定连接的库 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(10));//设置时间,10s后过期。

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

取对象(反序列化)

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

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

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

List(列表)

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

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

for (int i = 0; i < 10; i++){    database.ListRightPush("list", i);//从底部插入数据}for (int i = 10; i < 20; i++){    database.ListLeftPush("list", i);//从顶部插入数据}var length = database.ListLength("list");//长度 20var 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);//获取Modelstring hashcang = database.HashGet("user", "cang");demo = JsonConvert.DeserializeObject(hashcang);//反序列化//获取ListRedisValue[] values = database.HashValues("user");//获取所有valueIList demolist = new List();foreach (var item in values){    Demo hashmodel = JsonConvert.DeserializeObject(item);    demolist.Add(hashmodel);}

发布订阅

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

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

ISubscriber sub = _conn.GetSubscriber();//订阅 Channel1 频道sub.Subscribe("Channel1", new Action((channel, message) =>{    Console.WriteLine("Channel1" + " 订阅收到消息:" + message);}));for (int i = 0; i < 10; i++){    sub.Publish("Channel1", "msg" + i);//向频道 Channel1 发送信息    if (i == 2)    {        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", 25);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", 22);batch.Execute();Task.WaitAll(t1, t2);Console.WriteLine("Age:" + database.StringGet("age"));Console.WriteLine("Name:" + database.StringGet("name"));            //批量写for (int i = 0; i < 100000; i++){    batch.StringSetAsync("age" + i, i);}batch.Execute();//批量读List> valueList = new List>();for (int i = 0; i < 10000; i++){    Task 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(10))){    try    {        //TODO:开始做你需要的事情        Thread.Sleep(5000);    }    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怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

订阅 数据 对象 序列 事物 消息 存储 数据库 类型 频道 命令 字符 字符串 C# 元素 发布者 客户 客户端 篇文章 订阅者 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络技术的道德和隐私方面 苏州对日软件开发公司有哪些 江苏电商软件开发哪家实惠 公安网络安全与执法专业 安卓软件开发最新招聘 O2O互联网科技公司 带薪培训软件开发 天津电力卫星授时服务器云服务器 软件开发相关大学 晶和软件开发岗面试 长春市第二中专网络技术 怎么查看网络安全监控日志 深圳知之为网络技术有限公司 中核集团网络安全中心 计算机网络技术行业认知 数据库备份的目的是 国家安全教育 网络安全 服务器安全协议书怎么获得 系统已被服务器端 税局网络安全等级保护 软件开发变成了销售支撑 热血传奇擒龙手技能数据库 中国网络安全大赛选手排名 机器人上位机软件开发招聘 中小学家庭教网络安全感 软件开发不养老吗 苹果13服务器出问题怎么解决 服务器文件名乱码 在数据库中删除元组用到的 podo服务器异常
0