能否把 Redis 当做消息队列来用呢?

2024-03-27 16:52

本文主要是介绍能否把 Redis 当做消息队列来用呢?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个问题并不是面试中经常会问到的问题,而是我在平时看一些大牛写的技术文章的时候看到的一个问题,这个问题引发了我强烈的思考,我感觉我想通了这个问题之后,对redis和kafka都有了一个全新的认识,感觉像发现了新大陆这种感觉。这其实是一个泛问题,如果一个人对redis和kafka都很了解,那回答这个问题绝对是侃侃而谈的。我这几天一直在思考这个问题,感觉已经将redis和kafka的这个脑图都给构建出来了。

在我看来,Redis 其实就是一个内存存储系统。我的理解就是 Redis 是一个可以用来存数据的系统,就这么简单。Redis 支持很多种数据结构,我的理解就是你的那些数据可以按照不同的结构存储在 Redis 中。比如 Redis 有 List 这种数据结构,那数据在 Redis 中就很有可能是排成一列这样子存放的。

所以这就引出了一个问题:既然 Redis 支持数据排成一列存放,那 Redis 可不可以用作消息队列呢?我听到最多的消息队列是 activemq、rabbitmq、rocketmq、kafka 这些,我基本没听说过 Redis 消息队列。

假如我们现在有一个最简单的 Redis 内存系统,那这个系统会有什么不足呢?首先 Redis 支持 List 这种数据结构,而 List 的底层实现是链表。按理来说,在头尾操作元素是很方便的事情,用作消息队列天然适配。但是,由于是链表,你在取消息的时候是直接把消息取出来的,取出来后,链表就会删除这个元素。万一现在有很多个消费者都想消费这条消息,本来这条消息是共享的,结果你直接自己消费了,其他消费者消费不了就很难受,而且万一你自己还消费不成功这条消息,想再从队列里取出来再消费一次,已经没机会了,你刚刚已经拿出来了,所以这样子是不行的。

所以后来才有了发布/订阅者模式,这种模式就可以完美的解决上述的问题。

其实,现在的 Redis 是有发布/订阅者模式的,但是其实还是有不足的地方,问题出在哪里?Redis 在关于数据不丢失问题做不到严格的保证。你想想,Redis 保证数据不丢失,也就是我们平时说的 Redis 数据持久化的时候,无非就是用 AOF日志 和 RDB内存快照,这两种方式都不能严格的保证数据不丢失,反而消息队列比如 kafka 这种,就使用 leader-follower 模式来严格的保证数据不丢失,而且 kafka 在生产者那里为了保证数据不丢失也做了处理,甚至在消费者那里,都考虑到关闭offset 这个参数,这种对数据不丢失的严谨性是 Redis 比不了的。

当然,这也很正常,毕竟 Redis其实都不是很在乎数据丢不丢,因为 Redis 用的最多的就是做缓存,丢一点数据其实对整体没有什么大的影响。不仅是保证不了消息不丢,在保证消息不被重复消费,保证消息被有序消费这些点上,Redis 都无能为力。

当然,我这里说的 Redis 是早期的 Redis,现在的 Redis 肯定不是这样子的。比如说在保证数据不丢这点,Redis 现在已经做的很好了,它采用了主从复制+哨兵选举的方式,感觉和 kafka 保证数据不丢的思路是有点相似的。此外,它还用了分片集群,通过分片集群,Redis 就可以轻松的进行横向扩展,处理更大规模的数据了。

上面就是我自己对于这个问题的理解。因为这是一个开放性的问题,所以不同的人都会有自己不同的理解。当然,假如你对 Redis 和 kafka 掌握的越好,那你回答这道题就越能侃侃而谈,甚至通过这道题把你懂得的所有 Redis 和 kafka 的细节都说出来。我觉得我应该多思考这种开放性的问题,研究这种问题感觉是有利于促进对知识点的理解的。这种问题也有利于检测对一个知识点的理解到底掌握到哪种程度。复习的时候,也可以用这个问题当做复习,就是问你这道题,你把你懂的关于 Redis 和 kafka 的所有知识点都讲出来。

这篇关于能否把 Redis 当做消息队列来用呢?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852804

相关文章

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.