微网站设计与开发教程,微信有网站开发吗,网站后台怎么建设,中层管理者培训课程有哪些菜菜哥#xff0c;我刚做完了一个订单系统#xff0c;感觉很简单呀说说看#xff0c;大量的订单状态怎么处理的#xff1f;我设计的时候可是考虑了这一点#xff0c;所以用了异步处理#xff0c;采用了MQ那用的什么MQ呢#xff0c;透露一下呗我用的redis做的MQ#xff… 菜菜哥我刚做完了一个订单系统感觉很简单呀说说看大量的订单状态怎么处理的我设计的时候可是考虑了这一点所以用了异步处理采用了MQ那用的什么MQ呢透露一下呗我用的redis做的MQ很简单一天就写完了订单那么重要的消息我觉得用redis可能不适合哦Redis消息队列在程序员这个圈子打拼了太多年见过太多的程序员使用redis其中一部分喜欢把redis做缓存cache使用其中最典型的当属存储用户session除此之外把redis作为消息队列使用也不在少数可见redis在互联网中应用是多么的广泛。redis作为消息队列使用redis支持的数据结构是可以支撑这类业务主要是利用了list这种数据结构的特性。Redis的列表相当于编程语言里面的 LinkedList是一个双向的列表结构这意味着列表新增和删除元素是非常快的时间复杂度为O(1)但是查找一个元素的时候需要遍历列表时间复杂度为O(n)。由于列表的元素操作和消息队列操作类似所以redis可以适用于消息队列的场景当然在适用于的栈的场景下也可以胜任。需要提醒一下生产环境中如果对消息的可靠性有十分高的要求比如订单支付的消费消息请使用专业的消息队列例如rmqamq等对消息的丢失有一定容忍度的程序完全可以使用redis例如我们的日志收集程序列表这种数据结构的命令为移出并获取列表的第一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BLPOP key1 [key2 ] timeout移出并获取列表的最后一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOP key1 [key2 ] timeout 从列表中弹出一个值将弹出的元素插入到另外一个列表中并返回它如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOPLPUSH source destination timeout 通过索引获取列表中的元素LINDEX key index 在列表的元素前或者后插入元素LINSERT key BEFORE|AFTER pivot value 获取列表长度LLEN key 移出并获取列表的第一个元素LPOP key 将一个或多个值插入到列表头部LPUSH key value1 [value2] 将一个值插入到已存在的列表头部LPUSHX key value 获取列表指定范围内的元素LRANGE key start stop 移除列表元素LREM key count value 通过索引设置列表元素的值LSET key index value 对一个列表进行修剪(trim)就是说让列表只保留指定区间内的元素不在指定区间之内的元素都将被删除。LTRIM key start stop 移除列表的最后一个元素返回值为移除的元素。RPOP key 移除列表的最后一个元素并将该元素添加到另一个列表并返回RPOPLPUSH source destination 在列表中添加一个或多个值RPUSH key value1 [value2] 为已存在的列表添加值RPUSHX key value 缺陷消息队列的本质还是消费者和生产者的问题只要是这样的场景就会涉及到两端不平衡的情况具体可表现为1. 生产者生产速度大于消费者消费速度面临消息不断堆积的问题随着消息数据的堆积队列是开启限流措施还是丢弃某些消息更或者是把消息数据进行持久化。对于基于redis实现的消息队列一般为可忍受部分消息丢失的业务所以很多人选择丢弃消息的方案。另一种方案是基于redis单线程机制可以增加消费者数量这也是仅仅针对消息只被消费一次的场景。当然也可以选择持久化方案但是会对redis的性能产生影响。2. 消费者消费速度大于生产者生产速度有的同学会说这样挺好啊是在某种意义上是比反过来的那个场景要好一些毕竟可以避免产生消息的堆积问题。但是消费者没有消息消费会导致消费者进程一直在那里浪费cpu资源而且还会把redis的QPS拉高。类似于这种死循环的场景一般而且最常用的解决方案是让线程sleep 一小段时间既降低了消费端cpu也降低了redis的QPS。但是sleep会有一个问题会导致处理消息的延迟例如sleep了一秒那消息的延迟处理就有可能会延迟一秒虽然在大部分场景下这都不是什么问题但是作为程序员怎么能不追求极致和完美呢关于消息延迟的问题最暴力简单的方式就是增加消费客户端这样可用多消费端交错的方式来缩小延迟的间隔当然redis的设计者也考虑了这个问题所有有了Blpop 命令Redis Blpop 命令移出并获取列表的第一个元素 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。redis 127.0.0.1:6379 BLPOP LIST1 LIST2 .. LISTN TIMEOUT而且还可以设置超时自动返回岂不是完美。但是还要顺便一句redis的连接在空闲一段时间后服务端可能会主动断开Blpop命令会抛出异常所以还要做好了重试或者其他策略为好。3. 如果作为专业的消息队列一个消息被多个不同的业务消费一个消息被消费多次是必须要支持的但是redis是基于自己的list数据结构来实现的伪队列所以这种业务场景下就不要考虑redis了或者自己封装一个类似分发器的中间件也可以。4. 基于redis的消息队列没有Ack的保证换句话说一个消息是否被正常处理redis是不知道的这在很大程度上限制了它的适用场景。写在最后我还是建议不要用redis做专业的MQ使用毕竟MQ这种场景不是redis的设计初衷但是太多人把redis做MQ使用于是redis的作者基于redis的核心代码实现了一个消息队列disque也许未来会作为redis的核心组件,地址为 https://github.com/antirez/disque除了disqueRedis Stream也是一个把redis作为MQ的比较好的解决方案有兴趣的同学可以研究一下。千万不要把任何一个业务场景想象的太简单●程序员修神之路--为什么我会了SOA你们还要逼我学微服务●程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁●程序员修神之路--设计一套RPC框架并非易事●程序员过关斩将--要想获取我的用户信息就得按照规矩来●程序员过关斩将--更加优雅的Token认证方式JWT●程序员过关斩将--cookie和session的关系其实很简单●程序员修神之路--用NOSql给高并发系统加速●程序员修神之路--高并发系统设计负载均衡架构●程序员过关斩将--你为什么还在用存储过程●程序员修神之路--问世间异步为何物●程序员修神之路--提高网站的吞吐量????关注后回复“大礼包”和“福利”领取惊喜长按识别二维码关注