当前位置: 首页 > news >正文

.net core Redis 使用有序集合实现延迟队列

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

延迟队列的设计思想是将队列的延迟时间作为分数,按照这个进行排序

  1. 安装依赖
Newtonsoft.Json             13.0.3   
StackExchange.Redis         2.8.0 
  1. 封装Redis
using StackExchange.Redis;
namespace LedayQueue.RedisHelper
{public class RedisConnection{private readonly ConnectionMultiplexer _connection;public IDatabase _database;public RedisConnection(){_connection = ConnectionMultiplexer.Connect("localhost:6379");_database = _connection.GetDatabase();}public async Task AddToQueueAsync(string task, TimeSpan delay){var executionTime = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + delay.TotalSeconds;await _database.SortedSetAddAsync("delayedQueue", task, executionTime);}}
}
  1. 封装background service
using StackExchange.Redis;namespace LedayQueue.RedisHelper
{public class DelayedQueueProcessor : BackgroundService{private readonly RedisConnection _connection;private const string QueueKey = "delayedQueue";public DelayedQueueProcessor(RedisConnection redisConnection){_connection = redisConnection;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();var tasks = await _connection._database.SortedSetRangeByScoreWithScoresAsync(QueueKey, 0, now);foreach (var task in tasks){// 处理任务var taskString = task.Element.ToString();ProcessTask(taskString);// 从队列中移除任务await _connection._database.SortedSetRemoveAsync(QueueKey, task.Element);}await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken); // 每秒检查一次}}private void ProcessTask(string content){Console.WriteLine(content);}}
}
  1. 注册
builder.Services.AddSingleton<RedisConnection>();
builder.Services.AddHostedService<DelayedQueueProcessor>();

源码

官网

http://www.lryc.cn/news/394806.html

相关文章:

  • linux 安装Openjdk1.8
  • 鸿蒙系统:未来智能生态的引领者
  • Java语言程序设计——篇二(1)
  • 水果商城系统 SpringBoot+Vue
  • 半导体制造企业 文件共享存储应用
  • 深入分析 Android BroadcastReceiver (九)
  • 从数据到洞察:DataOps加速AI模型开发的秘密实践大公开!
  • 全景图三维3D模型VR全景上传展示H5开发
  • 前端面试题29(js闭包和主要用途)
  • 使用Keil 点亮LED灯 F103ZET6
  • 流批一体计算引擎-12-[Flink]旁路输出getSideOutput(OutputTag)实现拆分流和复制流
  • 【Scrapy】 Scrapy 爬虫框架
  • 【笔记】太久不用redis忘记怎么后台登陆了
  • 昇思25天打卡营-mindspore-ML- Day14-VisionTransformer图像分类
  • 微信环境内H5网页,用开放标签wx-open-launch-app打开app
  • 【c++基础】高精度数不进位加法
  • UniApp 中 Web/H5 正确使用反向代理解决跨域问题
  • Redis Stream:实时数据流的处理与存储
  • 【论文阅读】-- Visual Traffic Jam Analysis Based on Trajectory Data
  • 修改编译依赖openssl的libcrypto.so
  • ����: �Ҳ������޷��������� javafx.fxml ԭ��: java.lang.ClassNotFoundException解决方法
  • 【C++】———— 继承
  • Python人生重开器
  • python 高级技巧 0708
  • HOW - React Router v6.x Feature 实践(react-router-dom)
  • `padding`、`border`、`width`、`height` 和 `display` 这些 CSS 属性的作用
  • C++ QT 全局信号的实现
  • 十款绚丽的前端 CSS 菜单导航动画
  • debain系统使用日志
  • 【Word】快速对齐目录