ITPub博客

首页 > 数据库 > 数据库开发技术 > c# Redis list 当作队列使用

c# Redis list 当作队列使用

原创 数据库开发技术 作者:后端Q 时间:2021-12-20 00:00:00 0 删除 编辑

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) 1redis 127.0.0.1:6379> LPUSH runoobkey mongodb(integer) 2redis 127.0.0.1:6379> LPUSH runoobkey mysql(integer) 3redis 127.0.0.1:6379> LRANGE runoobkey 0 10
1) "mysql"2) "mongodb"3) "redis"


问题,上面的队列方法是『不安全』的,因为在这个过程中,一个客户端可能在取出一个消息之后崩溃,而未处理完的消息也就因此丢失。


使用 RPOPLPUSH 命令(或者它的阻塞版本 BRPOPLPUSH )可以解决这个问题:因为它不仅返回一个消息,同时还将这个消息添加到另一个备份列表当中,如果一切正常的话,当一个客户端完成某个消息的处理之后,可以用 LREM 命令将这个消息从备份表删除。



最后,还可以添加一个客户端专门用于监视备份表,它自动地将超过一定处理时限的消息重新放入队列中去(负责处理该消息的客户端可能已经崩溃),这样就不会丢失任何消息了。



原文作者:后端Q;如有侵权,请联系管理员删除。

下一篇: C#的dapper使用
请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    726156