我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C# StackExchange.Redis 用法汇总

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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<Demo>(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");//长度 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 = 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<Task<RedisValue>> valueList = new List<Task<RedisValue>>();
for (int i = 0; i < 10000; 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(10)))
{
    try
    {
        //TODO:开始做你需要的事情
        Thread.Sleep(5000);
    }
    finally
    {
        database.LockRelease("lock_key", token);//释放锁
    }
}

StackExchange.Redis 封装

里面是封装及测试代码

链接: https://pan.baidu.com/s/17Yh2L_57SJfOvo8Vxj504w 提取码: tcw3

环境:vs2013 +.NET framework 4.5

相关文章:

Redis Windows版下载与安装

Redis 可视化工具 Redis Desktop Manager

Redis 主从配置(Windows版)

到此这篇关于C# StackExchange.Redis 用法总结的文章就介绍到这了,更多相关C# StackExchange.Redis 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C# StackExchange.Redis 用法汇总

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中StackExchange.Redis怎么用

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

Linuxpaste命令用法汇总

paste命令是linux下的一个文件管理命令,paste命令可以把每个文件以列对列的方式,然后一列列地加以合并,也就是合并两个文件,这篇文章主要介绍了Linuxpaste命令使用方法,感兴趣的朋友一起看看吧
2022-12-21

C++中的各种容器的使用方法汇总

这篇文章主要介绍了C++中的各种容器的使用方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-10

C# TreeView控件使用技巧汇总

这篇文章主要介绍了C# TreeView控件使用技巧汇总,TreeView控件在窗体应用里面使用也是频率比较高的,我们在使用TreeView一般是对资源的分层展示,类似数据结构里面树的凹入表示法
2022-11-13

Linux paste命令用法汇总

目录一、paste命令使用方法1.1 paste命令作用1.2 paste命令选项二、paste命令使用实例2.1 将两个文件,按照行合并2.2 将两个文件按照行合并,同时指定间隔符2.3 将两个文件串行合并一、paste命令使用方法 1.
2022-12-21

Android中Notification的用法汇总

我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问题的。 我们也知道Android系统也是在不断升级的,
2022-06-06

算法题汇总

关于力扣刷题注意事项:有些题目要求原数据上修改,就没必要返还任何数值不要怀疑程序为什么给你报错,肯定你逻辑措了一.难度一般力扣题目汇总(机器人返回原点,按奇偶排序,数字的补数)力扣题目汇总(重复N次元素,反转字符串,斐波那契数)力扣题目汇总
2023-01-31

【jmeter】BeanShell用法详细汇总

BeanShell是一个开源的Java脚本语言,可以在JMeter中使用BeanShell来编写自定义的脚本逻辑。下面是一些常见的BeanShell用法的详细汇总:1. 导入类和包:可以使用import语句导入需要使用的类和包。例如:```
2023-09-09

Reacthooks使用方法全面汇总

这篇文章主要介绍了reacthooks实现原理,文中给大家介绍了useStatedispatch函数如何与其使用的FunctionComponent进行绑定,实例代码给大家介绍的非常详细,需要的朋友可以参考下
2022-11-13

Android绘图常用方法汇总

Android绘图常用方法有哪些,下面一一为大家列举: 1、有关画笔(Paint)的方法Paint mPaint= new Paint(); mPaint.setAntiAlias(true); // 消除锯齿 mPaint.setStro
2022-06-06

C#中Response.Write常见问题汇总

在C#中,Response.Write方法常见的问题汇总包括以下几个方面:1. 输出乱码:如果输出的内容包含非ASCII字符,可能会出现乱码问题。可以通过设置Response的字符编码来解决:Response.ContentEncoding
2023-08-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录