在.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("已经有了");
        }
    
原文地址:https://www.cnblogs.com/ye-hcj/p/8280349.html