JAVA面试题精选(rabbitMQ消息队列&&redis&&Elasticsearch)

目录

1,rabbitMQ消息队列优点

2,rabbitMQ五种消息模型

3,rabbitMQ消息可靠性

4,消息幂等性

5,redis简介

6,Redis的数据类型

7,Redis的常见问题以及解决方案

 8,redis持久化策略

9,redis淘汰策略

10,redis事务 

11,Elasticsearch简介

12,Elasticsearch的基本概念

13, Elasticsearch查询方法


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消息可靠性

 消息存在丢失的几个环节和解决方案:

  1. 生产者到交换机  confirm 机制 确定生产者将消息投递到交换机

  2. 交换机到队列     return 机制 交换机发送消息到队列失败会执行回调

  3. 队列到消费者   消息没发 --> 消息持久化

                             消息发了,不知道是否被消费 ---> 手动确认 ack

4,消息幂等性

重复消费问题:

队列发送消息给消费者,因为网络原因,消费者没有收到,队列重复发送,网络恢复后会发送多个相同的消息给消费者

 解决方案:

  1. 给每个消息添加id

  2. 消费者获得消息后,通过id查询redis,判断该id是否存在

  3. 如果不存在,就修改该id的value为1,执行业务,进行手动确认(redis的setnx方法)

  4. 如果存在,就不执行业务

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值