当前位置: 首页 > 编程语言 > C#

C#StackExchange.Redis使用总结分享

时间:2023-04-11 02:20:24 C#

目录安装StackExchange.Redis参考及初始化String(字符串)List(列表)Hash(哈希)发布订阅事务Batch批处理Lock(分布式锁)StackExchange。Redis包安装StackExchange.Redis在NuGet中搜索StackExchange.Redis和Newtonsoft.Json,点击按钮安装。StackExchange.Redis是C#操作Redis数据库的客户端。Newtonsoft.Json用于序列化Josn字符串,反序列化得到对象。使用StackExchange.Redis的引用和初始化引用;使用Newtonsoft.Json;InitializeredisConnectionMultiplexer_conn=RedisConnectionHelp.Instance;//Initializevardatabase=_conn.GetDatabase(0);//指定连接库0String(string)String是最常用的数据类型之一,常用的key/value存储可以归入这一类。一个Key对应一个Value,字符串类型是二进制安全的。Redis字符串可以包含任何数据,例如jpg图像(生成二进制文件)或序列化对象。database.StringSet("name","Cang");//设置StringSet(key,value)stringstr=database.StringGet("name");//结果:Cangdatabase.StringSet("name_two",str,TimeSpan.FromSeconds(10));//设置时间,10s后过期。保存对象(对象需要序列化并转成字符串,然后存入库)获取对象(反序列化)//创建对象Demodemo=newDemo(){name="色",Age=18,高度=1.83};stringdemojson=JsonConvert.SerializeObject(demo);//序列化database.StringSet("model",demojson);字符串模型=database.StringGet("模型");demo=JsonConvert.DeserializeObject(model);//反序列化StringIncrement增量和StringDecrement减量(默认值为1)doubleincrement=0;双递减=0;for(inti=0;i<3;i++){increment=database.StringIncrement("StringIncrement",2);//递增,每次+2}for(inti=0;i<3;i++){decrement=database.StringDecrement("StringIncrement");//递减,每次-1}List(列表)Redis列表是一个简单的字符串列表,按插入顺序排序。您可以将元素添加到列表的头部或尾部。一个列表最多可以包含232–1个元素(4294967295,每个列表超过40亿个元素)。for(inti=0;i<10;i++){database.ListRightPush("list",i);//从底部插入数据}for(inti=10;i<20;i++){database.ListLeftPush("list",i);//从顶部插入数据}varlength=database.ListLength("list");//长度为20varrightPop=database.ListRightPop("list");//从顶部取数据bottomvarleftpop=database.ListLeftPop("list");//从top取出数据varlist=database.ListRange("list");哈希(hash)Redis哈希是字符串类型字段和值的映射表,哈希特别适用于存储对象。与将对象的每个字段存储为单个字符串相反。一个对象存储在hash类型中会占用更少的内存,并且可以更方便地访问整个对象。Redis中的每个哈希可以存储232-1个键值对(超过40亿)。Hash的存储给我的感觉类似于关系型数据库。以下面的例子为例,存储一个用户对象(关系数据库中的表名),cang,shan,yun(关系数据库中数据的主键和唯一值),json(字段)stringjson=JsonConvert.SerializeObject(demo);//序列化database.HashSet("user","cang",json);database.HashSet("用户","shan",json);database.HashSet("用户","云",json);//获取模型字符串hashcang=database.HashGet("user","cang");demo=JsonConvert.DeserializeObject(hashcang);//反序列化//获取ListRedisValue[]values=database.HashValues("user");//获取所有值IListdemolist=newList<演示>();foreach(variteminvalues){Demohashmodel=JsonConvert.DeserializeObject(item);破坏者。添加(哈希模型);}发布订阅Redis发布订阅(pub/sub)是一种消息通信方式,可用于消息的传输。Redis的发布订阅机制包括三部分,Publisher、Subscriber和Channel。适用于在线聊天,消息推送等。发布者和订阅者都是Redis客户端,Channel是Redis服务器端。发布者向某个频道发送消息,订阅该频道的订阅者可以接收到消息。客户端可以订阅任意数量的频道。ISubscribersub=_conn.GetSubscriber();//订阅Channel1频道sub.Subscribe("Channel1",newAction((channel,message)=>{Console.WriteLine("Channel1"+"订阅收到的消息:"+message);}));for(inti=0;i<10;i++){sub.Publish("Channel1","msg"+i);//发送信息到Channel1if(i==2){sub.Unsubscribe("Channel1");//取消订阅}}因为在i==2时取消订阅,所以只收到3条订阅消息。事务开启后,相应的命令操作会被封装成一个request,在调用Execute方法时一起发送给Redis执行。这里通过CreateTransaction函数(multi)创建了一个事务,调用它的Execute函数(exec)提交事务。“Condition.StringEqual("name",name)”相当于Redis命令中的手表名称。字符串名称=database.StringGet("名称");stringage=database.StringGet("age");vartran=database.CreateTransaction();//创建事物tran.AddCondition(Condition.StringEqual("name",name));//乐观锁tran.StringSetAsync("name","sea");tran.StringSetAsync("年龄",25);database.StringSet("name","Cang");//此时更改name值,提交事务时会失败。boolcommitted=tran.Execute();//提交东西,true为成功,false为回滚。因为在提交东西的过程中修改了name值,导致回滚,name和age赋值到25都失败了。batchbatch操作batch会将要执行的命令打包成一个request发送给Redis,然后一起等待结果返回。减少网络开销。varbatch=database.CreateBatch();//批量写入Taskt1=batch.StringSetAsync("name","Yu");任务t2=batch.StringSetAsync("age",22);批处理。执行();任务.WaitAll(t1,t2);Console.WriteLine("年龄:"+database.StringGet("年龄"));Console.WriteLine("姓名:"+database.StringGet("姓名"));//批量写入for(inti=0;i<100000;i++){batch.StringSetAsync("age"+i,i);}batch.Execute();//批量读取List>valueList=newList>();for(inti=0;i<10000;i++){Tasktres=batch.StringGetAsync("age"+i);valueList.Add(特雷斯);}batch.Execute();foreach(varredisValueinvalueList){stringvalue=redisValue.Result;//获取对应的值}Lock(分布式锁)由于Redis是单线程模型,命令操作是原子的,所以利用这个特性可以方便的易于实现分布式锁。RedisValuetoken=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+.NETframework4.5相关文章:RedisWindows版下载安装Redis可视化工具RedisDesktopManagerRedis主从配置(Windows版)本文关于C#StackExchange.Redis使用本文收集自网络,不代表一个位置。如有侵权,请点击右侧联系管理员删除。如需转载请注明出处: