【转载】.net redis组件-csredis

为什么选择CSRedis

ServiceStack.Redis 是商业版,免费版有限制;

StackExchange.Redis 是免费版,但是内核在 .NETCore 运行有问题经常 Timeout,暂无法解决;

CSRedis于2016年开始支持.NETCore一直迭代至今,实现了低门槛、高性能,和分区高级玩法的.NETCore redis-cli SDK;

在v3.0版本更新中,CSRedis中的所有方法名称进行了调整,使其和redis-cli保持一致,如果你熟悉redis-cli的命令的话,CSRedis可以直接上手,这样学习成本就降低很多。

安装CSRedis

直接使用Visual Studio中的Nuget包管理器搜索安装

开始之前

使用连接字符串创建redis实例,执行RedisHelper.Initialization()进行初始化。

var csredis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=YourPassword");
RedisHelper.Initialization(csredis);

如果你没有给redis设置密码,那么直接写上ip就行,否则的话要把password写进连接字符串中。

var csredis = new CSRedis.CSRedisClient("127.0.0.1:6379");
RedisHelper.Initialization(csredis);

然后就可以进行redis操作了。

字符串(string)

since Redis keys are strings, when we use the string type as a value too, we are mapping a string to another string.

关于字符串的value:

  • value可以用来存储任意格式的数据,如json、jpg甚至是视频文件;
  • value的最大容量是512M;
  • value可以存储3种类型的值:字节串(byte string)、整数(int)、浮点数(double);

其中,整数的取值范围和系统的长整数取值范围相同,在32位的操作系统上,整数就是32位的;在64位操作系统上,整数就是64位有符号整数。浮点数的取值范围和IEEE 754标准的双精度浮点数相同。

使用CSRedis进行简单操作
// 添加字符串键-值对
csredis.Set("hello", "1");
csredis.Set("world", "2");
csredis.Set("hello", "3");

// 根据键获取对应的值
csredis.Get("hello");

// 移除元素
csredis.Del("world");

在对同一个键多次赋值时,该键的值是最后一次赋值时的值,实例中hello对应的值最终为3。

由于redis可以对字符串的类型进行“识别”,所以除了对字符串进行增、删、查、之外,我们还可以对整数类型进行自增、自减操作,对字节串的一部分进行读取或者写入。

/*    数值操作    */
csredis.Set("num-key", "24");

// value += 5
csredis.IncrBy("num-key",5); 
// output -> 29

// value -= 10
csredis.IncrBy("num-key", -10); 
// output -> 19
/*    字节串操作    */
csredis.Set("string-key", "hello ");

// 在指定key的value末尾追加字符串
csredis.Append("string-key", "world"); 
// output -> "hello world"

// 获取从指定范围所有字符构成的子串(start:3,end:7)
csredis.GetRange("string-key",3,7)  
// output ->  "lo wo"
    
// 用新字符串从指定位置覆写原value(index:4)
csredis.SetRange("string-key", 4, "aa"); 
// output -> "hellaaword"
非正常情况
  • 对字节串进行自增、自减操作时,redis会报错。
  • 使用Append、SetRange方法对value进行写入时,字节串的长度可能不够用,这时redis会使用空字符(null)将value扩充到指定长度,然后再进行写入操作。

列表(list)

The speed of adding a new element with the LPUSH command to the head of a list with ten elements is the same as adding an element to the head of list with 10 million elements.

使用LPUSH命令,向包含10个元素的列表添加新元素的速度等于向包含一千万个元素的列表添加新元素的速度。

  • 列表可以有序的存储多个字符串(字符串可以重复)等操作;
  • 列表是通过链表来实现的,所以它添加新元素的速度非常快。
// 从右端推入元素
csredis.RPush("my-list", "item1", "item2", "item3", "item4"); 
// 从右端弹出元素
csredis.RPop("my-list");
// 从左端推入元素
csredis.LPush("my-list","LeftPushItem");
// 从左端弹出元素
csredis.LPop("my-list");

// 遍历链表元素(start:0,end:-1即可返回所有元素)
foreach (var item in csredis.LRange("my-list", 0, -1))
{
    Console.WriteLine(item);
}
// 按索引值获取元素(当索引值大于链表长度,返回空值,不会报错)
Console.WriteLine($"{csredis.LIndex("my-list", 1)}"); 

// 修剪指定范围内的元素(start:4,end:10)
csredis.LTrim("my-list", 4, 10);

除了对列表中的元素进行以上简单的处理之外,还可以将一个列表中的元素复制到另一个列表中。在语义上,列表的左端默认为“头部”,列表的右端为“尾部”。

// 将my-list最后一个元素弹出并压入another-list的头部
csredis.RPopLPush("my-list", "another-list");

集合(set)

集合以无序的方式存储各不相同的元素,也就是说在集合中的每个元素的Key都不重复。在redis中可以快速地对集合执行添加、移除等操作。

// 实际上只插入了两个元素("item1","item2")
csredis.SAdd("my-set", "item1", "item1", "item2"); 

// 集合的遍历
foreach (var member in csredis.SMembers("my-set"))
{
    Console.WriteLine($"集合成员:{member.ToString()}");
}

// 判断元素是否存在
string member = "item1";
Console.WriteLine($"{member}是否存在:{csredis.SIsMember("my-set", member)}"); 
// output -> True

// 移除元素
csredis.SRem("my-set", member);
Console.WriteLine($"{member}是否存在:{csredis.SIsMember("my-set", member)}"); 
// output ->  False

// 随机移除一个元素
csredis.SPop("my-set");

以上是对一个集合中的元素进行操作,除此之外还可以对两个集合进行交、并、差操作

csredis.SAdd("set-a", "item1", "item2", "item3","item4","item5");
csredis.SAdd("set-b", "item2", "item5", "item6", "item7");

// 差集
csredis.SDiff("set-a", "set-b"); 
// output -> "item1", "item3","item4"

// 交集
csredis.SInter("set-a", "set-b"); 
// output -> "item2","item5"

// 并集
csredis.SUnion("set-a", "set-b");
// output -> "item1","item2","item3","item4","item5","item6","item7"

另外还可以用SDiffStore,SInterStore,SUnionStore将操作后的结果存储在新的集合中。

散列(hashmap)

在redis中我们可以使用散列将多个键-值对存储在一个redis键上,从而达到将一系列相关数据存放在一起的目的。例如添加一个redis键Artial:1001,然后在这个键中存放ID为1001的文章的标题、作者、链接、点赞数等信息。我们可以把这样数据集看作是关系数据库中的行。

// 向散列添加元素
csredis.HSet("ArticleID:10001", "Title", "了解简单的Redis数据结构");
csredis.HSet("ArticleID:10001", "Author", "xscape");
csredis.HSet("ArticleID:10001", "PublishTime", "2019-01-01");

// 根据Key获取散列中的元素
csredis.HGet("ArticleID:10001", "Title");

// 获取散列中的所有元素
foreach (var item in csredis.HGetAll("ArticleID:10001"))
{
    Console.WriteLine(item.Value);
}

HGet和HSet方法执行一次只能处理一个键值对,而HMGet和HMSet是他们的多参数版本,一次可以处理多个键值对。

var keys = new string[] { "Title","Author","publishTime"};
csredis.HMGet("ID:10001", keys);

虽然使用HGetAll可以取出所有的value,但是有时候散列包含的值可能非常大,容易造成服务器的堵塞,为了避免这种情况,我们可以使用HKeys取到散列的所有键(HVals可以取出所有值),然后再使用HGet方法一个一个地取出键对应的值。

foreach (var item in csredis.HKeys("ID:10001"))
{
    Console.WriteLine($"{item} - {csredis.HGet("ID:10001", item)}");
}

和处理字符串一样,我们也可以对散列中的值进行自增、自减操作,原理同字符串是一样的。

csredis.HSet("ArticleID:10001", "votes", "257");
csredis.HIncrBy("ID:10001", "votes", 40);
// output -> 297

有序集合

有序集合可以看作是可排序的散列,不过有序集合的val成为score分值,集合内的元素就是基于score进行排序的,score以双精度浮点数的格式存储。

// 向有序集合添加元素
csredis.ZAdd("Quiz", (79, "Math"));
csredis.ZAdd("Quiz", (98, "English"));
csredis.ZAdd("Quiz", (87, "Algorithm"));
csredis.ZAdd("Quiz", (84, "Database"));
csredis.ZAdd("Quiz", (59, "Operation System"));

//返回集合中的元素数量
csredis.ZCard("Quiz");

// 获取集合中指定范围(90~100)的元素集合
csredis.ZRangeByScore("Quiz",90,100);

// 获取集合所有元素并升序排序
csredis.ZRangeWithScores("Quiz", 0, -1);

// 移除集合中的元素
csredis.ZRem("Quiz", "Math");

事务

基本事务

事务可以保证一个客户端在执行多条命令时,不被其他客户端打断,这跟关系型数据库的事务是不一样的。事务需要使用MULTI和EXEC命令,redis会将被MULTI和EXEC所包围的代码依次执行,当该事务结束之后,redis才会处理其他客户端的命令。

管道(pipeline)

redis的事务是通过pipeline实现的,使用pipeline时,客户端会自动调用MULTI和EXEX命令,将多条命令打包并一次性地发送给redis,然后redis再将命令的执行结果全部打包并一次性返回给客户端,这样有效的减少了redis与客户端的通信次数,提升执行多次命令时的性能。

var pl = csredis.StartPipe();
for (int i = 0; i < COUNT; i++)
{
    csredis.IncrBy("key-one");
}
pl.EndPipe();
Console.WriteLine($"{csredis.Get("key-one")}");
Console.ReadKey();

Key的过期

redis还允许我们为key设置有效期,当key过期之后,key就不存在了。

redis.Set("MyKey", "hello,world");
Console.WriteLine(redis.Get("MyKey")); 
// output -> "hello,world"

redis.Expire("MyKey", 5); // key在5秒后过期,也可以使用ExpireAt方法让它在指定时间自动过期

Thread.Sleep(6000); // 线程暂停6秒
Console.WriteLine(redis.Get("MyKey"));
// output -> ""

引用

 
 

转载于:https://www.cnblogs.com/OBprogrammer/p/10669056.html

CSRedisCore基本使用示例 是一个高效且易用的 Redis 客户端库,在 .NET Core 项目中可以方便地使用它进行 Redis 操作。通过依赖注入和配置连接池,它可以轻松扩展到高并发和大规模的应用场景中。 阅读详情

相关推荐

Redis 入门 - C#/.NET Core客户端库-CSRedisCore

通过以上步骤,我们已经成功地使用C#/.NET Core和CSRedisCore实现了与Redis数据库的基本交互,并且探索了一些更高级的功能。从简单的键值对操作到复杂的数据结构管理,Redis为我们提供了强大的数据存储和检索能力。希望本文能够帮助你快速入门Redis,并激发你在实际项目中使用Redis的兴趣。Redis不仅仅是一个数据库,它更是你提高应用性能的秘密武器!

java专栏 834

CSRedis功能介绍

ServiceStack.Redis是商业版,免费版有限制; StackExchange.Redis是免费版,早期有Timeout Bug,当前版本使用需要全部使用异步方法方可解决; CSRedis于2016年开始支持.NETCore一直迭代至今(解决上述Bug),实现了低门槛、高性能,和分区高级玩法的redis-cli SDK; v3.0 更新功能 1、CSRedisClient、RedisHelper 方法名调整,所有方法名与redis-cli保持一持; java,python,go,nodejs,p

极客神殿 6798

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1294

基于CSRedisCore程序集调用redis各个功能详解

一个服务实例中创建多个CSRedis实例

h691738337的博客 2458

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1908

inferCNV包安装问题及解决办法

InferCNV是一个由broad研究所开发的,利用单细胞转录组数据分析肿瘤细胞拷贝数变异(CNV)的工具。基本思路是在整个基因组范围内,通过计算肿瘤细胞关于参考的“正常”细胞的相对表达,利用滑窗思想对邻近的基因相对表达,计算拷贝数。 先贴一个官方安装说明: 官方infercnv安装说明 安装infercnv包: if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager") BiocManager:

m0_51042606的博客 6803

.Net Core使用Redis(CSRedis)

前言 CSRedis是国外大牛写的。git地址:https://github.com/2881099/csredis,让我们看看如果最简单的 使用一下CSRedis吧。 引入NuGet 获取Nuget包(目前版本3.0.18)!哈,没错,使用前要通过Nuget来安装下引用,什么?你不知道怎么使用Nuget包?对不起,右上角点下“X” 关掉网页就可以了。 nuget Insta...

weixin_30807779的博客 5696

音频功放电路大全

作为硬件工程师,特别是做纯粹模拟电路、应用于音频功放的工程师,对于A类,B类,AB类,D类,G类,H类,T类功放应该特别熟悉。大多数工程师或许只知道其中的一部分、或者知道大概,为了让更多的工程师掌握更加详尽的音频功放知识,下文对以上说的音频功放做详细的说明。 功放,顾名思义,就是功率放大的缩写。与电压或者电流放大来说,功放要求获得一定的、不失真的功率,一般在大信号状态下工作,因此,功放电路一般包含电压放大或者电流放大电路没有的特殊问题,具体表现在:①输出功率尽可能大;②通常在大信号状态下工作;③非线性失真突

ltqdxl的博客 6595

csredis memory

我整理的一些关于【Redis,连接池,客户端】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/eDOcp1CSRedis 的内存管理机制 在现代应用程序中,Redis 被广泛应用于缓存、数据存储以及消息传递等场景。而 CSRedis 是一个开源的 .NET 客户端,它兼容 R...

weixin_41446353的博客 99

Android Geckoview实战:5分钟搞定JS与原生交互(附完整Demo代码)

本文详细介绍了在Android应用中使用GeckoView替代系统WebView,构建稳定高效的JavaScript与原生代码交互桥梁的实战方法。通过WebExtension架构,文章提供了从环境配置、扩展开发到Android端集成的完整步骤,并附有可运行的Demo代码,帮助开发者快速解决混合应用中的兼容性问题。

u5v6w7的博客 936

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 290

.net core Redis库 CSRedis

由于servicestack.redis收费,基于有人说StackExchange.Redis 使用会出现一些问题比如会超时, 找到了CSRedis这个库,很强大很实用。另外有兴趣的朋友还可以试试另一个支持Core的redis库NewLife.Redis nuget Install-Package CSRedisCore 源码地址:https://github.com/288...

weixin_30355437的博客 313

CUDA&PCL 点云体素下采样

CUDA&PCL 点云体素下采样

dayuhaitang1的博客 1268

.net使用redis

1、redis安装、卸载、配置 2、.net项目中使用redis https://www.cnblogs.com/itmu89/p/7118474.html ServiceStack.Redis是商业版,免费版有限制; StackExchange.Redis是免费版,早期有Timeout Bug,当前版本使用需要全部使用异步方法方可解决; CSRedis于2016年开始支持...

weixin_30511107的博客 177

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

asp.net Code CSRedis学习记录

1.安装Redis for windows 安装地址https://github.com/MicrosoftArchive/redis/releases Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再...

weixin_30444105的博客 177

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

.NetCore Session.Redis (转载)

首先创建ASP.NET CORE Web项目,然后按如下顺序操作。 1.添加nuget程序包: Microsoft.AspNetCore.Session; Microsoft.AspNetCore.DataProtection.Redis; Microsoft.Extensions.Caching.Redis.Core; Microsoft.Extensions.Ca...

261

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四) 转载于:https://github.com/Meowv/Blog 上篇文章完成了文章增删改的接口和友情链接列表的接口,本篇继续。 善于思考的同学肯定发现,在执行增删改操作后,Redis缓存中的数据还是存在的,也就意味着查询接口返回的数据还是旧的,所以在写接口之前,先完成一下清缓存的操作。 移除缓存 移除缓存我这里找了一个新的包:Caching.CSRedis,选他是因为微软的包Microsoft.Extensions

u010583940的博客 224

.net Redis使用公共方法引用CSRedisCore

public class CsredisConfig : RedisHelper { public static Dictionary<string, RedisConfig> RedisConfigs; public CsredisConfig() { RedisConfigs = new Dictionary<strin...

weixin_30483697的博客 408

StackExchange.Redis TimeOut

不知道大家在用StackExchange.Redis 时是否遇到过 TimeOut的错误,有人说: 【     这不是BUG,这是StackExchange.Redis有意这么设计的,因为StackExchange.Redis采用单线程,如果一个请求耗时太长会阻塞后面的请求,所以它加了请求超时限制,因为Redis大多数情况是在内网使用,设计合理的请求是不会触发默认的超时值的,即如果...

ai6688的博客 570

HangFire持久化数据到Redis

教程:ASP.NET Core MVC上的Redis上的Hangfire 入门 要在ASP.NET Core MVC项目中针对Redis使用Hangfire,首先需要安装至少以下两个软件包:Hangfire.AspNetCore和Hangfire.Redis.StackExchange。 在Startup.cs,这些都是最起码,你将需要编写使迟发型对Redis的代码: pub...

dengyucheng1003的博客 1153

.Net Core使用Redis-从安装到使用

一、安装 本文使用的操作系统是Centos7 在Redis中文网下载最新的Redis压缩包:http://www.redis.cn/ 把包上传到Liunx服务器上,cd 到包所在的目录执行以下命令 #解压,执行命令时请按照您当前包的名称为准 tar xzf redis-5.0.3.tar.gz #解压完成后会得到一个文件夹,cd 进那个文件夹执行 #安装 mak...

weixin_33795093的博客 450

Redis in .NET Core 入门:(4) LIST和SET

Redis in .NET Core 入门:(4) LIST和SET 原文:Redis in .NET Core 入门:(4) LIST和SET第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565....

weixin_30333885的博客 176
上一篇: 【转载】 C# 中的Async 和 Await 的用法详解
下一篇: 初识微信小程序学习
a6926521
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值