设计模式了解么
常见的设计模式有单例模式、工厂模式、代理模式、模板模式、适配器模式
单例模式:spring
定义的bean
默认为单例模式
工厂模式:spring
的beanfactory
是工厂模式的体现
代理模式:aop
面向切面编程是代理模式的体现,底层主要通过动态代理实现
模板模式:用来减少重复代码的编写
适配器模式:处理器适配器根据处理器规则适配相应的处理器执行
说说redis的持久化策略
RDB
:redis data backup
,快照式持久化,隔一段时间会把数据生成数据集快照保存到磁盘,优点存储二进制文件,启动恢复速度快,缺点数据完整性不是很高
AOF
:append only file
,追加式持久化,执行一次指令就追加到文件末尾,优点数据完整性高,缺点启动恢复速度慢
混合式持久化:结合两者优势
请你讲讲单例模式、请你手写一个单例模式
构造函数私有,避免外界通过new
创建实例
单例模式
- 饿汉式:类加载时就创建对象,因为静态变量在该类的内部,可以直接调用构造方法
- 枚举饿汉式
- 懒汉式:被使用的时候才会创建对象,方法里面判断对象是否为空,为空创建对象,适合单线程
- 线程安全懒汉式:给方法加锁,
synchronize
,比较笨重 - 双检锁懒汉式:方法上不加锁,先判断对象是否为空,为空加锁再次判断对象是否为空,第二次加锁判断为空可以防止多线程下第一次判断为空然后创建对象
- 内部类懒汉式:因为内部类在该类的里面,所以可以直接使用构造方法
请你说说虚拟内存和物理内存的区别
物理内存:计算机真实存在的内存,内存有限
虚拟内存:一种计算机管理内存的方法,让程序认为拥有连续的内存
请你说说MySQL的事务隔离级别
事务隔离级别主要是解决脏读、不可重复读、幻读
RU:read uncommitted
,读未提交,会发生脏读、不可重复读、幻读
RC:read committed
,读已提交,会发生不可重复读、幻读
RR:repeatable read
,可重复读,会发生幻读,InnoDB
存储引擎默认使用的事务隔离级别,还额外使用了next-key lock
间隙锁防止幻读
serializable
:序列化,不会发生以上问题