本文介绍如何在.net中使用redis
安装
代码使用
StackExchange.Redis基础使用
StackExchange.Redis中的事务
-
- 安装Chocolatey请看Chocolatey安装
- 安装redis
choco install redis-64
- 运行
redis-server.exe
如果运行失败,设置环境变量SET PATH=%PATH%;"c:Program FilesRedis"
- 创建一个控制台程序,安装Nuget包
StackExchange.Redis
-
- 创建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(); }
-
- 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");
-
写法一,事务写法 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("已经有了"); }