您现在的位置是:亿华云 > 系统运维
一篇学会 C# Redis list 当作队列使用
亿华云2025-10-03 02:16:57【系统运维】2人已围观
简介本文转载自微信公众号「后端Q」,作者conan 。转载本文请联系后端Q公众号。Redis的列表经常被用作队列,用于在不同程序之间有序地交换消息。一个客户端通过 LPUSH 命令将消息放入队列中,而另一
本文转载自微信公众号「后端Q」,篇学作者conan 。作队转载本文请联系后端Q公众号。列使
Redis的篇学列表经常被用作队列,用于在不同程序之间有序地交换消息。作队一个客户端通过 LPUSH 命令将消息放入队列中,列使而另一个客户端通过 RPOP 或者 BRPOP 命令取出队列中等待时间最长的篇学消息。
对于c# 方法
using (var redisClent = RedisManager.GetClient()) { while (true) { if ((DateTime.Now - date).TotalSeconds > maxSeconds) break; var infoJson = redisClent.DequeueItemFromList(CacheKeys.UploadLoginTimeQueue); if (string.IsNullOrWhiteSpace(infoJson) || string.IsNullOrEmpty(infoJson)) break; var info = JsonConvert.DeserializeObject<LoginTimeUpdate>(infoJson); UpdateLoginTime(info); } } client = RedisManager.GetClient(); if (!client.Get<bool>(key)) { client.Set(key,作队 true, DateTime.Now.Date.AddDays(1).AddSeconds(-1)); } var jsonObj = JsonConvert.SerializeObject(info); client.EnqueueItemOnList(CacheKeys.UploadLoginTimeQueue, jsonObj);命令
redis 127.0.0.1:6379> LPUSH runoobkey redis (integer) 1 redis 127.0.0.1:6379> LPUSH runoobkey mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH runoobkey mysql (integer) 3 redis 127.0.0.1:6379> LRANGE runoobkey 0 10 1) "mysql" 2) "mongodb" 3) "redis"问题,上面的列使队列方法是亿华云计算『不安全』的,因为在这个过程中,篇学一个客户端可能在取出一个消息之后崩溃,作队而未处理完的列使消息也就因此丢失。
使用 RPOPLPUSH 命令(或者它的篇学阻塞版本 BRPOPLPUSH )可以解决这个问题:因为它不仅返回一个消息,同时还将这个消息添加到另一个备份列表当中,作队如果一切正常的列使话,站群服务器当一个客户端完成某个消息的处理之后,可以用 LREM 命令将这个消息从备份表删除。
最后,还可以添加一个客户端专门用于监视备份表,它自动地将超过一定处理时限的消息重新放入队列中去(负责处理该消息的客户端可能已经崩溃),这样就不会丢失任何消息了。
很赞哦!(18347)