zoukankan      html  css  js  c++  java
  • 在.net中使用redis(StackExchange.Redis)

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

    安装
    代码使用
    StackExchange.Redis基础使用
    StackExchange.Redis中的事务

    1. 安装(windows平台)

      • 安装Chocolatey请看Chocolatey安装
      • 安装redis choco install redis-64
      • 运行 redis-server.exe 如果运行失败,设置环境变量 SET PATH=%PATH%;"c:Program FilesRedis"
      • 创建一个控制台程序,安装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("已经有了");
          }
      
  • 相关阅读:
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Navicat查询哪些表有指定字段名
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/8280349.html
Copyright © 2011-2022 走看看