Redis是什么
安装Redis和可视化工具就直接跳过了
开始使用常见的五种数据类型
创建一个控制台应用,安装Nuget包
Install-Package StackExchange.Redis
String类型,常用来存储文本、Json、Base64图片编码等
| static async void RedisString(IDatabase db) |
| { |
| |
| await db.StringSetAsync("UserName", "Alice"); |
| |
| |
| string userName = await db.StringGetAsync("UserName"); |
| await Console.Out.WriteLineAsync("Username: " + userName); |
| |
| |
| await db.StringSetAsync("UserName", "Bob"); |
| |
| |
| userName = await db.StringGetAsync("UserName"); |
| await Console.Out.WriteLineAsync("Updated Username: " + userName); |
| |
| |
| await db.KeyDeleteAsync("UserName"); |
| } |
Hash类型,是一种键值对的集合,用于存储结构化的数据
| static async void RedisHash(IDatabase db) |
| { |
| |
| await db.HashSetAsync("User:1001", "FirstName", "Alice"); |
| await db.HashSetAsync("User:1001", "LastName", "Amy"); |
| await db.HashSetAsync("User:1002", "Name", "Jack"); |
| |
| |
| string name = await db.HashGetAsync("User:1001", "FirstName"); |
| await Console.Out.WriteLineAsync("FirstName: " + name); |
| |
| |
| await db.HashSetAsync("User:1001", "FirstName", "Bob"); |
| |
| |
| name = await db.HashGetAsync("User:1001", "FirstName"); |
| await Console.Out.WriteLineAsync("Updated FirstName: " + name); |
| |
| |
| await db.HashDeleteAsync("User:1002", "Name"); |
| } |
List列表,常用来做队列
分为先进先出(FIFO)和先进后出(FILO)
| static async void RedisList(IDatabase db) |
| { |
| |
| await db.ListLeftPushAsync("Emails", "Alice@example.com"); |
| await db.ListLeftPushAsync("Emails", "Jack@example.com"); |
| |
| |
| while (await db.KeyExistsAsync("Emails")) |
| { |
| string email = await db.ListRightPopAsync("Emails"); |
| await Console.Out.WriteLineAsync("Email: " + email); |
| } |
| |
| |
| |
| } |
Set无序列表,根据插入的顺序进行排序
| static async void RedisSet(IDatabase db) |
| { |
| |
| await db.SetAddAsync("Students", "Alice"); |
| await db.SetAddAsync("Students", "Jack"); |
| |
| |
| RedisValue[] students = await db.SetMembersAsync("Students"); |
| foreach (var student in students) |
| { |
| await Console.Out.WriteLineAsync("Student: " + student); |
| } |
| |
| |
| await db.KeyDeleteAsync("Students"); |
| } |
ZSet有序列表,根据字段Score进行排序
| static async void RedisZSet(IDatabase db) |
| { |
| |
| await db.SortedSetAddAsync("Teachers", "Alice", 1000); |
| await db.SortedSetAddAsync("Teachers", "Jack", 500); |
| |
| var teachers = await db.SortedSetRangeByRankWithScoresAsync("Teachers"); |
| foreach (var teacher in teachers) |
| { |
| await Console.Out.WriteLineAsync("Teacher: " + teacher.Element + ", Score: " + teacher.Score); |
| } |
| |
| |
| await db.KeyDeleteAsync("Teachers"); |
| } |
Redis发布订阅机制
模拟向NBA的频道发送一条消息
| static async void PushMessage(ConnectionMultiplexer redis) |
| { |
| |
| string channel = "NBA"; |
| |
| string message = "Welcome to NBA"; |
| var subscriber = redis.GetSubscriber(); |
| |
| subscriber.Subscribe(new RedisChannel(channel, RedisChannel.PatternMode.Auto)).OnMessage(channelMessage => |
| { |
| Console.WriteLine(($"订阅消息:{(string)channelMessage.Message}")); |
| }); |
| |
| await subscriber.PublishAsync(new RedisChannel(channel, RedisChannel.PatternMode.Auto), message); |
| } |
需要先成功订阅频道才可以收到发布消息
Redis监听过期Key
首先需要修改配置文件中的otify-keyspace-events字段改为Ex
重启Redis之后调试如下代码
| static async void RedisKeyExpired(ConnectionMultiplexer redis, IDatabase db) |
| { |
| var subscriber = redis.GetSubscriber(); |
| |
| |
| string orderNo = "20240402153515"; |
| |
| |
| await db.StringSetAsync(orderNo, "iPhone15", TimeSpan.FromSeconds(10)); |
| |
| |
| await subscriber.SubscribeAsync("__keyevent@0__:expired", async (pattern, value) => |
| { |
| await Console.Out.WriteLineAsync($"订单号:{value}已过期!"); |
| }); |
| } |
使用场景一般是订单在规定时间未付款,过期后自动取消并释放库存
Main方法调用如下
| static void Main() |
| { |
| var redis = ConnectionMultiplexer.Connect("localhost"); |
| var db = redis.GetDatabase(); |
| RedisKeyExpired(redis, db); |
| RedisString(db); |
| RedisHash(db); |
| RedisList(db); |
| RedisSet(db); |
| RedisZSet(db); |
| PushMessage(redis); |
| Console.ReadKey(); |
| } |