• 在.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("已经有了");
          }
      
  • 相关阅读:
    PHP数据类型
    Windows定时备份Mysql数据库
    Linux定时删除n天前日志
    使用file_get_contents() 发送GET、POST请求
    使用Git工具批量拉取代码
    Git常用命令
    点击开关按钮,通过改变类名切换按钮
    两个行内元素的间隙问题
    vue和angular双向数据绑定原理
    原生js实现 双向数据绑定
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/8280349.html
Copyright © 2020-2023  润新知