能否把 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

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Redis中如何实现商品秒杀

《Redis中如何实现商品秒杀》:本文主要介绍Redis中如何实现商品秒杀问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录技术栈功能实现步骤步骤一:准备商品库存数据步骤二:实现商品秒杀步骤三:优化Redis性能技术讲解Redis的List类型Redis的Set

Redis如何实现刷票过滤

《Redis如何实现刷票过滤》:本文主要介绍Redis如何实现刷票过滤问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言一、概述二、技术选型三、搭建开发环境四、使用Redis存储数据四、使用SpringBoot开发应用五、 实现同一IP每天刷票不得超过次数六