目录
1,rabbitMQ消息队列优点
1)解耦
服务之间进行解耦,A服务调用B服务时,需要编写相关的代码,调用情况发生改变时,需要修改调用的代码
2)异步
传统的同步调用方式,需要等待调用完成,才能进行其它业务
异步调用方法,将消息发送到队列中,就可以返回,执行其它业务,速度大大提升
3)削峰
出现流量激增的情况时,消息队列可以设置消息的最大数量,处理一部分消息,其它消息交给队列排队处理
2,rabbitMQ五种消息模型
1)一对一模型:一个生产者发送消息到一个队列,一个消费者从队列中取消息。
2)工作队列:生产者将消息分发给多个消费者,如果生产者生产了100条消息,消费者1消费50条,消费者2消费50条。
3)发布/订阅模式:发布订阅模式存在多个队列,不同的消费者可以从各自的队列中处理完全相同的消息。
4)路由模式:消息队列可以给队列绑定不同的key,生产者发送消息时,给消息设置不同的key,这样交换机在分发消息时,可以让消息路由到key匹配的队列中。
5)主题模式:和路由模式差不多,在key中可以加入通配符:
-
* 匹配任意一个单词
-
# 匹配逗号隔开的多个单词
3,rabbitMQ消息可靠性
消息存在丢失的几个环节和解决方案:
-
生产者到交换机 confirm 机制 确定生产者将消息投递到交换机
-
交换机到队列 return 机制 交换机发送消息到队列失败会执行回调
-
队列到消费者 消息没发 --> 消息持久化
消息发了,不知道是否被消费 ---> 手动确认 ack
4,消息幂等性
重复消费问题:
队列发送消息给消费者,因为网络原因,消费者没有收到,队列重复发送,网络恢复后会发送多个相同的消息给消费者
解决方案:
-
给每个消息添加id
-
消费者获得消息后,通过id查询redis,判断该id是否存在
-
如果不存在,就修改该id的value为1,执行业务,进行手动确认(redis的setnx方法)
-
如果存在,就不执行业务
5,redis简介
Redis是一个高性能的内存数据库,以key-value方式存储数据,可以作为缓存使用。
可以缓解数据库压力,基于内存,性能远高与磁盘。
Redis的特点:
-
性能高(读的速度是110000次/s,写的速度是81000次/s,单机redis支撑万级并发)
-
支持多种存储类型
-
丰富的特性(发布订阅、事务、过期策略等)
-
支持持久化
-
单线程 (避免上下文切换,线程同步问题)
6,Redis的数据类型
Redis的数据以key-value方式存储。
数据类型有:
-
string 字符串(简单的key-value数据,适合保存单个数据,如:用户数量、库存数、商品数)
-
hash 哈希(适合保存复杂类型数据,如:用户对象)
-
list 列表(链表结构,适合保存有序的、可重复的数据,如:商品列表、评论列表)
-
set 无序集合(适合保存无序的,不可重复的数据)
-
zset 有序集合(适合保存有序的,不可重复的数据)
7,Redis的常见问题以及解决方案
1)缓存击穿
高并发的情况下,短时间内缓存会被穿过,请求直接打到数据库上,可能导致数据库压力过大。
解决方案:对代码上锁(双重检查锁)
2)缓存穿透
高并发的情况下,如果查询不存在的数据,因为缓存和数据库都不存在,请求都会打到数据库上,可能导致系统崩溃。
解决方案:
1 保存不存在的数据到缓存中,设置一定过期时间
2 布隆过滤器(直接过滤掉不存在数据的请求) 不能准确判断是否存在数据,能准确判断数据不存在
3)缓存雪崩
高并发的情况下,缓存服务器重启或热点数据同时过期,全部访问数据库,导致数据库宕机
解决方案:
1 配置缓存集群
2 尽量给热点数据设置不一样的过期时间,相对均匀
3 消息持久化策略
8,redis持久化策略
Redis属于内存式数据库,程序关闭后数据会清空,有时候需要将内存中的数据长期在文件保存起来
持久化策略
-
AOF:默认每秒对数据进行持久化
-
RDB:按条件触发持久化操作(任意一个)
例:900 1 900秒修改一次
9,redis淘汰策略
edis数据保存在内存中,数据太多会出现溢出问题,Redis会根据某些策略淘汰一些数据
64位系统,上限就是内存上限;32位最大4G
淘汰策略:maxmemory-policy
值:
noevication(默认) 不淘汰
allkeys-lru(推荐) 使用LRU淘汰比较少使用的键
volatile-lru 在过期的键中淘汰较少使用的
allkeys-random 在所有键中随机淘汰
volatile-random 在过期键中随机淘汰
volatile-ttl 在过期键中淘汰存活时间短的键
10,redis事务
Redis的事务与MySQL事务不同,redis是将一系列操作打包,一起提交。没有原子性,隔离性的,也没有回滚事务。
multi 启动事务
exec 提交事务
discard 放弃事务
watch 监视某个数据,如果修改该数据时,在另一个事务中对该数据进行了修改,当前的修改就被放弃
总结:
事务中如果出现语法错误,整个事务无法执行;如果出现数据错误,事务可以成功一部分,失败一部分。
11,Elasticsearch简介
分布式数据分析引擎
-
分布式,无需人工搭建集群
-
Restful风格,一切API都遵循Rest原则,容易上手
-
近实时搜索,数据更新在Elasticsearch中几乎是完全同步的(倒排索引)。
12,Elasticsearch的基本概念
索引库(indices) | indices是index的复数,代表许多的索引, |
类型(type) | 类型是模拟mysql中的table概念,一个索引库下可以有不同类型的索引,比如商品索引,订单索引,其数据格式不同。不过这会导致索引库混乱,因此未来版本中会移除这个概念 |
文档(document) | 存入索引库原始的数据。比如每一条商品信息,就是一个文档 |
字段(field) | 文档中的属性 |
映射配置(mappings) | 字段的数据类型、属性、是否索引、是否存储等特性 |
13, Elasticsearch查询方法
1,查询所有(match_all)
2 ,匹配查询(match)
会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
3 ,多字段查询(multi_match)
4,词条匹配(term)
被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串
5,布尔组合(bool)
bool
把各种其它查询通过must
(与)、must_not
(非)、should
(或)的方式进行组合
6,范围查询(range)
range
查询找出那些落在指定区间内的数字或者时间
7,模糊查询(fuzzy)
fuzzy
查询是 term
查询的模糊等价。它允许用户搜索词条与实际词条的拼写出现偏差,但是偏差的编辑距离不得超过2