(金财互联)
1、多线程状态的几种异常
2、mq怎么保证顺序消费
3、大事务小事务
4、什么场景用到lambda
5、Mysql的索引类型
(海康威视)
6、cookie和session的区别以及session的实现原理
7、mubatis中$和#的区别
8、@RequestMapping的几个参数
(自如)
9、springCloud和RPC的远程调用上的区别?
10、Bean的生命周期?
11、谈一谈分布式锁?
(云智慧)
12、JVM了解怎么样,说一下内存区划;
13、JVM调优怎么样,常用的启动参数有哪些;
14、如果一个JVM启动后,发现CPU暴涨怎么办?
15、一个服务器将文件推送到另一台服务器
16、Myisam和InnoDB
(本来鲜科技)
17、多线程获取处理结果
18、并发的情况下,怎么防止库存不超
19、@transtrancal注解生效范围
1、多线程状态的几种异常
在多线程环境下出现了数据异常,我们称之为多线程下数据安全问题,比如说是电影院卖票。
1.出现了重复票:是由于piao-- 不是原子性的操作所导致的 ;
2.出现了0票和负数票:这个是由于线程的随机性导致的。
2、mq怎么保证顺序消费
通常mq可以保证先到队列的消息按照顺序分发给消费者消费来保证顺序,但是一个队列有多个消费者消费的时候,那将失去这个保证,因为这些消息被多个线程并发的消费。因为consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。但是有的时候消息按照顺序处理是很重要的,下面将从activemq来看是如何保证消息的顺序问题。
1、利用Activemq的高级特性:consumer之独有消费者(exclusive consumer)
在ActiveMQ4.x中可以采用Exclusive Consumer,broker会从queue中,一次发送消息给一个消费者,这样就避免了多个消费者并发消费的问题,从而保证顺序,配置如下:
queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
consumer = session.createConsumer(queue);
当在接收信息的时候有一个或者多个备份接收消息者和一个独占消息者的同时接收时候,无论两者创建先后,在接收的时候,均为独占消息者接收。当在接收信息的时候,有多个独占消费者的时候,只有一个独占消费者可以接收到消息。
当有多个备份消息者和多个独占消费者的时候,当所有的独占消费者均close的时候,只有一个备份消费者接到到消息。当主消费者挂了话,会立刻启用故障切换转移到下一台消费者继续消费

独占消息就是在有多个消费者同时消费一个queue时,可以保证只有一个消费者可以消费消息,这样虽然保证了消息的顺序问题,不过也带来了一个问题,就是这个queue的所有消息将只会在这一个主消费者上消费,其他消费者将闲置,达不到负载均衡分配,而实际业务我们可能更多的是这样的场景,比如一个订单会发出一组顺序消息,我们只要求这一组消息是顺序消费的,而订单与订单之间又是可以并行消费的,不需要顺序,因为顺序也没有任何意义,有没有办法做到呢?答案是可以的,下面就来看看activemq的另一个高级特性之messageGroup。
2、利用Activemq的高级特性:messageGroups
Message Groups特性是一种负载均衡的机制。在一个消息被分发到consumer之前,broker首先检查消息JMSXGroupID属性。如果存在,那么broker会检查是否有某个consumer拥有这个message group。如果没有,那么broker会选择一个consumer,并将它关联到这个message group。此后,这个consumer会接收这个message group的所有消息,直到:Consumer被关闭、Message group被关闭,通过发送一个消息,并设置这个消息的JMSXGroupSeq为-1

配置如下:
bytesMessage.setStringProperty("JMSXGroupID", "constact-20100000002");
bytesMessage.setIntProperty("JMSXGroupSeq", -1);
如上图所示,同一个queue中,拥有相同JMSXGroupID的消息将发往同一个消费者,解决顺序问题,不同分组的消息又能被其他消费者并行消费,解决负载均衡的问题,两全其美啦!
3、大事务小事务
其实大事务是指运行时间比较长,操作的数据比较多的事务。这类型的事务容易给数据库带来负担:锁定了过多的数据,造成不必要的拥塞堵塞。在事务执行的过程中需要堵塞,容易引起主从数据同步不一致的情况发生。当我们执行事务的操作过大,例如说delete某张表里买呢一亿条数据的时候,如果加入了事务保护,那么假设期间出现了异常,整段事务的回滚将会非常消耗机器的性能和耗时。通常可以让研发将大事务分解为多个小事务进行优化处理。在mysql的二进制日志里面,当多个会话同时访问server执行事务性sql语句的请求时候,binlog会给每个会话单独开启一个线程进行事务性sql的缓存处理。直至当相应的sql执行完毕之后再写入到binlog日志中。这样做的好处在于能够将不同的事务进行分隔出来处理。并且保证每个写入binlog的事务sql都是完整且正常执行的一个单位。而且如果事务在执行的过程中发生了回滚的话,可以直接在内存中间数据删除,不需要再在日志里面进行记录删除操作。
4、什么场景用到lambda
典型的就是Runnable里面的run方法
5、Mysql的索引类型
Mysql目前主要有以下几种索引类型:FULLTEXT
,HASH
,BTREE
,RTREE
- FULLTEXT
即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE "%word%"这类针对文本的模糊查询效率较低的问题。
- HASH
由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
- BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
- RTREE
RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找。
==========================================
6、cookie和session的区别以及session的实现原理
一、共同之处:
cookie和session都是用来跟踪浏览器用户身份的会话方式。
二、工作原理:
1.Cookie:
(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户
2.Session:
(1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
(2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
(3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookiename为JSESSIONID。Cookie存在,根据value中的SessionId去寻找session对象。如果value为SessionId不存在(Session对象默认存活30分钟),返回1中重新去创建Session与特殊的Cookie,value为SessionId存在,返回session对象

三、区别:
cookie数据保存在客户端,session数据保存在服务端。
session:
简单的说,当你登陆一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登陆或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造。
cookie:
sessionid是服务器和客户端连接时候随机分配的,如果浏览器使用的是cookie,那么所有数据都保存在浏览器端,比如你登陆以后,服务器设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为cookie变量,所以只要不关闭浏览器,那么cookie变量一直是有效的,所以能够保证长时间不掉线。
如果你能够截获某个用户的cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以使用cookie被攻击的可能性比较大。如果cookie设置了有效值,那么cookie会保存到客户端的硬盘上,下次在访问网站的时候,浏览器先检查有没有cookie,如果有的话,读取cookie,然后发送给服务器。所以在机器上面保存了某个论坛cookie,有效期是一年,如果有人入侵你的机器,将你的cookie拷走,放在他机器下面,那么他登陆该网站的时候就是用你的身份登陆的。当然,伪造的时候需要注意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了cookie文件的建立时间,以及是否有修改,所以必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器
两个都可以用来存私密的东西,session过期与否,取决于服务器的设定。cookie过期与否,可以在cookie生成的时候设置进去。
四、区别对比:
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,如果主要考虑到安全应当使用session。
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用cookie
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的cookie不能超过3K。
(5)将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
7、mybatis中$和#的区别
Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}
我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,举例如: 表单有两个用户需要填写的表单数据,用户名和密码,如果用户输入admin(用户名),111(密码),若数据库中存在此用户则登录成功。SQL大概是这样:
SELECT * FROM XXX WHERE userName = admin and password = 111
但若是遭到了SQL注入,输入的数据变为 admin or 1 =1 # 密码随便输入,这时候就直接登录了,SQL大概是这样
SELECT * FROM XXX WHERE userName = admin or 1 = 1 # and password = 111
因为
#
在sql语句中是注释,将后面密码的验证去掉了,而前面的条件中1 = 1始终成立,所以不管密码正确与否,都能登录成功。#{}
在mybatis中的底层是运用了PreparedStatement预编译
,传入的参数会以 ? 形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成,而${}
则没有使用预编译,传入的参数直接和sql进行拼接,由此会产生sql注入的漏洞。$
方式一般用于传入数据库对象,例如传入表名。一般能用#
的就别用$
。
8、@RequestMapping的几个参数
1、value:表示请求URL
2、method:表示请求方法
3、params:表示请求参数
4、headers:表示请求头
例:
@RequestMapping(value="/testRequestMapping", method=RequestMethod.GET,
params={"username=zhangsan","age"}, headers="Accept-Language=zh-CN,zh;q=0.8")
==========================================
9、springCloud和RPC的远程调用上的区别?
https://www.jianshu.com/p/ff3f30a523d5
10、Bean的生命周期?
https://www.jianshu.com/p/1adeadf8d619
11、谈一谈分布式锁?
==========================================
==========================================
12、JVM了解怎么样,说一下内存区划
13、JVM调优怎么样,常用的启动参数有哪些
14、如果一个JVM启动后,发现CPU暴涨怎么办?
15、一个服务器将文件推送到另一台服务器
16、Myisam和InnoDB
==========================================
网友评论