C# StackExchange.Redis 用法汇总

目录
  • 安装StackExchange.Redis
  • 引用及初始化
  • String(字符串)
  • List(列表)
  • Hash(哈希)
  • 发布订阅
  • 事务
  • Batch 批量操作
  • Lock(分布式锁)
  • 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/1rT9z567MVtfzQtnvdUxffw 密码: 5k1b

环境:vs2013 +.NET framework 4.5

相关文章:

Redis Windows版下载与安装

Redis 可视化工具 Redis Desktop Manager

Redis 主从配置(Windows版)

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

(0)

相关推荐

  • C#实现Redis的分布式锁

    目录 Redis实现分布式锁(悲观锁/乐观锁) Redis连接池 使用Redis的SetNX命令实现加锁, 调用方式 Redis实现分布式锁(悲观锁/乐观锁) 对锁的概念和应用场景在此就不阐述了,网上搜索有很多解释,只是我搜索到的使用C#利用Redis的SetNX命令实现的锁虽然能用,但是都不太适合我需要的场景. Redis有三个最基本属性来保证分布式锁的有效实现: 安全性: 互斥,在任何时候,只有一个客户端能持有锁. 活跃性A:没有死锁,即使客户端在持有锁的时候崩溃,最后也会有其他客户端能获得

  • c#使用csredis操作redis的示例

    现在流行的redis连接客户端有StackExchange.Redis和ServiceStack.Redis,为什么选择csredis而不是这两个? .net 最有名望的 ServiceStack.Redis 早已沦为商业用途,在 .NETCore 中使用只能充值: 后来居上的 StackExchange.Redis 虽然能用,但线上各种 Timeout 错误把人坑到没脾气,两年多两年多两年多都不解决,最近发布的 2.0 版本不知道是否彻底解决了底层. csredis支持.net40/.net4

  • c#基于Redis实现轻量级消息组件的步骤

    最近在开发一个轻量级ASP.NET MVC开发框架,需要加入日志记录,邮件发送,短信发送等功能,为了保持模块的独立性,所以需要通过消息通信的方式进行处理,为了保持框架在部署,使用,二次开发过程中的简易便捷性,所以没有选择传统的MQ,而是基于Redis的订阅发布实现一个系统内部消息组件,话不多说,上码! 数据结构定义 消息实体包含几个部分,订阅通道名称,信息头,信息体,信息差异化额外信息字典,信息头主要包含消息标识,消息日期,信息体包含信息内容,信息实体类型等 public class Messa

  • C# 通过ServiceStack 操作Redis

    作       者 : 明志德道 1.引用Nuget包 ServiceStack.Redis 我这里就用别人已经封装好的Reids操作类来和大家一起参考了下,看看怎么使用ServiceStack.Redis 操作Redis数据 RedisConfigInfo--redis配置文件信息 /// <summary> /// redis配置文件信息 /// 也可以放到配置文件去 /// </summary> public sealed class RedisConfigInfo { //

  • C#中如何使用redis

    redis 是一个非关系型高性能的key-value数据库.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周

  • C# StackExchange.Redis 用法汇总

    目录 安装StackExchange.Redis 引用及初始化 String(字符串) List(列表) Hash(哈希) 发布订阅 事务 Batch 批量操作 Lock(分布式锁) StackExchange.Redis 封装 安装StackExchange.Redis 在 NuGet 中搜索StackExchange.Redis 和 Newtonsoft.Json,直接点击按钮安装即可. StackExchange.Redis 是 C# 操作 Redis 数据库的客户端. Newtonsof

  • PHP数据库操作三:redis用法分析

    本文实例讲述了PHP数据库操作redis用法.分享给大家供大家参考,具体如下: memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决: 1.数据持久性问题,memcache用内存进行存储,一旦memcache服务器宕机,那么所存储的数据全部丢失. 2.memcache存储的数据类型单一,只支持key-value型的数据,要存储复杂类型的数据,必然需要PHP脚本的大量逻辑操作. redis基本介绍 redis也是一个内存非关系型数据库,它拥有memcache在数据存

  • .net core使用redis基于StackExchange.Redis

    .net core使用redis基于StackExchange.Redis教程,具体如下 一.添加引用包 StackExchange.Redis Microsoft.Extensions.Configuration 二.修改配置文件 appsettings.json { "RedisConfig": { "Redis_Default": { "Connection": "127.0.0.1: 6379", "Inst

  • 正则表达式常用用法汇总

    在没看正文之前,先给大家介绍下正则表达式基本概念: 正则表达式,又称正规表示法.常规表示法.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 正则表达式,有木有人像我一样,学了好几遍却还是很懵圈,学的时候老明白了,学完了忘光了.好吧,其实还是练的不够,所谓温故而知新,可以为师矣,今天就随我来复习

  • Go语言操作redis用法实例

    本文实例讲述了Go语言操作redis用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "redis" ) func main() {  //DefaultSpec()创建一个连接规格  spec := redis.DefaultSpec().Db(0).Password("");  //创建一个新的syncClient,并连接到Redis的服

  • 详解StackExchange.Redis通用封装类分享

    前两天朋友问我,有没有使用过StackExchange.Redis,问我要个封装类,由于之前都是使用ServiceStack.Redis,由于ServiceStack.Redis v4版本后是收费版的,所以现在也很有公司都在使用StackExchange.Redis而抛弃ServiceStack.Redis了.其实个人觉得,两个驱动都不错,只是由于ServiceStack.Redis收费导致目前很多公司都是基于V3版本的使用,也有人说V3版本有很多Bug,没有维护和升级,不过至少目前我是没发现B

  • JSON简介以及用法汇总

    JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式.它非常便于编程人员对数据的处理,也便于机器对数据的解析和生成,应用非常广泛. JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { "name": "hanzichi", "sex": "male" } 看起来都是key-value的键值对,很像js的对象吧?没错,但同时

  • jqGrid用法汇总(全经典)

    支持多种类型的数据集合作为数据源 jqGrid可以绑定三种类型的数据:XML,JSON和数组.使用不同的数据类型主要是设置datatype属性,它的值分别为'xml','json','local'(数组) $("#grid1").jqgrid( ........ datatype: "xml", ........ ); 下面则列举各种数据类型的格式 XML格式: <rows> <page></page> <total>

  • C# DataTable常见用法汇总

    C# DataTable 的常见用法: (1)新建数据表. DataTable dt=new DataTable();如果带个String参数,此参数表示表名. (2)向表添加列. //数据库的Nvarchar等类型,在此可用String兼容.可不指明数据类型 DataColumn dc = new DataColumn("商品编号", typeof(system.string)); dt.Columns.Add(dc); (3)设置表特定行与列的数据值. dt.Rows[i].Set

  • vue中watch的用法汇总

    在vue中,使用watch来响应数据的变化.watch的用法大致有三种. 1. 常用用法 <input type="text" v-model="name"/> new Vue({ el: '#app', data: { name: '咸鱼' }, watch: { name(newVal,oldVal) { // ... } } }) 直接写一个监听处理函数,当每次监听到 name 值发生改变时,执行函数.也可以在所监听的数据后面直接加字符串形式的方法

随机推荐