本文转载自微信公众号《后端Q》,作者柯南。转载请联系后台Q公众号。Redis列表经常被用作队列,以有序的方式在不同程序之间交换消息。一个客户端通过LPUSH命令将消息放入队列,另一个客户端通过RPOP或BRPOP命令取出队列中等待时间最长的消息。对于c#方法使用(varredisClent=RedisManager.GetClient()){while(true){if((DateTime.Now-date).TotalSeconds>maxSeconds)break;variinfoJson=redisClent.DequeueItemFromList(CacheKeys.UploadLoginTimeQueue);if(string.IsNullOrWhiteSpace(infoJson)||string.IsNullOrEmpty(infoJson))break;variinfo=JsonConvert.DeserializeObject(infoJson);UpdateLoginTime(info);}}client=RedisManager.GetClient();if(!client.Get(key)){client.Set(key,true,DateTime.Now.Date.AddDays(1).AddSeconds(-1));}varjsonObj=JsonConvert.SerializeObject(info);client.EnqueueItemOnList(CacheKeys.UploadLoginTimeQueue,jsonObj);命令redis127.0.0.1:6379>LPUSHrunoobkeyredis(整数)1redis127.0.0.1:6379>LPUSHrunoobkeymongodb(整数)2redis127.0.0.1:6379>LPUSHrunoobkeymysql(整数)3redis127.0.0.1:630run1)>LRAN0bkey"mysql"2)"mongodb"3)"redis"问题,上面的queue方式是“不安全的”,因为在这个过程中,客户端可能会在取到消息后崩溃,未处理的消息也因此丢失。使用RPOPLPUSH命令(或其阻塞版本BRPOPLPUSH)可以解决这个问题:因为它不仅返回一条消息,而且还将这条消息添加到另一个备份列表中。处理后,可以使用LREM命令从备份表中删除消息。最后,还可以添加一个专门监控备份表的客户端,它会自动将超过一定处理时间限制的消息重新排队(负责处理消息的客户端可能已经崩溃),这样就不会丢失任何数据。消息。