春招0 offer的渣渣,是如何在秋招找到自己满意的工作!!
CVTE 1面
1. 项目介绍。
户中心分为当事人模块和用户会话模块,我主要负责用户会话模块,主要任务是控制用户的权限,用户的登录,用户登录后生成token,将token存放redis缓存。token保存着用户的基本信息,是系统交互的凭证相当于session。
同时负责结算模块的开发,结算中心主要分为收益分成,冲红,解冻,提现,账期,对账。
账号表;提现方式表(各自银行),账号提现信息(银行卡号),提现申请表,提现记录表,账户变动记录表,红包记录表,税收记录表
收益分成:接收交易中心发的topic,将商品的收益按设定的比例分给出版社,编辑,作者,平台。各用户的账号金额由可提现金额,冻结金额组成。分成的金额变成了冻结金额,过了保障期和账期才可以提现。如果是虚拟商品,只需要过账期就可以解冻。
每条记录有一个记录表,宽表。
冲红:用户申请退货,接收交易中心的topic,对某一笔订单进行退货冲红操作。将分成的冻结金额扣除掉。增加一条账号记录信息。
提现:可提现金额不为0,用户可申请提现。作者,编辑申请提现需要出版社同意,出版申请提现需要平台同意。提现的同时代收30%的个人所得税。
转账:同意提现,从微信的账号进行转账,微信商户号转账到用户个人微信账户。
账期:平台设置各出版社的账期,分成过了账期以后进行解冻。
对账:每天晚上定时的去扫描数据库,通过用户申请提现时的单号去微信去对比数据,查看是否有转错单号的情况。
税收:代收用户的手续费,月底进行统一批扣。
专题应用:各种资源可以挂到统一专题下,类似与今日头条的每一栏的选项卡,是否推荐,上下架。
投票应用:投票设置,投票选项,用户投票。
单词表,用户背诵记录,用户背诵详情表,词单记录,单词表,词库分类,词单单词管,单词选项
背单词应用:用户背单词。词单,用户出试题名称图片等。单词库,用户设置的单词分类。单词,选项。用户通过做词单来进行背单词。
2. 用户登录权限系统的表设计。
用户登录表,系统表,用户登录系统表,安全组表,用户登录安全组关联表,权限菜单表,安全组权限关联表,行业表,行业菜单表。
当事人模型:当事人表,当事人角色,角色表。
3. 用户角色关系。
作者,出版,编辑,运营,平台
4. Redis使用,为什么使用redis。Redis怎么保存热点数据。
热点保存数据使用最近最少使用方法进行淘汰,建立一个链表,每次使用的放于链表头,长期不被调用的放于链表尾。
限定 Redis 占用的内存,Redis 会根据自身数据淘汰策略,加载热数据到内存。(6种淘汰策略)
5. 使用dubbo的好处,常用框架介绍。
分布式服务治理,实现软负载均衡和failover。
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
6. 集合对象怎么根据时间进行排序。
7. 多人操作数据,怎么保证数据数据的准确性。
使用乐观锁。
8. 数据库的优化
9. 5中常见异常
10. 出现outOfMemoryException怎么处理,及其参数原因。
原因:没有释放向系统申请的内存。
具体原因:1.静态集合类,生命周期和应用程序周期一致。
2.***
3.各种连接(数据库,io连接)
4. 单例模式。单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露
1.尽量避免static成员变量。
2.使用完list,map,大对象后赋值为0。
3.避免使用死循环等重复操作对集合添加元素。
造成栈溢出的原因:
1. 是否有递归
2. 是否有大量循环或者死循环
3. 全局变量过多
4. 数组,list,map过大
分析:方法:通过内存映像工具对dump出来的堆转储快照进行分析,也即是分析是堆溢出还是栈溢出。
11. 泛型的好处。
java中泛型的引入主要是为了解决两个方面的问题:1.集合类型元素在运行期出现类型装换异常,增加编译时类型的检查,2. 解决的时重复代码的编写,能够复用算法。
CVTE 2面
1. 常见的单点登录有哪些?
CAS
2. 常见设计模式?单例模式有哪几种?介绍一下voliate?
双重检验是voliate保证防止指令重排序。
3. Redis的基本数据类型?集合怎么使用?
String:数据结构是简单的key-value.
使用:set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
setnx(key, value):添加string,名称为key,值为value(仅当键不存在)
incr(key):名称为key的string增1操作
decr(key):名称为key的string减1操作
append(key, value):名称为key的string的值附加value
list:列表,redis 使用双端链表实现的 List;实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列。
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
lpush mylist "world"#从头部插入字符串
lpush mylist "hello"#同上
lrange mylist 0 -1#获取从0到最后一个如[1) "hello" 2) "world"]
hash:字典,将一些结构化的信息打包成 hashmap,Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。
hset user:001 name liweijie#哈希设置用户user:001的name键值为liweijie
hset user:001 age 21#同样,增加一个age键值为21
hget user:001 name#哈希获取用户user:001的name键的值。
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
Set集合:Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set 数据结构,可以存储一些集合性的数据。
共同好友,唯一性。
Sorted set:有序集合。
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
4. 为什么选择ActiveMq?它的作用?
5. Restful架构?什么才是restful?好处和缺点?
6. Redis数据库的持久化。怎样防止redis数据丢失。
aof和rdb文件,其中rdb二进制文件,aof基于命令。
创建RDB文件使用save,bgSave(创建子进程)。
Aof是通过保存redis服务器所执行的命令来记录数据库状态;追加(append),文件写入,文件同步。
RDB是通过保存数据库的键值对来记录数据库的状态。
数据库的复制:slaveof来复制数据库。
7. 持续集成部署,循环依赖怎么办?
8. 未来5年的规划?
远景能源
1. 数据库索引INNDB的好处?
1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
5.支持自动增加列AUTO_INCREMENT属性
6.热备份。
2. 数据库最左匹配原理?
3. TOPK问题?
4. 数据结构堆和快排?
5. 推荐算法?
6. CAS算法原理?优缺点?
无锁操作,乐观锁。优点无锁,效率高。缺点:
1. ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。
从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
2. 循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。
3. 只能保证一个共享变量的原子操作。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行CAS操作。
7. Cookie和session的区别?怎么保证cookie的安全。
如何保证cookie的安全性:1.进行加密;2. 用于识别身份的cookie应该设置为HttpOnly,也就是禁止通过JS操作这个cookie。3.cookie中的sessionId设置过期时间。
8. hashMap的原理?currentHashMap原理?
网易1/2/hr
1. 数据库事物?
2. B+树结构,索引选择原则?
1、 表的某个字段值得离散度越高,该字段越适合选作索引的关键字。主键字段以及唯一性约束字段适合选作索引的关键字,原因就是这些字段的值非常离散。尤其是在主键字段创建索引时,cardinality(基数,集的势)的值就等于该表的行数。MySQL在处理主键约束以及唯一性约束时,考虑周全。数据库用户创建主键约束的同时,mysql自动创建主索引(primary index),且索引名称为Primary;数据库用户创建唯一性索引时,MySQL自动创建唯一性索引(unique index),默认情况下,索引名为唯一性索引的字段名。
2、 占用存储空间少的字段更适合选作索引的关键字。例如,与字符串相比,整数字段占用的存储空间较少,因此,较为适合选作索引关键字。
3、 存储空间固定的字段更适合选作索引的关键字。与text类型的字段相比,char类型的字段较为适合选作索引关键字。
4、 Where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。
5、 更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。
6、 最左前缀原则。
7、 尽量使用前缀索引。
引入索引的目的就是提高数据的检查效率,因此索引关键字的选择与select语句息息相关。这句话有两个含义:一是,select语句的设计可以决定索引的设计;索引的设计也同样影响着select语句的设计。例如原则1与原则2,可以影响select语句的设计;而select语句中的where子句、group by子句以及,又可以影响索引的设计。两个表的连接字段应该创建索引,外键约束一经创建,MySQL会自动地创建与外键相对应的索引,这是由于外键字段通常是两个表的连接字段。
复合索引还有一个优点,它通过被称为“最左前缀”(leftmost prefixing)的概念体现出来的。假设向一个表的多个字段(例如fristname、lastname、address)创建复合索引(索引名为fname_lname_address).当where查询条件是以下各种字段的组合是,MySQL将使用fname_lname_address索引。其他情况将无法使用fname_lname_address索引。可以理解:一个复合索引(firstname、lastname、address)等效于(firstname,llastname,age)、(firstname,lastname)以及(firstname)三个索引。基于最做前缀原则,应尽量避免创建重复的索引,例如,创建了fname_lname_address索引后,就无需再first_name子段上单独创建一个索引
3. 常见的并发包,currentHashMap的原理?
4. 一个数组,多线程求和?
5. 内存泄漏和内存溢出?内存溢出的原因,举列子?
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
原因:1.没有释放向系统申请的内存;2.对象已不再使用单仍在内存中保留。Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。
造成的原因有:1、静态集合类引起内存泄漏:2、当集合里面的对象属性被修改后,再调用remove()方法时不起作用。3、***。4、各种连接。5、内部类和外部模块的引用。
6. Dubbo介绍,长连接通信原理,怎么知道连接到生产者?
7. 线程和进程的区别,各自优势?
进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
· 进程是资源分配的最小单位,线程是程序执行的最小单位。
· 进程有自己的独立地址空间。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
· 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
· 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
8. Redis集群,哨兵,hash一致性?
9. 单例模式
10. Synchronized,voliate,Threadlocal介绍什么情况下使用?
11. 线程池的参数,有哪几种线程池?
12. 消费者生产者怎么实现,多线程怎么实现?如果宕机阻塞队列的内容消失,怎么处理?
在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。
(1)wait() / notify()方法
(2)await() / signal()方法
(3)BlockingQueue阻塞队列方法
(4)PipedInputStream / PipedOutputStream
BlockingQueue阻塞队列方法
put()方法:类似于我们上面的生产者线程,容量达到最大时,自动阻塞。
take()方法:类似于我们上面的消费者线程,容量为0时,自动阻塞。
13. 怎么查找java的线程运行情况?
Jsp,jstactk,jmap,jinfo
14. HashMap原理,put的过程。
15. String,stringbuild,stringbuffer区别,为什么stringbuild不安全举例。
美团1面
1. 数据库隔离级别,数据库mysql判断是否为空的函数,数据库格式化时间的函数
5中隔离级别,ifnull,DATE_FORMAT(date,format)
2. Linux怎么保存文件退出,不保存退出;定时任务?
打开文件命令:vi we.txt
修改文件按:i表示插入
保存 Esc+:+wq 这个是保存,回车保存。
不保存的命令Esc+:+q!这个是不保存
3. 项目中权限设置?
4. Redis的使用,集群,怎么解决缓存穿透?
缓存穿透:1.对查询机构为空的情况也进行缓存,缓存的时间设置短一点,或者对该KEY对应的数据insert之后清理缓存。
2.对一定不存在的key进行过滤,可以把所有存在的key放到一个大bitmap中,查询时通过该bitmap过滤。
5. 数据库索引使用的什么?B+的结构?
6. Java虚拟机的垃圾回收算法?各自优缺点?
7. Tcp和udp区别?
8. Java的基本特性?
美团2面
1. 推荐算法论文讨论。会不会kmeans?TF-IDF权重算法?
TF-IDF 其中表示用户u使用标签的使用次数,表示用户u使用标签的总数,n表示用户的总数,表示使用标签的用户数量。
2. 山峰找峰值
二分查找,每次比较mid和mid+1
3. hashMap原理,为什么2倍的扩容。1.8有什么改进
经过rehash之后,元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置。
①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;
②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;
③.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向④,这里的相同指的是hashCode以及equals;
④.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向⑤;
⑤.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
⑥.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容
4. 线程池有哪几种,具体说说new***dTheadPool。
5. 线程池参数的作用?新增任务线程池是怎么增加线程的?线程池handler的处理?
6. Dubbo的原理,zk是怎么使用的?
7. Synchronized,voliate,ThreadLocal,reentrantlock 简单介绍。Synchronized和lock比较。
最常见的ThreadLocal使用场景为 用来解决数据库连接、Session管理等。
8. Synchronized和reentrantlock原理。
每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1 ,该线程即为monitor的所有者。
2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1
3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。
执行monitorexit的线程必须是objectref所对应的monitor的所有者。
指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。
通过这两段描述,我们应该能很清楚的看出Synchronized的实现原理,Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。
ReentrantLock是基于AQS实现的;AQS的基础又是CAS;由于AQS是基于FIFO队列的实现,因此必然存在一个个节点,Node就是一个节点。
9. 自旋锁,轻量级锁,重量级锁。
轻量级锁(Lightweight Locking)本意是为了减少多线程进入互斥的几率,并不是要替代互斥。它利用了CPU原语Compare-And-Swap(CAS,汇编指令CMPXCHG),尝试在进入互斥前,进行补救。
线程被阻塞后便进入内核(Linux)调度状态,这个会导致系统在用户态与内核态之间来回切换,严重影响锁的性能。
自旋锁:在一个线程获取锁的时候,先进行自旋,尝试。
偏向锁->轻量级锁->重量级锁
10. 公平锁和非公平锁。Synchronized是什么锁?
11. 项目中结算中心怎么保证幂整性?
12. 怎么查看java线程的运行情况。
13. Redis集群的作用?添加一个节点会有什么步骤?一致hash算法介绍,虚拟节点知不知道?
Redis集群是分布式数据库方案;集群通过分片来共享数据,并提供复制和故障转移。一个集群包含多个节点,集群的整个数据库被分成16384个槽(slot),数据库中的每个键都属于这16384个槽的其中一个,每个节点都可以处理0个或者最多16384个槽。 Redis集群的重新分片操作可以将任意数量已经指派给某个节点的槽改为指派给另外一个节点,并且相关槽所属的键值对也会从源节点移动到目标节点。
Redis集群的重新分片操作可以将任意数量已经指派给某个节点的槽改为指派给另外一个节点,并且相关槽所属的键值对也会从源节点移动到目标节点。
集群中的每个节点都会定期地向集群中的其他节点发送PING命令,以此来检查对方是否在线,如果接收ping消息的节点没有在规定的时间内,向发送ping消息的节点返回pong消息,那么将认为没有返回消息的节点标记为疑似下线。 如果半数以上处理槽的节点都将某节点x报告为疑似下线,那么这个主节点x将被标记为已下线。
1.复制下线主节点的所有从节点将会有一个从节点被选中。
2.被选中的从节点会执行slaveof on one,成为新的主节点。
3.新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽指派给自己。
4.新的主节点向集群广播一条pong消息,这条pong消息可以让集群中的其他节点立即致电这个节点已经由从节点变为主节点了。
5.新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。
集群中的节点通过发送和接受消息进行通信,节点的消息包括meet,ping,pong,publish,fail五种。
cluster meet <ip> <port>
首先连接节点:
$redis -cli -c -p 127.0.0.1:7000
127.0.0.1:7000>cluster Nodes //查看节点连接情况
127.0.0.1:7000>cluster meet 127.0.0.1:7001 //连接新的节点
一致性hash:
使用场景:防止增加和删除服务器,普通的hash算法导致服务器内容失效。
Hash算法的核心:单调性和平衡性。
一致性hash,将数据和服务器hash,顺时针将数据放入服务器中,新增服务器只需要将该服务器逆时针的数据保存到新的服务器;如果删除服务器只需要将该服务逆时针的数据放于顺时针的服务器上。保证单调性。
平衡性:一般是每个服务器上数据大致相同,如果服务器较少或生成服务器的虚拟节点(实际节点在hash算法中的复制品),保证每个服务器上数据基本一致。
14. 消息队列使用的是什么?原理是什么?
15. Spring的ioc?bean的加载过程?aop原理?动态***有几种,区别是什么?举了一个列子问可不可以动态***?
16. 看什么书?数据库语句分析?
17. restful讲解?怎么表示url?post和put区别?
· GET /tickets # 获取ticket列表
· GET /tickets/12 # 查看某个具体的ticket
· POST /tickets # 新建一个ticket
· PUT /tickets/12 # 更新ticket 12.
· DELETE /tickets/12 #删除ticekt 12
Put具有幂等性。
18. Hession序列化,java序列化,其中序列化的uuid有什么用?
Java序列化:会把要序列化的对象类的元数据和业务数据全部序列化为字节流,而且是把整个继承关系上的东西全部序列化了。它序列化出来的字节流是对那个对象结构到内容的完全描述,包含所有的信息,因此效率较低而且字节流比较大。但是由于确实是序列化了所有内容,所以可以说什么都可以传输,因此也更可用和可靠。
它的实现机制是着重于数据,附带简单的类型信息的方法。就像Integer a = 1,hessian会序列化成I 1这样的流,I表示int or Integer,1就是数据内容。而对于复杂对象,通过Java的反射机制,hessian把对象所有的属性当成一个Map来序列化,包含了基本的类型描述和数据内容。而在序列化过程中,如果一个对象之前出现过,hessian会直接插入一个R index这样的块来表示一个引用位置,从而省去再次序列化和反序列化的时间。
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。主要作用是:验证版本一致性。
今日头条1/2面
1.hashMap原理?插入过程?
2.redis的数据结构?
3.怎么实现LRU结构?
4.单例模式(手写)?
5.内存泄漏原因?
6.数据库索引?优化和缺点?
7.数据库是怎么实现隔离级别的?
1.Read uncommitted 读未提交数据:能解决第一类丢失更新的问题,但不能解决脏读的问题
实现原理是,读数据时候不加锁,写数据时候加行级别的共享锁,提交时释放锁。行级别的共享锁,不会对读产生影响,但是可以防止两个同时的写操作。
2.Read committed 读提交数据:能解决脏读的问题,但是不能解决不可重复读的问题:
实现原理是,事务读取数据(读到数据的时候)加行级共享锁,读完释放;事务写数据时候(写操作发生的瞬间)加行级独占锁,事务结束释放。由于事务写操作加上独占锁,因此事务写操作时,读操作也不能进行,因此,不能读到事务的未提交数据,避免了脏读的问题。但是由于,读操作的锁加在读上面,而不是加在事务之上,所以,在同一事务的两次读操作之间可以插入其他事务的写操作,所以可能发生不可重复读的问题。
3.Repeated Read 可重复读:顾名思义,可以解决不可重复读的问题,但是不能解决虚读问题:
实现原理,和读提交数据不同的是,事务读取数据在读操作开始的瞬间就加上行级共享锁,而且在事务结束的时候才释放。分析方法和读提交数据类似,本处不再赘述。但是,由于加锁只是加在行上,所以,仍然可能发生虚读的问题。
4. Serializable 串行化:可以解决以上所有的并发问题:
实现原理是,在读操作时,加表级共享锁,事务结束时释放;写操作时候,加表级独占锁,事务结束时释放。
8.聚集索引和非聚簇索的区别?
9.项目中用户权限控制?
1.redis的复制?
Slaveof
2.redis提供分布式服务的方案?服务端,客户端各是怎实现的(搞不明白)?
3. synchronized和lock的区别?原理?介绍一下乐观锁和悲观锁?乐观锁在项目中怎么使用的?
4.hashMap和currentHashMap的区别?CSA?
5.内存泄漏?怎么查询(脑袋一热说没遇见过)?栈溢出原因?怎么解决堆溢出?
6.服务上线后要关注服务器的什么指标?
cpu,内存占用量,磁盘I/O,
6.介绍一下jvm内存模型?怎么设置Eden,Survivor 的比例?新生代转换成老年代的时间?CMS垃圾回收机制?G1垃圾回收机制?CMS和G1的区别?G1原理?
7.voilate简单介绍下?禁止指令重排序怎么实现?happens-before(表示没听过)?
8.arp协议详细介绍下?
9.数组中找出所有重复的数字?空间复杂度为0(1),时间复杂度最下?(求答案)
10.树交换左右字数?
11.一个二维数组只含有0,1;将1围成的矩阵中所有0的数字转换成1?
12.树桩存水问题?例如一维数组412313可以存储水量为5,12341不能存水,313存水2。
13怎么设计阻塞队列?
360 1/2面
1.hashMap ,hashtable,currentHashMap的却别?
2.线程和进程的区别?
3.线程间怎么通信?
线程间通信和同步的方式主要有同步,while轮询,wait\notify,pipedInputStream
通信机制主要有:管道、有名管道、消息队列、信号量、共享空间、信号、套接字(socket)。
4.单例模式双重检验模式?
5.简单工厂模式?
6.https协议工作在哪几层?
应用层,传输层
7.数据库存储引擎?INooDb的好处?页锁和行锁?数据库的事物。
Mylsam的锁类型:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
表锁:表共享锁;表独占锁。
InnDb的行锁模式及加锁方法:
共享锁:
排他锁:
InnoDB的间隙锁:当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制不是所谓的间隙锁(Next-Key锁)
InnoDb行锁时通过索引上的索引来实现的,只有通过索引条件检索数据,InnoDB才会使用行级锁,否则使用表锁。
什么时候使用表锁:1.事物需要更新大部分数据或全部数据,表又表较大。2.事物涉及多个表,比较复杂,很可能引起死锁。
8.redis的存储结构?怎么修改map值?string怎么加1?设置过期时间?
9.策略模式?责任链模式?
10.http协议怎么传输json?
11.快排?插入排序?401状态码?restful的传播方法?http有哪些请求?
get,head,delete,post,options,put。
12. 数据库的触发器?存储过程?
滴滴 1/2/3/4/hr面
1. 计算机的冯洛伊曼结构图?
输入设备,运算器,存储器,控制器,输出设备
2. 计算机网络3次握手4次挥手?
3. 高速缓冲***的作用?
***是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。缓和***处理器和主存储器之间速度不匹配的矛盾。
4. 进程和线程的区别?
5. 进程的独立地址空间存储的什么?
进程地址空间由进程可寻址的虚拟内存组成,而且更为重要的特点是内核允许进程使用这种虚拟内存中的地址。内核除了管理本身的内存外,还必须管理用户空间中进程的内存
6. cpu调度算法?
1.先来先服务;2.最短作业优先;3.优先权调度;4.轮转发调度;5.高响应比算法(等待时间+服务时间/服务时间)
8. 计算机网络拥塞控制?拥塞阻塞会导致什么情况?
网络阻塞是指当某一通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象。严重时甚至会导致网络通信业务陷入停顿,即出现所谓的死锁现象。
9. 慢开始门限ssthresh状态变量是怎么设置的?
10 tcp/ip 五层协议?Arp攻击?
11. 聚簇索引和非聚簇索引?主键和唯一键的区别?
12 B树和b+树的区别?
13 文件传输在什么情况下耗费性能?怎么观察?
14 redis的hash值怎么删除?redis的有序集合是什么结构?画出跳表结构,时间复杂度?
15 50亿的url中的中找出相同的。50亿url中只有一个相同,怎么找?bitmap
16 数据的优化?为什么不建议使用in?in 会使索引失效吗?
17 怎么设计一个高性能的系统,可以支持高并发大访问量?
18 当一个接口访问后返回数据的效率变低了怎么查询问题?
18 数据库的日订单超过了千万?怎么设计数据库?一致性hash算法的原理?
19 java锁机制?synchronizede的原理,为什么要用minitor?
20 乐观锁机制?数据库的表锁,行锁区别?
21 数据库的存储引擎?InnoDB的好处?
22 hashTable与hashmap?你学到了什么,不要求讲细节?
23 插入排序?
24 有序的k个数组,数组长度为n,整个排序的结果。
25. 有序的数组,写一个random随机数,输出不同的值?
26. 智力题 两根不规则的香,燃完要1小时,计算出15分钟的时间。
27. 智力题 一个人上山要一天,下山要一天。在山上有没有相遇点。
28 智力题 10枚硬币找出其中不同的一个,有天平。
29. 智力题 4个人夜晚过独木桥,每个人的速度不同,以最慢的为准,每次只能走2个人,求过桥的最短时间。
美图 1/2面
1.dubbox的原理?
2.dubb0x的通信机制?
3. dubbox的虚拟化有哪几种?
4. 介绍一下rpc协议?
5. NIO?在什么情况使用NIO,什么情况使用BIO?
6. 怎么保证集群系统的高可用?
7. java的内存机制?垃圾收集算法?为什么要分年轻代和老年代?
8. restful风格是什么?
9. redis的集群是怎么实现的?
10. 数据的聚餐索引和非聚簇索引?在什么情况下使用?
11 数据库的优化方法?
12 消息队列怎么保证消息的一致性?
13 介绍项目?
14 项目中的遇见的问题?
15 项目中用到什么数据结构?说下跳表?
16 为什么要用redis而不是其它的缓存?redis里面的数据结构?