Redis为什么是中间件?

有些“上古”程序员一直坚持反对使用redis怎么办?

分享大人物的答案似乎合情合理。

不要告诉我们是否使用redis。你必须告诉我们你为什么要使用redis。没有redis的业务怎么了?世界上没有免费的午餐。如果不直接使用头部缓存/NoSQL,可能会带来越来越严重的问题。

单个数据库的最大优点是易于实现事务,并由数据库本身保证。举个简单的例子,要下订单,需要扣除库存并插入订单条目。如果inventory和order都是数据库表条目,那么这个事务是无可挑剔的。如果库存在redis中,订单条目是mysql,通常需要先写redis,成功后再写数据库。如果您写数据库失败,需要回滚redis,如果由于网络或其他原因回滚失败,将再扣减一个存货。不要认为这些事情很容易解决。事务处理的复杂性远远超出您的想象。例如,当您编写mysql时,您在提交时就失去了连接。你无法判断提交是成功还是失败。你的redis是不是在倒退?

因此,当您引入一个新层时,您必须弄清楚您必须使用cache/NoSQL的目的以及您可以接受的一致性模型。否则,你就要出丑了。

为啥Redis/Mongo这么快,就不能直接替代mysql吗?

你好,我是一名互联网行业开发工程师,同时也是高质量vlog领域的创造者。欢迎关注我

!目前互联网缓存中间件大多使用redis、mongodb等NoSQL数据库,解决方案比较成熟。但是为什么要使用关系数据库呢?让我们谈谈我的理解

redis是数据库还是中间件 redis中间件到底是什么 redis和mq都是中间件吗

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任。如有侵权/违法内容,本站将立刻删除。

Redis系列(三)—— Redis和消息中间件

什么是消息中间件

先看百科:消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。
我们来看几个关键点:
消息 消息中间件定义了一个协议(模型),基于该协议可以传递消息
分布式 消息中间件的引入是为了解决分布式系统的问题,对于简单的单应用系统用不着
举例来说,一个常见的最简单的UGC应用,至少包括后端、APP、审核后台、统计平台)。UGC应用的生命力在于用户产生内容的质量,所以需要审核用户提交的内容;另一方面,需要统计用户产生内容的数据。用户A产生的内容C在系统间的流动路径是这样的,APP -> 后端 -> 审核 -> 统计,其中审核和统计可以同时进行,这就遇到了各系统间的数据通信问题。简单的解决方案是所有的系统公用一套数据库(单库或者集群,总之数据库结构一样)。这样的好处是实现简单,可靠;坏处是没有关注平台间的差异性,不同平台需要的数据结构不一样,通用的数据库容易造成各个平台都达不到最好的性能,比如统计需要对所有数据进行计算;另外各个系统之间在数据库发生了耦合,在统计和审核过程中产生的垃圾SQL可能影响在线的业务。引入消息中间件作为各个系统间通信大使可以有效的解决上述问题:数据在后端产生后,可以扔到消息中间件,其余需要这个数据的系统订阅改消息中间件就可以拿到这条数据并进行自己业务内的操作。这样做的最大好处是系统隔离,系统之间不互相影响,缩小问题的影响范围,避免问题的连锁反应——把三个容易出问题的系统绑在一起,出问题的概率不止提升了三倍!
消息中间件就像是快递员,把东西给我,告诉我送给谁,你忙你的去吧。

消息中间件的衡量标准

消息中间件的三大要素:生产者(Producer)、消息(Message)、消费者(Consumer)。衡量标准基本围绕这三者的交互,这里只说我在选择消息中间件的时候常用的。


消息路由 消息如何经过消息中间件到达消费者,在一定程度上决定了消息中间件的灵活性。简单的命名队列,TOPIC订阅能满足大部分的场景,对于复杂的业务可能需要比如基于PATTERN的路由(RabbitMQ),消息复制,消息生命周期管理(beanstalk)。


消息可靠性 大部分场景下消息是容忍丢失的,或者说对性能的渴求大于可靠性,比如异步发短信,异步发邮件,概数数据统计,日志等。另外有的场景是不允许消息丢失的,消息的丢失会带来数据的不一致,不一致的数据很多时候是灾难的开始,比如异步写数据,下单后减库存,转账等。可靠性基本都依赖于持久化。


消息重放 不常用但是很有用。这个说的是即使是消费过的消息也能设定offset(一般是时间点)重新消费。这个功能在消息下游数据丢失,新系统导入旧数据的时候非常有用,不用再去理繁杂的数据对应关系,按照正常的业务逻辑处理消息就OK了,非常好用!非常好用!非常好用!


消息堆积 抗流量神技。像双十一这种超高峰流量都会用到这个功能,这时候一方面会把消息中间件下游业务(Consumer端)的机器挪到核心业务,另一方面消息中间件在高并发投递消息的时候可能出问题,所以把消息暂存在中间件,等流量高峰过去了再投递到下游业务。
分布式集群支持 高可用的需求,解决单点问题。


ACK 消息确认,在下游业务确认后才将消息标记为已消费,处理超时则重新投递消息,这里要求下游业务自己做可重入(幂等)


消息顺序 有的业务要求消息投递顺序和消费顺序一致,或者至少要求对于单个用户顺序一致,比如用户的赞/取消操作,顺序反了数据就会错乱


性能和扩展 这里指的扩展是能否通过增加Consumer来提高消息的消费速率以及消息中间件的容量是否有理论的上线;性能主要指tps、qps以及并发连接数。


消息协议 优先考虑标准协议或者使用广泛的协议,有利于后期的维护和扩展

Redis作为消息中间件

Redis自带的PUB/SUB机制,即发布-订阅模式。这种模式生产者(producer)和消费者(consumer)是1-M的关系,即一条消息会被多个消费者消费,当只有一个消费者时即可以看做一个1-1的消息队列,但这种方式并不适合题主的场景。首先,数据可靠性的无法保障,题主的数据最终需要落库,如果消息丢失、Redis宕机部分数据没有持久化甚至突然的网络抖动都可能带来数据的丢失,应该是无法忍受的。其次,扩展不灵活,没法通过多加consumer来加快消费的进度,如果前端写入数据太多,同步会比较慢,数据不同步的状态越久,风险越大,可以通过channel拆分的方式来解决,虽然不灵活,但可以规避。这种方案更适合于对数据可靠性要求不高,比如一些统计日志打点。
Redis的PUSH/POP机制,利用的Redis的列表(lists)数据结构。比较好的使用模式是,生产者lpush消息,消费者brpop消息,并设定超时时间,可以减少redis的压力。这种方案相对于第一种方案是数据可靠性提高了,只有在Redis宕机且数据没有持久化的情况下丢失数据,可以根据业务通过AOF和缩短持久化间隔来保证很高的可靠性,而且也可以通过多个client来提高消费速度。但相对于专业的消息队列来说,该方案消息的状态过于简单(没有状态),且没有ack机制,消息取出后消费失败依赖于client记录日志或者重新push到队列里面。

关于

本文首发自 架构小站,转载请注明,欢迎关注。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...

  • //我所经历的大数据平台发展史(三):互联网时代 • 上篇http://www.infoq.com/cn/arti...

  • 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下: 以时间复杂度为O...

    高广超阅读 12,175评论 8赞 168

  • 消息队列设计精要 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终...

  • 美国佐治亚西南州立大学国际交流处处长Helen Tate,她,留着齐耳短发,精干,瘦削,说是贵族后裔,刚刚接了上任...

    大红英阅读 435评论 1赞 2

  • 当我看到这道作业的时候,我在脑海里搜索了半天感觉好像没有什么重大的事情或者重大的选择改变我的一生。如果说有,应该就...

  • 这首歌,是第一天猫叔的开场,也是最后一天我的完美收工。歌曲在耳边回响,我也开启了在简书的新征途。 ≈ 没有什么能够...

    懒猫物语阅读 202评论 27赞 17

  • 昨日参加了《老朋友》杂志三周年座谈会,新老朋友欢聚一堂,高兴,惬意啊!三年来,我们一起旅游,一起做公益,一起参加集...

    景老牛阅读 170评论 0赞 1

nredis-proxy 是一个以redis 协议为主的高性能稳定的代理中间件服务,不侵入业务代码,与业务毫无联系,不需要改任何应用代码,天然支持分布式部署。 一:功能特点: 1:自带连接池,性能高效 2:提供分片策略,扩展性强,可自定义分片算法 3:提供读写分离,一主多从,从按照权重读取 4:提供自动监听功能,主挂了,提供选举算法,从作为主 5:可HA分布式部署,节点随意扩展 二:nredis-proxy 架构图 三:nredis-proxy 部署架构...

你要找的是不是: nredis-proxy首页 nredis-proxy文档 nredis-proxy源码下载

Redis专题(1):构建知识图谱

一、Redis是什么 REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。Redis是一个开源的使用ANSI、C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value...

查看全文 >>

正经的聊聊分布式架构中的 Redis

那么 redis 里到底存什么呢?下面我以秒杀系统为例列出: 秒杀商品具体信息 秒杀商品热门排行榜列表 秒杀商品库存信息 在秒杀系统中,大部分会请求会去查询商品信息,排行榜等信息,这些信息并不会经常变动,也不会...

查看全文 >>

最新 Java 后端干货,建议收藏!

Redis 到底是单线程还是多线程&xff1f;Redis 常用操作命令&xff0c;非常详细&xff01;Redis Linux 安装运行实战全记录Spring Data Redis 详解及实战Redis 再牛逼&xff0c;也得设置密码&xff01;Redis Cluster 官方集群搭建...

查看全文 >>

为什么说Redis是单线程的以及Redis为什么这么快!

我们先探讨一下Redis是什么,Redis为什么这么快、然后在探讨一下为什么Redis是单线程的?二、Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。它支持多种类型的数据...

查看全文 >>

单线程的Redis为什么这么快?

我们先探讨一下Redis是什么,Redis为什么这么快、然后在探讨一下为什么Redis是单线程的?二、Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。它支持多种类型的数据...

查看全文 >>

【3y】从零单排学Redis【青铜】(一)

1.1为什么要用Redis&xff1f;从上面可知&xff1a;Redis是基于内存&xff0c;常用作于缓存的一种技术&xff0c;并且Redis存储的方式是以key-value的形式。我们可以发现这不就是Java的Map容器所拥有的特性吗&xff0c;那为什么还...

查看全文 >>

JAVA程序员备战跳槽季,准备面试必备的技术大纲,请...

Redis持久化的几种方式,优缺点是什么,怎么实现的 Redis的缓存失效策略 Redis集群,高可用,原理 Redis缓存分片 Redis的数据淘汰策略 JVM 详细jvm内存模型 讲讲什么情况下回出现内存溢出,内存泄漏?说说Java线程栈...

查看全文 >>

带上问题来学redis,看到不吃亏(什么是redis?...

[toc]redis是什么?官方套话我就不多说了,做后端的朋友多多少少肯定耳濡目染了。redis是一个NOSQL类型数据库,是一个高性能的key-value数据库,是为了解决高并发、高可用、大数据存储等一系列的问题而产生的数据库...

查看全文 >>

面试官:你对Redis缓存了解吗?面对这11道面试题你...

redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?面试官心理分析 这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理和特点,就是 redis 实际上是个单线程工作模型,你要是这个都不...

查看全文 >>

【3y】从零单排学Redis【青铜】

Redis是一个开源的,基于内存的数据结构存储,可用作于数据库、缓存、消息中间件。从官方的解释上,我们可以知道:Redis是基于内存,支持多种数据结构。从经验的角度上,我们可以知道:Redis常用作于缓存。就我个人...

查看全文 >>