面试
小雨的光
这个作者很懒,什么都没留下…
展开
-
Redis学习日记
背景Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库、并提供多种语言的API。它通常被称为数据结构服务器,因为值可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)、和有序集合(sort sets)。简介Redis是完全开源的,遵守BSD协议、是一个高性能的key-value数据库。Redis与其他key-value缓存产品有以下三个特点:Redis支持数据的持久化、可以将原创 2020-12-01 14:17:21 · 247 阅读 · 0 评论 -
算法和数据结构(二):算法
接着上篇博客,这篇博客我们一起看看传说中的算法(早知道这么简单,早点看看的话,阿里也就去了,泪奔....)。面试常见的算法分为两种:排序算法和查找算法。1.排序算法面试题目:给定任意的一个无序数组,用 你熟悉的算法做一个排序(建议自己手写一遍,编辑器里敲一遍,别面试时才慢慢想)。1.1 冒泡排序(1)逐个比较相邻的两个元素,将较大的值往后放(2)第一轮比较完最大的元素放数组...原创 2019-11-29 08:57:48 · 508 阅读 · 0 评论 -
算法和数据结构(一):数据结构
前两天面试阿里,最终死在了算法和数据结构上,痛苦不已。今天下了决心,来撸一把算法和数据结构。 对于计算机来说,只有0110,它是不会关心什么算法,什么数据结构的。那么,谁关心呢?当然是人啊。计算机是很傻逼的东西,它能做什么,完全取决于你想让它做什么。于是,就有了算法和数据结构。数据结构用于存储,算法用于计算。1. 数据结构 在接触算法前,你需要先了解数据结构。数据结构...原创 2019-11-28 22:00:46 · 724 阅读 · 0 评论 -
几道常见的面试题
1. 一个类的方法执行顺序public class A { static { System.out.println("静态方法执行啦"); } { System.out.println("代码块执行啦"); } public A() { System.out.println("构造方法执行啦");...原创 2019-11-23 09:59:05 · 110 阅读 · 0 评论 -
JVM和类加载过程
1. JVM内存和操作系统内存关系 操作系统内存也有堆和栈。操作系统的栈由操作系统自己管理。操作系统的堆是开放的。 JVM的内存是操作系统堆中的一块区域。 对于操作系统来说,jvm只是一个普通的程序。 对于java程序来说,jvm是运行java程序的载体。 换言之,类加载过程,其实就是把在操作系统中编译完成的.clas...原创 2019-11-23 10:38:23 · 311 阅读 · 0 评论 -
深入理解Redis原理
Redis简述 Redis是一种内存型的非关系型数据库,因为其优秀的性能,经常被用来做缓存(当然也可以作为一种消息队列)。Redis支持丰富的数据类型:String、List、Set、ZSet和Hash。为了节省内存,Redis的每种数据类型都存在不同的存储策略来满足需要。比如Hash,数据量较少时,采用数组紧密存储的结构,会在数据量增加驾到某个临界点时切换到HashMap的方式。...原创 2019-11-23 08:39:31 · 620 阅读 · 0 评论 -
深入Redis分布式锁
基础知识Redis提供了函数来支持分布式锁: SETNX key value当且仅当 key 不存在时才能设置成功。设置成功时,返回1;反之,返回0。如果锁设置失败,说明已经有其他任务获取了这把锁,可以通过循环的方式不断地尝试获取锁。问题解答(1)如果获得锁的任务因为不可抗力挂掉了,比如断电停机,怎么保证锁能被释放? 通过设置超时时间来解决...原创 2019-11-22 08:59:46 · 129 阅读 · 0 评论 -
HashMap源码阅读(JDK1.8)
HashMap实现了Map接口,继承了AbstractMap父类(AbstractMap也实现类Map接口)。HashMap的类声明如下:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {}以下是...原创 2019-11-15 09:46:22 · 166 阅读 · 0 评论 -
ConcurrentHashMap源码阅读
面试时面试官最常问的几个问题:1. HashMap是线程安全的吗? 答:不是。2. 既然HashMap不是线程安全的,那有什么替代方案? (1)用HashTable,它是线程安全的,但是被弃用了(性能问题被弃用了)。 (2)用HashMap,但是所有调用它方法的地方,都做加锁处理操作。 (3)用ConcurrentHashMap,一了百了。3....原创 2019-11-09 09:55:57 · 138 阅读 · 0 评论 -
阻塞队列BlockQueue
先上BlockQueue的源码:public interface BlockingQueue<E> extends Queue<E> { //增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 boolean add(E e); //添加一个元素并返回true 如果队列已满,则返回false boo...原创 2019-11-09 09:08:15 · 442 阅读 · 0 评论 -
lock接口的lock()和tryLock()区别
正文开始前先把lock接口的源码摆出来(精简后的,特意保留了部分注释)public interface Lock { /** * Acquires the lock. */ void lock(); /** * Acquires the lock unless the current thread is * {@linkpl...原创 2019-11-09 08:36:15 · 8050 阅读 · 5 评论 -
公平锁(FairSync)和非公平锁(NonfairSync)
接着上一篇深入WriteLock和ReadLock,我们这篇博客将要揭开公平锁(FairSync)和非公平锁(NonfairSync)的神秘面纱。公平锁(FairSync)源码: /** * Fair version of Sync */ static final class FairSync extends Sync { privat...原创 2019-11-09 08:21:53 · 1826 阅读 · 2 评论 -
深入WriteLock和ReadLock
接着上一篇JDK lock锁,这次我们来挖一挖lock锁的底层。首先,我们来看看WriteLock的实现 public static class WriteLock implements Lock, java.io.Serializable { private static final long serialVersionUID = -499244864640769...原创 2019-11-08 09:05:57 · 556 阅读 · 0 评论 -
如何应对互联网模式下的高并发场景(面试)
1. 架构升级+负载均衡 用“大中台,小前台”的新架构战略来应对日益庞大和复杂的需求,将核心业务处理和数据处理转移到大中台,小前台只做定制化的业务处理。同时,对服务进行必要的负载均衡来缓解单个服务的压力。2. 异步IO 采用异步io是一种有效缓解服务器压力的方案,可以增加一定时间内服务器的抗压能力。3. 消息队列 将不需要实时返回的请求放入消息队列进行...原创 2019-11-08 07:51:30 · 534 阅读 · 0 评论 -
随机面试题
1. 怎么保证MQ消息必达?(1)客户端和服务端都提供回调接口,一旦收到数据消息就发送确认消息;(2)客户端对消息编号,一旦异常服务端及时通知客户端重发;2. 怎么用Redis做分布式锁?(1) 用setNX(key,value,超时时间)方法设置锁。(2)并通过给每个key设置随机过期值来保证锁不会大量同时过期。3. 阻塞队列和非阻塞队列 BlockQueu...原创 2019-11-04 08:04:26 · 346 阅读 · 0 评论 -
设计模式(面试)
1. 什么是设计模式? 设计模式是前人在工作过程中总结的一套有效的编码方案,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。2. 为什么要用设计模式? 众所周知JAVA不像其他语言那么灵活,特别死板的限制了很多东西。为了弥补自身的缺陷,所以引入了设计模式。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。3. 设计模式的原则 ...原创 2019-11-04 07:37:40 · 138 阅读 · 0 评论 -
Dubbo(面试)
1. 分布式事务场景:服务A同时调用服务B和服务C,要求服务B和服务C同时成功时操作才成功。如果其中一个失败,需要进行事务性回滚。方案:(1)分阶段提交:引入一个全局事务管理模块,将服务B和服务C的事务分为parpare和commit两个阶段。第一阶段完成服务B和服务C各自的事务操作,第二阶段进行事务提交。如果失败了,则回滚。(2)补偿机制:同样引入一个全局事务管理模块,在服务B和...原创 2019-10-24 08:07:37 · 156 阅读 · 0 评论 -
JDK并发包(面试)
JDK并发包下主要新增了两个内容,一个是关于线程和锁的同步控制工具,一个是并发容器。面试时问的比较多的是信号量、倒数计数器、ConcurrentHashMap。(1)信号量(Semaphore)信号量可以用来限流。Semaphore内部维护了一个计数器,在多线程访问的情况下,可以限制应用程序每次处理的请求数量。(2)倒数计数器(CountDownLatch)倒数计数器可以...原创 2019-10-23 09:01:27 · 503 阅读 · 0 评论 -
事务
1. Mysql事务的基本要素 原子性、一致性、隔离性、持久性2 .Mysql事务的并发问题 脏读:事务A读取了事务B提交的数据,然后事务B回滚,事务A得到的就是脏数据; 不可重复读:事务A和事务B同时多次读取同一条数据,期间事务B对该数据做了修改,导致事务A多次取到的数据不一致; 幻读:事务A对读取了所有表数据并做了其他操作,事务B插入了一条新数据,对于事务A来说,...原创 2019-10-17 20:02:47 · 105 阅读 · 0 评论 -
线程池原理(面试)
1. 什么是线程池? 顾名思义,存放线程的一个池子。2.怎么设计一个线程池 (1) 新建一个数组,创建一堆线程存放进去; (2) 线程池中的线程来处理任务,处理完成后回收线程而不是销毁线程; (3) 设计等待队列来存放来不及处理的任务; (4) 拒绝策略4.JDK中的线程池4.1 线程池的参数public ThreadPoolEx...原创 2019-10-24 08:09:45 · 991 阅读 · 0 评论 -
常见缓存数据库特点
一. Redis1. redis是一种key-value型的数据库;2. redis是一种内存型数据库,这样做可以加快访问速度;3.redis会定期把更新数据写入磁盘,从而达到重启可恢复的效果。同时,也满足了主从备份的目的。4.redis和其他缓存数据库相比,拥有丰富的类型支持,包括:String(字符串),list(列表),set(集合),zset(有序集合),hash(...原创 2019-02-13 09:54:35 · 3149 阅读 · 0 评论 -
java高级工程师面试题目总结
1. 集合框架Collection接口: List接口: ArrayList实现类 LinkList实现类 ...原创 2019-08-30 08:14:49 · 845 阅读 · 0 评论 -
JVM面试题目
1. 堆和栈的理解:堆是用来存放数组和对象数据的,栈是用来存放程序运行期间需要使用的局部变量的。栈中也会存放一些比较小的数据,比如java 的 几种基本数据类型(int,byte,double, boolean,long,char,float)和比较小的单位。2. 垃圾回收了什么?垃圾回收针对的是堆中的数据块(可以想一下,栈中存放的都是定义在方法内部的局部变量,一旦回收方法一定会报错)...原创 2019-09-02 09:56:25 · 272 阅读 · 0 评论 -
mysql性能优化
1. 选择合适的mysql引擎:MyISAM(不支持事物,索引),Innodb(支持事物,索引),Memory(内存型的), merge(一组MyISAM集合)。2. 合理设计表结构:该分表就分表(提炼字典表),尽量减少可变字段的使用(静态表的好处);3. 优化sql避免全表扫描,尽量不要使用in,not null等会导致全表扫描的关键字。4. 建索引选择合适的索引...原创 2019-09-03 08:55:32 · 80 阅读 · 0 评论 -
分布式锁
1. 什么是分布式锁?了解多线程的童鞋一定也知道锁的概念的,而多线程是针对单个服务而言的。对于多个服务而言,多线程中的锁显然是没啥意义的。于是,就有了分布式锁,它是针对多个服务之间有序合作的。2. 为什么要用分布式锁?因为互联网应用中为了应对高并发采用了负载均衡的策略,多个服务之间要有序合作,就需要引入分布式锁了。举个栗子,小明在超市买了根雪糕,付账时网络信号不好,也没有提示支付...原创 2019-09-03 12:06:27 · 113 阅读 · 0 评论 -
MYSQL索引
1 为什么要用索引?如果把数据库比作一本厚厚的书,索引就是它的目录。根据索引我们可以快速的找到到我们期望的数据。2.索引的分类有哪些?从实现方式的角度(一般和引擎类型有关),我们可以将其分为:聚集索引和非聚集索引。从实际应用的角度,我们可以将其分为:普通索引、唯一索引、主键索引、组合索引、全文索引。3.索引和Mysql引擎InnoDB可以看做是聚合索引,因为它的B+树叶节点...原创 2019-09-05 08:29:20 · 84 阅读 · 0 评论 -
io框架
1. 关于流的概念 想象一段水流,一定有一个起点,有一个终点,还有一条河来容纳它。磁盘或者内存中的文件数据就是水流,我们的程序就是河。流是基于unix中管道提出来的一个概念。在unix中,管道是一条不间断的字节流,用来实现同一设备上不同程序间的通信,或与其他设备进行交互。最常见的场景是文件的复制转移和服务器与硬件设备之间的通信。2. 流的分类 1> 根据流的方向,将流分...原创 2019-02-13 14:22:24 · 246 阅读 · 0 评论