Java-有关经常被问到的“XX与XX的区别”相关知识回答

分布式和微服务的区别

分布式的意思是多个模块共同完成一件事情(也可以是一个模块分多个部署),每个节点可以单独完成任务;(分开不同机器部署)

微服务的意思也是多个模块共同完成一件事情,(不管应用部署在哪里)

总结:

微服务和分布式都是拆分单体应用的产物,可以理解为,微服务只是对服务拆分的形容词,分布式是对服务部署方面的考量,微服务是可以包含分布式的,但是分布式不一定是微服务;

线程池与多线程的区别:

线程池是在程序运行开始,创建好的n个线程,并且这n个线程挂起等待任务的到来。

多线程:是在任务到来得时候进行创建,然后执行任务。

线程池:其中的线程执行完之后不会回收线程,会继续将线程放在等待队列中;

多线程:程序在每次任务完成之后会回收该线程。

由于线程池中线程是创建好的,所以在效率上相对于多线程会高很多。

线程池也在高并发的情况下有着较好的性能;不容易挂掉。多线程在创建线程数较多的情况下,很容易挂掉。

在mybatis中#和 $ 的主要区别是:

#传入的参数在SQL中显示为字符串,#方式能够很大程度防止sql注入, $ 传入的参数在SqL中直接显示为传入的值,$方式无法防止Sql注入。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${};两者都是动态的向sql语句中传入需要的参数。

mybatis中#和$的区别是什么

1、传入的参数在SQL中显示不同

#传入的参数在SQL中显示为字符串(当成一个字符串),会对自动传入的数据加一个双引号。

例:使用以下SQL

select id,name,age from student where id =#{id}

当我们传递的参数id为 “1” 时,上述 sql 的解析为:

select id,name,age from student where id ="1"

$传入的参数在SqL中直接显示为传入的值

例:使用以下SQL

select id,name,age from student where id =${id}

当我们传递的参数id为 “1” 时,上述 sql 的解析为:

select id,name,age from student where id =1

2、#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。

3、$方式一般用于传入数据库对象,例如传入表名。

4、大多数情况下还是经常使用#,一般能用#的就别用 $ ;但有些情况下必须使用 $ ,例:MyBatis排序时使用order by 动态参数时需要注意,用 $ 而不是#。

mysql、nosql

1、为什么有Nosql?

增加字段需要-->无格式

高并发需要-->转向内存

横向拓展需要-->以前是分库分表

关键:传统数据库需要“关系”,所有表存在同一台服务器中,是一个单机系统。

而Nosql不使用关系,每条数据独立存储 

Nosql不需要:数据库一致性要求、读写的实时性、复杂sql查询

NoSQL 数据库的类型:

  • 面向文档
  • 键值
  • 图表
  • 列导向

2、什么是NoSQL数据库?在哪些情况下使用和不使用NoSQL数据库?

NoSQL是非关系型数据库,NoSQL = Not Only SQL。

关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。两者是不同的数据存储结构。

在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。

在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。  

3、非关系型数据库有哪些?MySQL和MongoDB之间最基本的区别是什么?

非关系型数据库有:MongoDB(用得较多)、Membase、Hypertable

关系型数据库与非关系型数据库的区别:数据存储结构的不同。

4、redis与mongodb

完全不同的东西。

mongodb:最像关系型数据库的nosql。相比redis,只是缓存了热点数据在内存

redis:in-memory;丰富的数据结构;一般作为缓存,提高了并发性;

5、Nosql的shard(一致性哈希) 

复制,横向拓展,只支持更多的读请求;

分片,支持更多的读、写请求;

如果把日期设为分片,则不能享受并发性的写请求;

MongoDB和Redis的区别 

MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,支持多种类型的数据结构,可用作数据库,高速缓存和消息队列代理。

MongoDB和Redis的区别是什么:

1、内存管理机制

Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。

MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

2、支持的数据结构

Redis 支持的数据结构丰富,包括hash、set、list等。

MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

3、数据量和性能:

当物理内存够用的时候,redis>mongodb>mysql

当物理内存不够用的时候,redis和mongodb都会使用虚拟内存。

实际上如果redis要开始虚拟内存,那很明显要么加内存条,要么你换个数据库了。

但是,mongodb不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap的交换较少。

mongodb还是能够保证性能。

4、性能

mongodb依赖内存,TPS较高;Redis依赖内存,TPS非常高。性能上Redis优于MongoDB。

5、可靠性

mongodb从1.8版本后,采用binlog方式(MySQL同样采用该方式)支持持久化,增加可靠性;

Redis依赖快照进行持久化;AOF增强可靠性;增强可靠性的同时,影响访问性能。

可靠性上MongoDB优于Redis。

6、数据分析

mongodb内置数据分析功能(mapreduce);而Redis不支持。

7、事务支持情况

Redis 事务支持比较弱,只能保证事务中的每个操作连续执行;mongodb不支持事务。

8、集群

MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。

Nginx 与网关之间存在那些区别

首先会发现网关和 nginx 是非常相似的,微服务网关能够做的事情,nginx 也可以实现,但两者之间仍然存在一些区别。

相同点:都是可以实现 API 的拦截,也可以实现负载均衡,反向代理,请求过滤,可以完全和网关实现一样的效果,这是显而易见的。

早期工作中没有用网关进行处理,因为当时没有网关,当时是基于项目名称转到真正的地址,但是后来发现这样做的唯物性很差,因为有时需要通过做一些复杂的工作, Nginx 就要结合复杂的语言。

所以他们之间的不同点有:

Nginx 采用 c 语言编写,作为 Java 程序员很少有人能懂得 C 语言的编写,因为他们的入门语言就是 Java 语言。

在微服务领域中,都是自己语言编写的,微服务领域是一种架构思想,任何语言都有微服务领域,在微服务领域中在每个编程语言中都存在,比如使用 Java 构建微服务项目,既然使用Java来构建微服务项目,那么能够知道的是 Gateway 也就是 Java 语言编写的。

毕竟 gateway 是用 Java 语言写的,所以在想做扩展功能时,就能够自己上手,困难性不高,如果用 Nginx 来做的话就需要结合语言来进行扩展,这样的话就需要学习 C 语言和 lua 语言,困难性更高。所以专业的人要去做专业的事情。

Nginx 也能做服务类的项目,比如服务熔断,还可以做黑名单白名单项目,有些公司中 nginx 可以解决黑名单和白名单。毕竟 gateway 属于 Java 语言编写的,能够更好的对微服务实现扩展功能,大公司里面会有对入门语言有要求,Java 就不是很专业。相比 nginx 如何实现扩展功能的话,必须要学习 lua 或者 c 语言,那么整个学习成本会非常高。

Nginx与网关的区别【第二种回答】

网关服务的端口号默认是80或者443.

相同点:都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。

不同点:

a、底层实现

Nginx采用C语言编写的

微服务都是自己语言编写的 比如Gateway就是java写的。

毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。

b、负载均衡

Nginx实现负载均衡的原理属于服务器端负载均衡器。

Gateway实现负载均衡原理采用本地负载均衡器的形式。

过滤器与拦截器区别

实际开发中,拦截器的应用场景会比过滤器要更多,下面是拦截器和过滤器的主要应用场景

拦截器的应用场景【拦截器是SpringMVC的技术】:权限控制,日志打印,参数校验

过滤器的应用场景【过滤器的Servlet的技术】:跨域问题解决,编码转换

1、过滤器是基于函数回调的,而拦截器是基于java反射的

2、过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器,拦截器依赖SpringMVC

3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对SpringMVC请求起作用

4、拦截器可以访问处理方法的上下文,而过滤器不可以

5、触发时机不同,过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。

拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

6、控制执行顺序不同

实际开发过程中,会出现多个过滤器或拦截器同时存在的情况,不过,有时我们希望某个过滤器或拦截器能优先执行,就涉及到它们的执行顺序。

过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。

@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class MyFilter2 implements Filter {

拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**").order(1);
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(3);
    }

拦截器应用场景

拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:

  • 登录验证,判断用户是否登录。
  • 权限验证,判断用户是否有权限访问资源,如校验token
  • 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  • 处理cookie、本地化、国际化、主题等。
  • 性能监控,监控请求处理时长等。
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

过滤器应用场景

1)过滤敏感词汇(防止sql注入)

2)设置字符编码

3)URL级别的权限访问控制

4)压缩响应信息

过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

拦截器在用户权限校验场景下使用会比较多,由于一般是前后端分离项目,过滤器的使用场景就会少很多。

过滤器就是筛选出你要的东西,比如requeset中你要的那部分

拦截器在做安全方面用的比较多,比如终止一些流程

过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象

过滤器

过滤器(Filter)是处于客户端与服务器目标资源之间的⼀道过滤技术。

● 生活中的过滤器:净⽔器,空气净化器

● web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成⼀些特殊的功能。

过滤器作用

● 执行是在Servlet之前,客户端发送请求时,会先经过Filter,再到达目标Servlet中;响应时, 会根据执行流程再次反向执行Filter

● ⼀般用于完成通用的操作。如:登录验证、统⼀编码处理、敏感字符过滤

常见的过滤器用途主要包括:对用户请求进行统一认证、对用户的访问请求进行记录和审核、对用户发送的数据进行过滤或替换、转换图象格式、对响应内容进行压缩以减少传输量、对请求或响应进行加解密处理、触发资源访问事件等**。

拦截器

拦截器作用

拦截器采用AOP的设计思想, 它跟过滤器类似, 用来拦截处理方法在之前和之后执行一些 跟主业务没有关系的一些公共功能:

比如:可以实现:权限控制、日志、异常记录、记录方法执行时间.....

总结

过滤器就是筛选出你要的东西,比如requeset中你要的那部分 拦截器在做安全方面用的比较多,比如终止一些流程

当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。

过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。

切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象

监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值