redis学习:延迟队列 异步消息队列

redis延迟队列使用zset有序列表来实现 对于如加锁失败的线程 如果一直轮询会消耗资源 但如果使用sleep那么遇到死锁时就会彻底瘫痪 所以会使用延迟队列。

当获取锁失败 会把消息序列序列化为字符串作为zset的value 把时间戳作为score (如time()+5 )多个线程对延迟队列进行轮询:lua脚本(网络往返从两次变为一次 并且多线程情况下因为lua原子性不会出现多个线程查询但只有一个线程能执行的现象) 每次zrangebyscore取出范围为0到当前时间戳的第一个value 然后zrem删除(抢到了) 之后处理业务逻辑。

消息队列:可以使用redis 的list作为消息队列 生产者使用lpush/rpush 消费者使用blpop/brpop b是blocking 就是阻塞读 在消息队列为空的时候 会进入休眠状态 当有任务会立即唤醒

但redis作为消息队列有一定的缺点1.redis数据在内存中 没有持久化时宕机数据即丢失 即使开启aof每秒刷盘 但还是可能会丢失一秒的数据 如果开启appendfsync always 那么又大大影响性能 无法支持高并发任务。 2.消息确认机制不足 不同于mq的ack/nack的消息确认机制 redis作消息队列本身没有确认机制 可能会导致重复消费或者消费失败后任务丢失 3.主从同步延时 redis主从异步复制 在故障切换时可能会丢失数据 如果redis主节点在写入或修改后 还没来得及同步到从节点就宕机 那么切换从节点后可能会丢失关键据

无法做到高一致性 4. 可能带来性能瓶颈 阻塞读需要创建tcp连接去监听队列 在高并发的情况下 大量tcp连接会占用大量资源 同时这些连接的建立 断开会带来cpu压力 如果brpop/blpop还有超时管理机制(超时将阻塞的客户端直接移除) 在高并发场景下会带来大量cpu压力( redis使用无序双向链表来存储时间事件 每次事件循环迭代,遍历时间事件链表,检查是否有事件到期 这会带来cpu消耗)

全部评论

相关推荐

09-23 21:17
已编辑
西安邮电大学 Java
双双非 9.1投递9.13泡池子一面9.20二面 我感觉已经挂了一面 问麻了1h 10min实习 10minredission分布式锁怎么实现 底层原理是什么设置超时时间超过了怎么处理setnx和redission分布式锁实现区别定时任务 xxljob执行任务时间过长 超过执行周期怎么办 怎么应对怎么避免这个问题开始计算机网络 拷打爆了IO多路复用几种方式虚拟内存是什么为什么要有虚拟内存TCP拥塞控制和流量控制有什么区别避免拥塞算法怎么实现mysql为什么有深分页 什么是深分页 怎么解决mysql事务 隔离级别怎么实现算法topk 小顶堆有一亿个整数找最大100个 怎么实现LRU怎么实现手撕二维数组找目标值 很普通的遍历..9.20二面按理说是一个小时 但是实习他没有想问的30min家常 成绩怎么样人工智能和计算机有什么不同..?实习拷打 这里感觉寄了问的问题我根本没想过比如这个项目是本地还是云服务 为什么这么做然后没答上来 我就听见面试官敲键盘了 我就知道面评十有八九寄了没有实习思考sql优化 索引失效项目因为是demo被面试官当玩具了没兴趣开始kpi用cursor怎么调优什么目标检测我都给搬出来了 感觉不该这么答的 应该说java相关的cursor的具体规则配置 怎么用的 有什么经验我记得有佬在牛客里明确给过cursor的帖子想不出来居然没有算法 感觉完蛋了哈个人提升点..反思自己反问第一次面这种厂 心里没底 估计大概率一轮游更新 已挂反思了一下 主要是自己当时很嘴笨吧 实习没有完全能说出来 还有之后的基本上表现是越来越差希望自己再次努力
查看22道真题和解析
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务