单例模式的实现
- 懒汉模式:提前初始化
public class Singleton {
private static Singleton singleton = null ;
private Singleton(){}
synchronized public Singleton getSingleton(){
if (singleton == null){
singleton = new Singleton();
}
return singleton
}
}
- 饿汉模式:需要时初始化
public class Singleton {
private static Singleton singleton = new Singleton() ;
private Singleton(){}
synchronized public Singleton getSingleton(){
return singleton
}
}
- 静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
java GC机制
- 什么时候触发GC
– 所有实例都被回收
– 加载类的ClassLoad被回收(classload为了定位class文件)
– 没有引用,或没有被反射访问
SpringBoot启动流程
启动流程图
详细的启动代码新后续开文章分析。
redis 相关
- 支持的类型:字符串,列表,集合,hash,有序集合,基数
- 最近面试redis被问的很惨,新开博文读redis的详细分析。
MQ
- 消息同步丢失
- 生产者下发:confirm,异步
- 中间间重启:rabbitMQ持久化
- 消费者丢失:自动重试,关闭ACK(ACK相关流程文档补充)
- 防止消息重复——幂等性
- 通过业务逻辑控制
– 数据库unique
– 更新数据的时候,判断前提
– 操作记录
RPC:远程通讯协议
- 与http的区别:
- RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议,这里要结合OSI七层模型聊一聊。
- RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。
- Http中还定义了资源定位的路径,RPC中不需要
- RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。
- Http协议请求、响应等细节需要我们自己去实现。
- 优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台
- 缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境。
- restful: http + json
MySQL
- innodb:
– 行级锁 + 外键,大容量
– select count(*)时会扫描全表
– 多重并发 - myIsam:
– 不提供事务支持,无行锁,无外键
– .frm:存储表定义,.myd:存储表数据,.myi:存储表索引 - ACID
– 原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
– 一致性(Consistency):事务前后数据的完整性必须保持一致。
– 隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
– 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 - 统计表table
| id | userid | ctime
|–|--|–|
|1 | 2 | 3 |
统计表中提交大于10次的用户,并按照提交次数从大到小排列
select userid, count(id) fromtable
group by userid having count(id) > 1 order by count(id) desc ;