十一
1、Redis是什么,怎么持久化
Redis是一个高性能的内存数据库,以key-value方式存储数据,可以作为缓存使用。
Redis支持RDB和AOF两种持久化机制。持久化功能有效地避免因进程退出造成的数据丢失问题,下次重启时利用之前持久化的文件即可实现数据恢复。
RDB:RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
触发机制
手动触发分别对应save和bgsave命令
save命令:阻塞当前Redis服务器,知道RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上不建议使用。
DB saved on disk
bgseve命令:Redis进程执行fork操作创建子进程,RDB持久化过程有子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。
* Background saving started by pid 3151
* DB saved on disk
* RDB: 0 MB of memory used by copy-on-write
* Background saving terminated with success
自动触发
以下场景下会触发
1)使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改时,自动触发bgsave。
2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点,更多细节见6.3节介绍的复制原理。
3)执行debug reload命令重新加载Redis时,也会自动触发save操作。
4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave。
2、为什么使用elasticsearch
Elasticsearch具备以下特点:
分布式,无需人工搭建集群
Restful风格,一切API都遵循Rest原则,容易上手
近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
正排索引
通过key找到value,如通过id找到文章
查询内容时,需要逐条遍历,速度比较慢
倒排索引
通过value找到key
对内容进行分词,生成倒排索引
3、rabbitMQ的工作模式
工作队列,生产者将消息分发给多个消费者,如果生产者生产了100条消息,消费者1消费50条,消费者2消费50条,队列发送消息采用的是轮询方式,也就是先发给消费者1,再发给消费者2,依次往复。
因为队列默认采用是自动确认机制,消息发过去后就自动确认,队列不清楚每个消息具体什么时间处理完,所以平均分配消息数量。
实现能者多劳:
channel.basicQos(1);限制队列一次发一个消息给消费者,等消费者有了反馈,再发下一条
channel.basicAck 消费完消息后手动反馈,处理快的消费者就能处理更多消息
basicConsume 中的参数改为false
4、mysql的连接方式左连接和右连接是什么概念
left join
显示所有左表的数据,加上右表相关的数据,不相关的补空值
right join
显示所有右表的数据,加上左表相关的数据,不相关的补空值
5、代码连接mysql的工具是什么,mybatis的sql语句放在哪
JDBC,mybatis的sql语句可以写在mapper文件中,也可以通过注解写在dao层的方法上
6、单点登录怎么实现
登录成功后,将用户信息用JWT+RSA算法进行加密,保存到请求头中
在网关中添加全局过滤器,对请求进行拦截,获得请求头中的token,进行解码,成功就放行
7、gateway服务怎么跳转到别的服务的,普通用户登录后怎么访问的页面
-
客户端发送请求给Gateway网关,网关将请求发送给处理器映射(HandlerMapping)
-
网关通过路由的匹配,将请求发送给Web处理器处理,请求就需要经过一系列过滤器
-
过滤器分为“pre"前置和”post"后置两种,前置过滤器实现鉴权作用,后置过滤实现性能统计或日志收集
-
通过过滤器到达需要的服务
8、webSocket怎么实现传到前台的,还有什么其他方式吗
- websocket允许通过Javascript建立远程服务器的连接,从而实现客户端与服务器间的双向通信,在websocket中有两个方法
1.send()向远程服务器发送数据
2.close()关闭websocket连接
websocket同时还定义了几个监听函数
1、onopen 当网络连接建立时触发该事件
2、onerror 当网络发生错误时触发该事件
3、onclose 当websocket被关闭时触发该事件
4、onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。msg.data
websocket还定义了一个readyState属性,这个属性可以返回websocket所处的状态:
1、CONNECTING(0) websocket正尝试与服务器建立连接
2、OPEN(1) websocket与服务器已经建立连接
3、CLOSING(2) websocket正在关闭与服务器的连接
4、CLOSED(3) websocket已经关闭了与服务器的连接
websocket的url开头是ws,如果需要ssl加密可以使用wss,当我们调用websocket的构造方法构建一个websocket对象(new WebSocket(url))的之后,就可以进行即时通信了。
10、seata用到了吗,怎么实现的
Seata的分布式事务解决方案是业务层面的解决方案,只依赖于单台数据库的事务能力。Seata框架中一个分布式事务包含3中角色:
Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager (TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
其中,TM是一个分布式事务的发起者和终结者,TC负责维护分布式事务的运行状态,而RM则负责本地事务的运行。
首先TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
XID 在微服务调用链路的上下文中传播。
RM 开始执行这个分支事务,RM首先解析这条SQL语句,生成对应的UNDO_LOG记录。下面是一条UNDO_LOG中的记录
RM在同一个本地事务中执行业务SQL和UNDO_LOG数据的插入。在提交这个本地事务前,RM会向TC申请关于这条记录的全局锁。如果申请不到,则说明有其他事务也在对这条记录进行操作,因此它会在一段时间内重试,重试失败则回滚本地事务,并向TC汇报本地事务执行失败
RM在事务提交前,申请到了相关记录的全局锁,因此直接提交本地事务,并向TC汇报本地事务执行成功。此时全局锁并没有释放,全局锁的释放取决于二阶段是提交命令还是回滚命令。
TC根据所有的分支事务执行结果,向RM下发提交或回滚命令。
RM如果收到TC的提交命令,首先立即释放相关记录的全局锁,然后把提交请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC。异步队列中的提交请求真正执行时,只是删除相应 UNDO LOG 记录而已。
在at模式中需要在客户端的数据库中建如下的表,用来保存回滚的数据
seata的数据源代理通过对业务sql的解析,在业务sql执行前后生成前置镜像和后置镜像保存在undo_log中,业务sql的执行和undo_log的插入在一个本地事务中,这样就可以保证任何对业务数据的更新都有相