面试 .......问题

redis的5种数据类型

string 字符串(可以为整形、浮点型和字符串,统称为元素)
list 列表(实现队列,元素不唯一,先入先出原则)
set 集合(各不相同的元素)
hash hash散列值(hash的key必须是唯一的)
sort set 有序集合

面试官好,我叫XX,毕业于XXXX,,今天来面试java开发这个工作
最近一个项目是XXXXX(MES 系统),
MES系统就是一个工厂的一个生产管理系统(就是生产线管控物料、人员、工艺、工序的一个系统),有仓储管理模块、异常管理模块、设备管理模块、生产管理模块、供应商管理模块、系统管理模块(有字典管理、用户管理、标签模块等),
用到的技术有springBoot、SpringCloud、Maven、Redis、前端用到的有VUE(具体的就是ElementUI),数据库用的是MySQL
我负责的模块有异常管理模块、设备管理模块、
异常管理模块主要就是生产过程中发现设备异常,操作员点击异常提报按钮填写异常信息,主要有异常等级、原因、时间、地点、处理人等,提交完之后会根据处理人发送企业微信消息(企业微信调用的API),会有处理人来处理,处理完后填写异常原因、解决方案、异常方案文档(可选择上传)(文档会传到文件服务器上)、处理接收时间,然后会有审批人员审批进行审批,如果不通过则会进行异常升级,从新选择处理人进行处理,如果审批通过则修改异常状态为已通过。
设备管理主要是生成设备巡检、保养、维修计划,根据计划定时生成任务,当天的任务会给负责人发送企业微信消息,然后任务会有处理人来处理。

电商项目
这个项目是B2C类型的购物平台,主要分为三层:
表现层:主要有后台管理、商品详情、购物车系统、订单系统、支付系统、用户管理系统、单点登录系统,
服务中间件dubbo+zookeeper,
服务层:后台管理服务,购物车服务、订单服务,
缓存用的是redis
持久层:mysql数据库

-------------------------------用户单点登录实现---------------------------
实现步骤:
1.当用户输入用户名和密码点击登录时,将请求发送给JT-WEB消费者服务器.
2.JT-WEB服务器将用户信息传递给JT-SSO单点登录系统完成数据校验.
3.如果登录成功,则动态生成密钥信息,将user数据转化为json.保存到redis中. 注意超时时间的设定.
4.JT-SSO将登录的凭证 传给JT-WEB服务器.
5.JT-WEB服务器将用户密钥TICKET信息保存到用户的cookie中 注意超时时间设定.
6.如果登录不成功,则直接返回错误信息即可.
在这里插入图片描述

-------------------------------购物车---------------------------
购物车:
用户查看商品,将商品添加到购物车,首先就判断用户是否登录,如果没有登录则创建新的购物车,将购物车对象转化成json保存在cookie中,
如果登录了则从redis中查询该用户的购物车是否存在,如果不存在则创建购物车对象,将购物车对象装转化为JSON保存在redis中,如果用户有购物车则判断用户添加的商品是否存在,如果不存在则将商品添加到购物车里,如果存在,则在原来商品数量的基础上进行增加。
在这里插入图片描述

-------------------------------Redis---------------------------
Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库、缓存、消息中间件
1.读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
2.支持数据持久化,支持AOF和RDB两种持久化方式。
3.支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
4.数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
5.支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
Redis的五种数据结构包括以下五种:
String:字符串类型, 做简单的键值对缓存
List:列表类型, 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的数据
Set:无序集合类型, 交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集
ZSet:有序集合类型, 去重但可以排序,如获取排名前几名的用户
Hash:哈希表类型, 结构化的数据,比如一个对象

为什么要用 Redis /为什么要用缓存?
高性能:
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这 些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。
高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会 直接到缓存这里而不用经过数据库。

什么是Redis持久化?
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
1.RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中 的save参数来定义快照的周期。
优点:
1、只有一个文件 dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任 何 IO 操作,保证了 redis 的高性能
4.相对于数据集大时,比 AOF 的启动效率更高。
缺点:
1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严 谨的时候)

2、AOF持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
优点:
1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如 误操作的 flushall))
缺点:
1、AOF 文件比 RDB 文件大,且恢复速度慢。
2、数据集大的时候,比 rdb 启动效率低。

Redis的配置方案有分片模式、哨兵模式、集群模式
分片模式:
单台redis存储的数据容量有限的. 如果需要存储海量的缓存数据,则使用单台redis肯定不能满足要求.为了满足数据扩容的需求.则可以采用分片的机制实现
redis分片特点:
1.可以实现Redis内存数据的扩容.
2.redis分片本身没有高可用效果的.如果宕机将直接影响用户的使用.

哨兵模式:
原理说明:
1.配置redis主从的结构.
2.哨兵服务启动时,会监控当前的主机. 同时获取主机的详情信息(主从的结构)
3.当哨兵利用心跳检测机制(PING-PONG) 连续3次都没有收到主机的反馈信息则断定主机宕机.
4.当哨兵发现主机宕机之后,则开启选举机制,在当前的从机中挑选一台Redis当做主机.
5.将其他的redis节点设置为新主机的从.
redis哨兵特点:
1.Redis哨兵可以实现Redis节点的高可用.但是哨兵本身没有实现高可用机制.(最好不要引入第三方)
2.Redis哨兵有主从的结构 实现了内存数据的备份. 但是没有实现内存扩容的效果.
监控:监控master和slave是否正常运行,以及哨兵之间也会相互监控
自动故障恢复:当master出现故障的时候,会自动选举一个slave作为master顶上去。

关于选举机制-脑裂现象
说明: 当集群进行选举时,如果连续3次都出现了平票的结果的则可能出现脑裂的现象.
问题: 出现脑裂现象的概率是多少??? 1/8
数学建模:
抛银币连续3次出现平票的概念是多少? 1/8=12.5%
第一次: 正正 正反 反正 反反 1/2
第二次: 正正 正反 反正 反反 1/2
第三次: 正正 正反 反正 反反 1/2
预防: 增加主节点的数量可以有效的降低脑裂现象的发生.

Cluster(集群)模式:
集群模式实现了Redis数据的分布式存储,实现数据的分片,每个redis节点存储不同的内容,并且解决了在线的节点收缩(下线)和扩容(上线)问题。
集群模式真正意义上实现了系统的高可用和高性能
一致性hash算法,
特性1-平衡性,平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
特性2-单调性,单调性是指在新增或者删减节点时,不影响系统正常运行
特性3-分散性,分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据
1.通过哈希的方式,将数据分片,每个节点均分存储一定哈希槽(哈希值)区间的数据,默认分配了16384 个槽位
2.每份数据分片会存储在多个互为主从的多节点上
3.数据写入先写主节点,再同步到从节点(支持配置为阻塞同步)
4.同一分片多个节点间的数据不保持一致性
5.读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点
6.扩容时时需要需要把旧节点的数据迁移一部分到新节点
优点:
无中心架构,支持动态扩容,对业务透明
具备Sentinel的监控和自动Failover(故障转移)能力
客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
高性能,客户端直连redis服务,免去了proxy代理的损耗
缺点:
运维也很复杂,数据迁移需要人工干预
只能使用0号数据库
不支持批量操作(pipeline管道操作)
分布式逻辑和存储模块耦合等

1.缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

2.缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

布隆过滤器:它实际上是一个很长的二进制向量和一系列随机映射函数
核心知识点:
用法: 由二进制向量,hash函数组合.
作用: 判断一个元素是否存在于集合中.
优点: 占用空间更小/效率更高
缺点: 有一定的误判率(hash碰撞), 删除困难.

3.缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案
设置热点数据永远不过期。
加互斥锁,互斥锁

-------------------------------Dubbo---------------------------
Dubbo是一个远程服务调用的分布式框架
其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo能做什么?
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。

  1. 服务提供者在启动时,向注册中心注册自己提供的服务。
  2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

-------------------------------ZooKeeper---------------------------
ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

Zookeeper是什么?
Zookeeper是一个针对分布式应用的分布式协调程序。Zookeeper是一个集群的管理者,将简单易用的接口提供给用户;可以理解为所有注册 到服务中心的服务们的管理者;
Zookeeper能做什么?
我在项目中使用到Zookeeper的地方一般是作为dubbo等RPC框架的注册中心,但是Zookeeper的功能远不止这么点,按照大神们的总结来 看,Zookeeper一般有以下用途:
命名服务
配置管理
集群管理
分布式锁
队列管理

-------------------------------RabbitMQ---------------------------
RabbitMQ是什么?
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

PS:也可能直接问什么是消息队列?消息队列就是一个使用队列来通信的组件

RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的消息中间件,它最初起源于金融系统,用于在分布式系统中存储转发消息。

RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。

1.Producer(生产者) :生产消息的一方(邮件投递者)
Consumer(消费者) :消费消息的一方(邮件收件人)
2.Exchange(交换器) 用来接收生产者发送的消息并将这些消息路由给服务器中的队列中
3.Queue(消息队列) 用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面, 等待消费者连接到这个队列将其取走。

-------------------------------Nginx---------------------------

Nginx+tomcat集群实现反向代理和负载均衡策略

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器
1.内存少 不超过2M tomcat服务器大约占用600M
2.并发能力强 3-5万次/秒 tomcat服务器大约 150-220之间
启动命令 start nginx
在nginx.conf中设置监听端口、域名、默认跳转页面
设置轮询、权重、IPHASH策略等
然后修改host文件

-------------------------------Vue---------------------------
Vue 的生命周期总共分为8个阶段:创建前/后,载入前/后,更新前/后,销毁前/后。
1、beforeCreate(创建前)
表示实例完全被创建出来之前,vue 实例的挂载元素 $ el和数据对象 data 都为 undefined,还未初始化。
2、created(创建后)
数据对象 data 已存在,可以调用 methods 中的方法,操作 data 中的数据,但 dom 未生成,$el 未存在 。
3、beforeMount(挂载前)
vue 实例的 $el 和 data 都已初始化,挂载之前为虚拟的 dom节点,模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中。data.message 未替换。
4、mounted(挂载后)
vue 实例挂载完成,data.message 成功渲染。内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了。实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,DOM 渲染在 mounted 中就已经完成了。
5、beforeUpdate(更新前)
当 data 变化时,会触发beforeUpdate方法 。data 数据尚未和最新的数据保持同步。
6、updated(更新后)
当 data 变化时,会触发 updated 方法。页面和 data 数据已经保持同步了。
7、beforeDestory(销毁前)
组件销毁之前调用 ,在这一步,实例仍然完全可用。
8、destoryed(销毁后)
组件销毁之后调用,对 data 的改变不会再触发周期函数,vue 实例已解除事件监听和 dom绑定,但 dom 结构依然存在。

SpringMVC执行流程
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值