消息中间件之RabbitMQ
一、引言1.什么是消息中间件?在早期的计算机通信中,都是采用点对点通信,并且两边要使用相同的协议,这无疑是强耦合且低可靠的,于是出现了消息中间件——位于通信双方中间的组件
官方点说,消息中间件是一种软件架构模式,用于处理分布式系统中的异步通信和数据传输。它是一种基于消息传递的模式,用于解耦不同应用程序或系统之间的通信,以提高系统的可靠性、可扩展性和可维护性
那么消息中间件具体有什么用呢?简单点说就是异步、削峰、解耦
异步:当系统中需要处理大量的请求时,可以将请求发送到消息队列中,而不是直接调用后端服务。后端服务从消息队列中读取请求,并通过异步方式进行处理,从而提高系统的性能和吞吐量。同时,异步方式还可以避免由于请求处理时间过长而导致的请求积压问题,提高系统的响应速度。
削峰:当系统面临高并发请求时,可以通过消息队列来削峰。具体来说,可以将请求发送到消息队列中,然后由后端服务从消息队列中读取请求进行处理。由于消息队列可以缓存大量的请求,因此可以有效地减少请求的到达率,从而保护系统不被过载。
解耦:当系统中不同的服务之间需要进行通信时,可以使用消息队列来解耦。具体来说,可以将消息发送到消 ...
Zookeeper
一、引言Zookeeper是一个开源的分布式协调服务,用于管理大型分布式系统中的配置信息、命名服务、分布式锁和分布式应用程序的协同工作等
经典应用场景?
命名服务
在分布式系统中,不同的节点需要协同工作,但是节点的地址、端口等信息可能会发生变化,此时可以使用Zookeeper作为命名服务,记录节点的地址、端口等信息,并提供动态更新功能
配置管理
在分布式系统中,对系统的各个组件的配置信息进行统一管理和分发的一种技术
数据同步
是指在分布式系统中,将多个节点之间的数据保持一致的过程
leader选举
用于在一个分布式系统中选择一个节点作为Leader(领导者)来协调整个系统的工作
消息队列
可作为分布式消息队列组件的一部分
通知系统
用作分布式的通知系统,为分布式应用提供可靠的通知和事件服务,通常情况下,Zookeeper的通知系统基于Watch机制实现
二、架构1.单机架构
安装:支持源文件、docker安装
连接:通过zkCli.sh连接
管理:图形化界面zkui
2.数据模型与基本操作2.1 分层命名空间Zookeeper的分层命名空间是指将Zooke ...
ElasticSearch
一、引言1.什么是搜索?概念:搜索是指使用计算机程序在互联网或本地计算机存储的数据中查找特定信息的过程
即输入关键字,获取想要结果的过程
搜索涉及的种类十分繁杂,包括新闻网页搜索、站内搜索(垂直搜索)等
2.如何实现搜索2.1 传统数据库传统MySql数据库能否实现搜索功能呢?答案是肯定的
但是传统MySql数据库实现搜索只能适用数据量小,简单搜索的场景,具有以下弊端
存储问题:电商网站商品上亿条时,涉及到单表数据过大必须拆分表,数据库磁盘占用过大必须分库 (mycat)
性能问题:解决上面问题后,查询“笔记本电脑”等关键词时,上亿条数据的商品名字段逐行扫描,性能跟不上
不能分词:如搜索“笔记本电脑”,只能搜索完全和关键词一样的数据,那么数据量小时,搜索“笔记本电脑”,“电脑”数据要不要给用户
2.2 全文检索与倒排索引在MySql中,其实也支持全文检索,主要依赖于MySql的全文索引来实现,是一种用于快速搜索文本数据的索引技术,MySQL 5.6及以上版本支持全文索引
全文索引会将指定的列中的文本数据进行分词,去除停用词等处理,生成一个词汇表,将每个词汇与出现该词汇的行进行关联, ...
redis详解(三)redis场景与实战
一、场景问题1.数据丢失场景持久化数据丢失:
RDB采用定时备份,有可能丢失间隔区间内的数据
AOF使用追加,也有可能丢失1s的数据
主从切换:主从切换是异步的,必定会导致数据丢失
脑裂问题:出现多个master,网络恢复时丢失一些master上的数据
2.跟数据库数据一致性问题缓存一致性问题:mysql数据变更,如何保证redis的数据一致性呢?
常见的答案是延时双删,即先删redis,再该数据库,然后间隔一定时间再删redis
防止修改数据期间从redis读到不一致数据
但是实际上,这个间隔时间如何确定?工作中也基本上没有人用延时双删,因为redis本来就不是一个保证强一致性的数据库,它的优点在于快
所以最常见的方式,就是直接把redis的数据删除即可,下次查询数据库时再放进去就行了
常见数据一致性解决方案:
加锁:牺牲性能,不建议使用
延时双删:间隔时间不好确定,不建议使用
最终一致性方案
给缓存设置过期时间,允许一部分时间内的数据不一致
canal监听,在数据变更后同步修改redis数据
3.缓存穿透、击穿、雪崩缓存穿透定义:查询的key,redis里面没有,db里 ...
redis详解(二)redis高可用方案
一、持久化为什么要持久化?
由于redis数据都是保存在内存中的,那么如果遇到断电等问题,没有持久化就会导致所有数据都丢失,这是很严重的问题,因此要对redis进行持久化
1.RDB快照RDB 是 Redis 默认的持久化方案。RDB快照(Redis Database),当满足 一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件
什么时候触发呢?
可以分为自动触发与手动触发
自动触发
配置触发,即间隔一定时间备份一次
shutdown正常关闭
flushall指令触发
手动触发
save:主线程去进行备份,备份期间不会去处理其他指令,其他指令必须等待
bgsave:fork一个子线程去进行备份
优势
快
做备份,恢复快,是非常紧凑的文件
新起子线程,子线程会将当前Redis的数据写入一个临时文件
当临时文件写完成后,会替换旧的RDB文件
主线程指令操作不需要跟磁盘进行任何交互
劣势
安全性很低,可能会有数据丢失
fork子线程可能特别耗时,cpu不友好
2.AOF追加由于RDB的数据可靠性非常低,所以Redis又提供了另外一种持久化方案: Append Onl ...
redis详解(一)redis基础
一、引言1.为何要有redis?只用mysql不行吗?
因为mysql为了保证数据安全性,所以每次交互都要落盘,即与磁盘进行交互
众所周知,磁盘访问的速度是很慢的,所以mysql这种方式极大的限制了高并发与高速访问的速度
2.那么redis为什么能做到那么快呢?因为mysql是与磁盘进行交互所以比较慢,所以redis就将操作都在内存中进行,所以它是一个内存型数据库,由此使得redis速度很快,此外还有一些其他措施保证redis速度,如下
它是一个内存型数据库:所以访问不需要与磁盘进行交互,内存会快很多
它使用单线程进行操作:减少了上下文切换等消耗
它使用了IO多路复用技术:极大的提升了单线程的速度
Redis 2.x版本使用的是select。
Redis 3.x版本开始引入了Epoll,并在Redis 4.x版本中成为默认的IO多路复用机制。
Redis 6.x版本中新增了IOCP支持,并在Windows平台上成为默认的IO多路复用机制。
它本身是Key-value结构:类似hashmap,访问速度接近O(1)
底层数据结构:跳表,sds等采用了空间换时间的思路
3.CAP理论 ...








