2021-2-28 Mark-Java Interview Simple

2021-2-28 Mark-Java Interview Simple

 

        心动时,还没来得及学会勇敢。

          勇敢时,我们已在时光里走散。

 

简介:2021-2-28日Java面试没能脱口而出或是回答得不好的些许问题。

1、Redis数据类型有哪些?使用Redis何种数据类型处理告警?

String、Hash、List、Set、zset 五种。

String(字符串)

String是最基本的类型,一个key对应一个value;String类型是二进制安全的,即redis的string可以包含任何数据,比如jpg图片or序列化对象;String类型的值最大存储量为512M。

Hash(哈希)

Hash是一个string类型的field和value映射表,hash适合于存储对象;存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序;list类型经常会被用于消息队列的服务,以完成多程序之间的消息交换。

Set(集合)

Redis的Set是string类型的无序集合;集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),适用于如利用交集求共同好友。

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员;sorted set是插入有序的,即自动排序;当你需要一个有序的并且不重复的集合列表时,那么可以选择sorted set数据结构;例如存储全班同学的成绩,其集合value可以是同学的学号,而score就可以是成绩;或排行榜应用。

2、事务传播类型有哪些?

1、Required(默认):支持使用当前事务,如果当前事务不存在,创建一个新事物;

2、Supports:支持使用当前事务,如果当前事务不存在,则不使用事务;

3、Mandatory:中文翻译为强制,支持使用当前事务,如果当前事务不存在,则抛出Exception;

4、Required_New:创建一个新事务,如果当前事务存在,把当前事务挂起;(@Transactional(propagation = Propagation.REQUIRES_NEW))

5、Not_Supported:无事务执行,如果当前事务存在,把当前事务挂起;

6、Never:无事务执行,如果当前有事务则抛出Exception;

7、Nested:嵌套事务,如果当前事务存在,则在嵌套的事务中执行;若当前事务不存在,则表现跟Required一样。

3、ELK日志中间件?

ELK日志系统分别是Elasticsearch、Logstash、Kibana三个开源框架的缩写。

Elasticsearch:开源分布式搜索引擎,提供存储、分析、搜索功能;用于接收搜集的海量结构化日志数据,并提供给kibana查询分析。

Logstash:开源日志搜集、分析、过滤框架;用于收集日志,对日志进行过滤形成结构化数据,并转发到elasticsearch中。

Kibana:开源日志报表系统,对elasticsearch以及logstash有良好的web页面支持;用于对elasticsearch提供的数据进行分析展示。

4、MySQL分区?

什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,由db自动去组织分区的数据。

在下面的场景中,分区可以起到非常大的作用:

A:表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他都是历史数据

B:分区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作

C:分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备

D:可以使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等

E:如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好

F:优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和count()这类聚合函数的查询时,可以在每个分区上面并行处理,最终只需要汇总所有分区得到的结果。

水平分区&垂直分区两种

分区几种方式实践:RangerListHashKey

Range:
create table range(
  id int(11),
  money int(11) unsigned not null,
  date datetime
  )partition by range(year(date))(
  partition p2007 values less than (2008),
  partition p2008 values less than (2009),
  partition p2009 values less than (2010)
  partition p2010 values less than maxvalue
);
List:

create table list(
  a int(11),
  b int(11)
  )(partition by list (b)
  partition p0 values in (1,3,5,7,9),
  partition p1 values in (2,4,6,8,0)
 );
Hash:

create table hash(
  a int(11),
  b datetime
  )partition by hash (YEAR(b)
  partitions 4;
Keycreate table t_key(
  a int(11),
  b datetime)
  partition by key (b)
  partitions 4;
View Code~拍一拍

5、如何解决跨域问题?

什么是跨域:

跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。

解决跨域的方法:

1、response添加header

在Servlet请求返回时添加如下代码:

// *表示支持所有网站访问,也可以额外配置响应网站
resp.setHeader("Access-Control-Allow-Origin", "*");

2、使用JSON方式,出于同源策略考虑

3、HttpClient请求转发

4、nginx转发

即利用nginx反向代理,将请求分发到部署相应项目的tomcat服务器,当然就不存在跨域问题了。

 

 

                    心动时,还没来得及学会勇敢。

                勇敢时,我们已在时光里走散。

 

posted @ 2021-03-17 22:30  涛姐涛哥  阅读(105)  评论(0编辑  收藏  举报