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消耗)

全部评论

相关推荐

HTTP头是HTTP协议中的一部分,用于在请求和响应中传递附加的信息。 HTTP头由字段名和字段值组成,用冒号分隔,每个字段占据一行。以下是几个常见的HTTP头字段及其作用:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=b48bebe08e474db8b80b853b12bafd48User-Agent:指明发送请求的客户端应用程序的类型和版本。服务器可以根据这个头字段来判断用户的设备或浏览器类型,以提供适合的内容。例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3Content-Type:指定请求或响应中传输的数据的MIME类型。对于请求,它告诉服务器请求正文的内容类型;对于响应,它告诉浏览器响应正文的内容类型。例:Content-Type: application/jsonContent-Length:指定请求或响应正文的字节数。服务器可以使用此字段来确定正文的长度,从而正确解析请求或响应。例:Content-Length: 348Accept:指定客户端能够处理的响应内容类型。浏览器在发送请求时使用此字段,以告诉服务器它可以接受哪些类型的响应。例:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8Authorization:用于在请求中传递身份验证信息,通常用于保护需要授权访问的资源。例:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Cookie:用于在请求中传递保存在客户端的会话信息。服务器可以使用此字段来识别和验证用户。例:Cookie: sessionId=ABC123这些是HTTP头字段中的一些常见例子。HTTP头字段的作用是在请求和响应之间传递额外的信息,以便客户端和服务器可以根据需要进行适当的处理。不同的HTTP头字段有不同的作用,可以用于传递身份验证信息、内容类型、缓存控制等。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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