zoukankan      html  css  js  c++  java
  • 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/1rT9z567MVtfzQtnvdUxffw 密码: 5k1b

    环境:vs2013 + .NET framework 4.5


    相关文章:Redis Windows版下载与安装

                  Redis 可视化工具 Redis Desktop Manager

                  Redis 主从配置(Windows版)

  • 相关阅读:
    Autodesk Infrastructure Map Server 2012(MapGuide 2012) 最新特性介绍
    MapGuide Fusion Viewer API 如何获取Fusion对象
    MapGuide Fusion viewer中如何用Google Map/Yahoo Map/Bing Map做底图
    Visual Studio 2010开发AutoCAD 2012 .net 应用程序调试时断点不起作用
    MapGuide 用户调查关于RFC 111 Subversion
    MapGuide Enterprise 2011 授权错误的解决办法
    AutoCAD的定制开发接口(高级篇)专题培训材料介绍[转载]
    【转】Autodesk实验室从照片进行三维建模
    AutoCAD 2012最新特性概览
    Autodesk Map 3D 2012 新功能介绍
  • 原文地址:https://www.cnblogs.com/cang12138/p/8884362.html
Copyright © 2011-2022 走看看