本文介绍如何在.net中使用redis

安装

代码使用

StackExchange.Redis基础使用

StackExchange.Redis中的事务

  1. 安装(windows平台)

    • 安装Chocolatey请看Chocolatey安装
    • 安装redis choco install redis-64
    • 运行 redis-server.exe 如果运行失败,设置环境变量 SET PATH=%PATH%;"c:\Program Files\Redis"
    • 创建一个控制台程序,安装Nuget包 StackExchange.Redis
  2. 代码使用

    • 创建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();
    }
  3. StackExchange.Redis基础使用

    • 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");
  4. StackExchange.Redis中的事务

        写法一,事务写法
    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)的更多相关文章

  1. EF+Redis(StackExchange.Redis)实现分布式锁,自测可行

    电商平台 都会有抢购的情况,比如 1元抢购. 而抢购 最重要的 就是库存,很多情况下  库存处理不好,就会出现超卖现象. 本文将用redis为缓存,StackExchange 框架,消息队列方式 实现 ...

  2. StackExchange.Redis性能调优

    大家经常出现同步调用Redis超时的问题,但改成异步之后发现错误非常少了,但却可能通过前后记日志之类的发现Redis命令非常慢. PS: 以后代码都在Windows bash中运行,StackExch ...

  3. 扩展 StackExchange.Redis 支持实体

    一.StackExchange.Redis StackExchange.Redis是由Stack Overflow开发的C#语言Redis客户端,使用广泛,本文针对 StackExchange.Red ...

  4. (三)Redis for StackExchange.Redis

    目录 (一)Redis for Windows正确打开方式 (二)Redis for 阿里云公网连接 (三)Redis for StackExchange.Redis StackExchange.Re ...

  5. RedisRepository封装—Redis发布订阅以及StackExchange.Redis中的使用

    本文版权归博客园和作者本人吴双共同所有,转载请注明本Redis系列分享地址.http://www.cnblogs.com/tdws/tag/NoSql/ Redis Pub/Sub模式 基本介绍 Re ...

  6. StackExchange.Redis在net中使用

    redis 官网https://redis.io redis 下载  进入下载页面  https://redis.io/download https://github.com/MicrosoftArc ...

  7. 在.net Core中使用StackExchange.Redis 2.0

    StackExchange.Redis 2.0做了大量的改进包括使用了高性能的IO库System.IO.Pipelines来提升性能以及解决Timeouts问题, 但是在.net Core2.2之前为 ...

  8. 【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.遇见了 ...

  9. Jexus~mono中使用StackExchange.redis的问题

    在windows平台的vs里,添加包包时,可以选择StackExchange.redis,而如果你的应该程序需要部署到linux的mono环境上,使用这个StackExchange.redis是不行的 ...

随机推荐

  1. java深入探究16-mybatis

    链接:http://pan.baidu.com/s/1skJ4TNB 密码:koo9 1.引入mybatis jsbc简单易学,上手快,非常灵活构建SQL,效率高但代码繁琐,难以写出高质量的代码 hi ...

  2. vue自定义事件 子组件把数据传出去

    每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...

  3. 书_Delphi

    1. 有讲 坦克大战 的那本Delphi叫什么 叫做:<<Delphi深度历险>> 2.

  4. FreeTDS-SQL Server在linux和unix下的免费驱动

    微软为MS SQL Server的连接和使用提供了很好的 驱动和 文档. 不幸的是,那只能在windows操作系统上使用. 所以对于Linux或者Unix,您需要寻找不同的方法来连接MS SQL Se ...

  5. C++的转换函数

    听侯捷老师的讲课笔记: 所谓转换函数指的是类型之间的转换,比如把自定义的类类型转换成内建类型(比如double),后者向相反的方向转. 直接上代码: 头文件conversion_function.h: ...

  6. wpf数据绑定的论述

    (1)绑定模式: <Lable x:Name=lab Content={binding UserName} /> <!--binding相当于SetBinding--> Con ...

  7. Android Studio开发技巧

    为了android更有效率的开发,总结学习android集成开发环境(android studio1.3为例) android studio 1-打印log及配置ec快捷键 2-代码提示及移动快捷键 ...

  8. 简单CSS3动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Handsontable 的数据保存(增删改查+导出excel)

    项目用到handsontable 插件 根据官网 API写的handsontable初始化, 数据展示, ajax请求, 参数封装, Controller参数接受 全局容器 var AllData = ...

  10. 18 Python 模块引入

    Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代码段. 把相关的代码 ...