在.net中使用redis(StackExchange.Redis)
本文介绍如何在.net中使用redis
安装
代码使用
StackExchange.Redis基础使用
StackExchange.Redis中的事务
-
- 安装Chocolatey请看Chocolatey安装
- 安装redis
choco install redis-64 - 运行
redis-server.exe如果运行失败,设置环境变量SET PATH=%PATH%;"c:\Program Files\Redis" - 创建一个控制台程序,安装Nuget包
StackExchange.Redis
-
- 创建ConnectionMultiplexer实例
public class RedisConnectorHelper
{
private static Lazy<ConnectionMultiplexer> lazyConnection;
static RedisConnectorHelper ()
{
lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect("localhost");
});
}
public static ConnectionMultiplexer Connection
{
get { return lazyConnection.Value; }
}
}
创建这个包含静态构造函数的类的目的,就是避免重复创建ConnectionMultiplexer提高性能和避免Azure限制
- 保存数据
public void SavaData()
{
IDatabase db = RedisConnectorHelper.Connection.GetDatabase();
Random rd = new Random();
for(int i = 0; i < 10000; i++)
{
int num = rd.Next();
db.StringSet($"Ye{i}", num);
}
}
- 读取数据
public void ReadData()
{
IDatabase db = RedisConnectorHelper.Connection.GetDatabase();
for(int i = 0; i < 10000; i++)
{
RedisValue value = db.StringGet($"Ye{i}");
Console.WriteLine(value);
}
Console.ReadKey();
}
-
- ConnectionMultiplexer类实例
ConnectionMultiplexer类实例最好只创建一次
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
ConnectionMultiplexer类实现了IDisposable接口,你在不需要redis实例的时候可以手动释放他,但是我们一般不这么做,因为我们需要复用这个实例
- 使用redis数据库
获取数据库
写法一,不带数据
IDatabase db = redis.GetDatabase();
写法二,带自定义数据
int databaseNumber = 1;
object asyncState = 2;
IDatabase db = redis.GetDatabase();
使用数据库中的方法
db.StringAppend("YeJaiWei", "!");
await db.StringAppendAsync("YeJaiWei", "?");
可用的redis操作方法可以访问 https://redis.io/commands
- redis数据库的数据类型
Strings
Strings类型的数据,可以包含任何类型的数据,只要最终可以编码成二进制都行
db.StringSet("a", "你好吗");
b.StringGet("a")
Lists
list就是一个数组类似的结构,由string构成,使用方法如下
db.ListLeftPush("myList", "b"); // 如果不存在myList结构,那么创建一个名为myList的List集合,将值追加到最前面
RedisValue result = db.ListGetByIndex("myList", 0); // 根据索引获取结合中的值
还有很多其他的操作方法,请自行查阅
list最多的元素可以有4294967295个,访问list中的元素,两端的速度比中间的快
Sets
上面讲的list是有序的集合,可以通过索引访问,但是set是无序的,成员都是唯一的不重复,使用方式如下
db.SetAdd("mySet", "aaa"); // mySet不存在则创建
RedisValue[] result = db.SetMembers("mySet");
Hashes
Hashes顾名思义就是用来表示键值对对象的集合,可存储量非常大,可以有4294967295个键值对,使用方式如下
db.HashSet("myHash", "name", "yejiawei");
RedisValue result = db.HashGet("myHash", "name");
Sorted sets
此数据类型是redis最引以为傲的成果,作用是使用score将无序的set排个序,从最小的score到最大的score排序
成员都是唯一的,但是score可以是重复的,由于元素被score排序了,访问set中间的元素也是非常迅速的
db.SortedSetAdd("mySortedSet","aaa", 11);
RedisValue result = db.SortedSetScore("mySortedSet","aaa");
- redis中的pub/sub
使用pub/sub对开发分布式程序来说帮助很大,订阅和发布之间的通信是通过channel实现的
使用步骤如下
首先,创建Subscriber实例
ISubscriber sub = redis.GetSubscriber();
使用订阅者
sub.Subscribe("message", (channel, message) =>
{
Console.WriteLine(message);
});
使用发布者(这个发布者可以在其他的机器上面运行)
sub.Publish("message", "你好");
- 访问单个的服务器
有时候需要维护数据库,查看数据库相关的信息
查看redis里面连接的服务器端口号
EndPoint[] ep = redis.GetEndPoints();
创建Server实例
IServer server = redis.GetServer("localhost", 6379);
访问服务器信息
DateTime lastSaveTime = server.LastSave(); // 上次保存时间
- Fire-and-Forget模式的使用
有的方法会返回值,但是我们对这个值不感兴趣,那么我们可以不让它返回,可以提高性能
一个使用的例子
var test = db.StringIncrement("Ye1", 2, CommandFlags.FireAndForget); // 指定了此flag,int类型的都返回默认值0,string类型返回默认值null
var result = db.StringGet("Ye1");
-
写法一,事务写法
IDatabase db = ConnectionMultiplexer.Connect("localhost").GetDatabase();
ITransaction tran = db.CreateTransaction(); // 创建一个Transaction实例
tran.AddCondition(Condition.HashNotExists("YeTran", "Test")); // 给事务添加判断条件
tran.HashSetAsync("YeTran", "Test", "hahaha");
bool committed = tran.Execute(); // 执行事务
if(committed)
{
Console.WriteLine("存好了");
}else
{
Console.WriteLine("已经有了");
}
写法二,内置操作写法
IDatabase db = ConnectionMultiplexer.Connect("localhost").GetDatabase();
bool committed = db.HashSet("YeTran", "Test", "hahaha", When.NotExists);
if(committed)
{
Console.WriteLine("存好了");
}else
{
Console.WriteLine("已经有了");
}
在.net中使用redis(StackExchange.Redis)的更多相关文章
- EF+Redis(StackExchange.Redis)实现分布式锁,自测可行
电商平台 都会有抢购的情况,比如 1元抢购. 而抢购 最重要的 就是库存,很多情况下 库存处理不好,就会出现超卖现象. 本文将用redis为缓存,StackExchange 框架,消息队列方式 实现 ...
- StackExchange.Redis性能调优
大家经常出现同步调用Redis超时的问题,但改成异步之后发现错误非常少了,但却可能通过前后记日志之类的发现Redis命令非常慢. PS: 以后代码都在Windows bash中运行,StackExch ...
- 扩展 StackExchange.Redis 支持实体
一.StackExchange.Redis StackExchange.Redis是由Stack Overflow开发的C#语言Redis客户端,使用广泛,本文针对 StackExchange.Red ...
- (三)Redis for StackExchange.Redis
目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis StackExchange.Re ...
- RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用
本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...
- StackExchange.Redis在net中使用
redis 官网https://redis.io redis 下载 进入下载页面 https://redis.io/download https://github.com/MicrosoftArc ...
- 在.net Core中使用StackExchange.Redis 2.0
StackExchange.Redis 2.0做了大量的改进包括使用了高性能的IO库System.IO.Pipelines来提升性能以及解决Timeouts问题, 但是在.net Core2.2之前为 ...
- 【Azure Redis 缓存】云服务Worker Role中调用StackExchange.Redis,遇见莫名异常(RedisConnectionException: UnableToConnect on xxx 或 No connection is available to service this operation: xxx)
问题描述 在Visual Studio 2019中,通过Cloud Service模板创建了一个Worker Role的角色,在角色中使用StackExchange.Redis来连接Redis.遇见了 ...
- Jexus~mono中使用StackExchange.redis的问题
在windows平台的vs里,添加包包时,可以选择StackExchange.redis,而如果你的应该程序需要部署到linux的mono环境上,使用这个StackExchange.redis是不行的 ...
随机推荐
- BZOJ3242/UOJ126 [Noi2013]快餐店
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- DNS安装配置
安装Bind软件: rpm -qa | grep bind bind-utils--.x86_64 bind--.x86_64 bind-libs--.x86_64 配置named.conf , vi ...
- Bellman-Ford算法 O(NE)
Bellman-Ford算法 O(NE) 思路:枚举n-1次所有边,通过枚举所有边,将所有和已知点相连的点都设为已知,初始时起点为已知点. ;i<=n-;i++){ //n-1是次数,枚举n-1 ...
- 多线程下使用Jedis
在不同的线程中使用相同的Jedis实例会发生奇怪的错误. 但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生. 单一Jedis实例不是线程安全的. 为了避免这些问题 ...
- windows live writer 原始图片大小设置
点击图片,右面对图片参数进行设置,然后点击保存默认设置. 那么以后再插入图片,就不要重新操作了.
- poj3694 边-双连通分量+lca
题意:先给了一张无向图,然后依次加边,每次求桥的数量 题解:先用一次tarjan,我们可以标记桥的位置和记录桥的数量同时记录fa数组,然后更新边的时候我们可以用lca,因为在tarjan缩点之后得到了 ...
- C#中的线程(一)入门
C#中的线程(一)入门 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: ...
- MySQL分片 --转自Peter Zaitsev对MySQL分片的建议
本文作者Peter Zaitsev是知名数据库专家,2006年联合创立了Percona.负责维护网站“MySQL性能”.同时,他也是<高性能MySQL>一书的联合作者.以下是他对MySQL ...
- 27 python 网络基础之网络协议
一.操作系统基础 操作系统:(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才 ...
- hdoj-1013-Digital Roots(九余数定理)
题目链接 #include <iostream> using namespace std; int main() { string a; int b; ") { b = ; ;i ...