1、RPC和HTTP区别 ?
RPC:远程过程调用;
HTTP:超文本传输协议;
(1)、作用主要场景
RPC:通常在于分布式系统之间不同服务器之间的通信;
HTTP:通常在于web应用程序的客户端和服务器之间的通信;
(2)、传输数据格式
RPC:通常使用二进制序列化的数据格式,如 Protocol Buffers;
HTTP:使用文本格式的数据交换,通常使用 JSON 或 XML 格式;
(3)、通信方式
RPC: RPC 的通信模型更接近函数调用,调用方发起请求,等待接收方的响应;
HTTP : HTTP 的通信模型是基于请求和响应的,客户端发送请求到服务器,服务器响应请求;
(4)、调用方式
HTTP 接口通过 URL 进行调用;
RPC 接口通过函数调用进行调用;
可拓展:(dubbo与springcloud的区别)
2、maven的强制更新命令,maven的package和install的区别?
强制更新命令:mvn clean package -u ;
mvn package 生成项目jar/war;
mvn install 安装构建产物至本地 Maven 仓库;
3、redis如何完成大批量的快速写入?
1、使用管道(Pipeline):使用 Redis 管道可以将多个写入命令打包在一起发送给 Redis 服务器,减少网络往返的延迟;
public static void withPipeline(Jedis jedis, List<?> list, String key, String expire) {
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < list.size(); i++) {
pipeline.set(key + String.valueOf(i), String.valueOf(list.get(i)), expire);
}
pipeline.sync();
}
2、Redis 事务允许将多个写入操作打包在一起,以原子方式一次性执行;仅适用于
public static void withMulti(Jedis jedis, List<?> list, String key, String expire) {
Transaction transaction = jedis.multi();
try {
for (int i = 0; i < list.size(); i++) {
transaction.set(key + String.valueOf(i), String.valueOf(list.get(i)), expire);
}
transaction.exec();
}catch (Exception e){
transaction.discard();
}finally {
jedis.close();
}
}
3、通过hset与hmset也可以批量处理;
Map stuMap = new HashMap();
stuMap.put("name", "张三");
stuMap.put("age", "25");
jedis.hmset("students", stuMap);
Map<String, String> map = jedis.hgetAll("students");
4、什么是jmm内存模型,结合项目过程遇到的问题及解决?
jmm是用于多线程之间访问共享内存的行为;它定义线程线程如何与内存交互;保证多线程之间对共享变量的可见性,有序性,原子性;
- 原子性:JMM保证读取和写入变量的原始(non-long、non-double)数据操作是原子性的。
- 可见性:JMM通过禁止一些重排序优化(volatile变量、synchronized、Lock等)来保证共享变量对于所有线程的可见性。
- 有序性:JMM保证在不重排序的情况下,通过程序的顺序和控制依赖关系来决定操作的执行顺序。
5、redis数据结构及在项目中的作用?
Redis数据结构 :String ,Set,ZSet,List,Hash;
(1) 为加快查询速 率,缓存机时相关数据;
查询数据库后的数据进行处理,以list,map形式存于redis;
(2) 分布式锁 ;
(3)幂等性Id ;
(4)Sesions 储存;
6、spring事务传播机制及事务失效的场景?
一 、传播特性
TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
二、隔离级别
TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
三、事务超时
所谓事务超时,就是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。在 TransactionDefinition 中以 int 的值来表示超时时间,其单位是秒。
默认设置为底层事务系统的超时值,如果底层数据库事务系统没有设置超时值,那么就是none,没有超时限制。
四 、事务失效
可参考spring 事务失效的 12 种场景_duplicatekeyexception事物会生效吗_hanjq_code的博客-CSDN博客
7、项目难点:
8、mysql中on条件和where条件的区别以及原理?
- FROM 子句:指定要查询的表,包括要连接的表。
- JOIN 子句:根据指定的连接条件(使用 ON 或 USING)将两个或多个表进行连接。
- WHERE 子句:对连接后的结果集进行条件筛选。
- SELECT 子句:选择要返回的列,可以进行聚合、排序等操作。
MySQL各个过滤条件的执行顺序:
第一步:from
第二步:join on (无则略过,内联,左联,右联)
第三步:where(大多数情况都有)
第四步:group by (用来分组)
第五步:select (虽然他是第一个写的 但是他的执行顺序却在特别靠后)
第六步:having(分组以后就不能用where,别问我为什么.where都执行完了还怎么执行!!!所以出现了一个代替where的方法 而且里面可以写函数)
第七步:order by (用来排序,可以同时使用多个字段)
第八步:limit (取出条数 后面跟一个数字 是取前多少条 跟两个数字就是从第多少条开始,取多少条)
-
间隙锁(Gap Lock):
- 间隙锁是在数据库表的索引范围内的间隙(行之间的空隙)上设置的锁。
- 当事务需要读取一段范围内的数据时,MySQL会在该范围内的间隙上设置间隙锁,防止其他事务在这个范围内插入数据。
- 间隙锁的作用是保护事务的一致性,防止幻读(Phantom Read)的发生,即防止其他事务在读取范围内插入新的数据,导致查询结果的不一致。
-
多版本并发控制(MVCC):
- MVCC是一种并发控制机制,用于解决读取一致性和写入冲突的问题。
- 当一个事务开始时,MySQL会为其创建一个事务版本号,并在数据库的每一条记录上保存多个版本,每个版本都有一个时间戳。
- MVCC能够实现读已提交的一致性,即事务只能看到在它开始之前已经提交的数据。
- 在MVCC中,读取的数据版本是根据事务的时间戳来确定的,读取过程中不会被其他事务的写入操作所影响。
- 当修改数据时,MySQL会创建新的记录版本,并更新事务的时间戳,其他事务仍然可以读取到旧的版本,保证了并发读取的一致性。
- MVCC通过使用快照、回滚段等机制实现了高并发下的读写隔离,提高了数据库的并发性能。
9、描述kafka实现任务分发,能顺畅的表达出方案的实现、遇到的问题及如何解决