前言
提示:这里为每天自己的学习内容心情总结;
Learn By Doing,Now or Never,Writing is organized thinking.
目前的想法是,根据 Java Guide 和 JavaLearning 和 小林coding进行第一轮复习,之后根据 Tiger 和 CS-Notes 进行最后的重点复习。
今天是周二,TO DO LIST:
- 需要将财务报销弄完;
- 复习完Redis;
提示:以下是本篇文章正文内容
一、今天学习了什么?
- 复习完Redis;
二、关于问题的答案
1.Redis
Q:为什么会造成缓存和数据库的不一致性问题呢?
主要还是因为并发操作,操作之间的顺序无法固定。
先更新缓存后更新数据库,先更新数据库后更新缓存,这两种操作都会造成数据的不一致性问题。
Q:你采用的策略?
先更新数据库,后删除缓存。
Q:为什么?
更新数据库比删除缓存更耗费时间,如果先删除缓存后更新数据库,会更容易出现数据不一致的情况。
比如,线程A需要将数据1修改成2,删除缓存后,进行数据库更新业务。此时,线程B查询数据,重构缓存,但是数据库业务还未完成,于是在缓存中数据为1,之后数据库的数据为2,发生了数据不一致性。
Q:如果删除缓存失败怎么办?
删除缓存失败,还会导致数据不一致性的问题。
需要给数据加上过期时间,保底策略,其次可以引入重试机制,将删除缓存的操作放入消息队列中。
还可以订阅MySQL 的 binlog,再去操作缓存。
2.SE
Q:异常?
结构体系图,Throwable、error、exception、checked exception、unchecked exception;
Q:反射?
反射是框架里面常用的一个技术,比如 SpringBoot/Spring、Mybatis等,通过反射可以获取到类中的方法和属性,然后进行操作。
优点就是:编写代码简单。
缺点:安全性会受到影响,在使用反射的时候泛型安全检查不起作用。
Q:Class对象的四种获取方式?
- 类名.class;
- class.forname;
- 实例对象.getClass;
- 类加载器+类名全路径;
Q:代理模式?
代理模式,就是使用一个代理对象去增强原本类的功能,用于扩展被代理对象并且不破坏被代理对象。
代理模式分为:静态/动态代理。
Q:静态代理?
现在基本上不用静态代理了,因为编写代码很麻烦,容易造成代码之间的耦合性高,使用步骤:
- 创建一个接口及其实现类;
- 编写另外一个实现代理类也实现这个接口;
- 在代理类中进行方法增强。
Q:动态代理?
目前使用的都是动态代理,又可以分为 JDK 动态代理 和 CGLIB 动态代理,模式不一样。
CGLIB 是基于一个开源的库,可以基于继承类来实现动态代理,但是 JDK 动态代理必须基于接口, JDK 动态代理是基于 JDK ,效率更高。
Spring AOP 是基于这两个应用去实现的,区别在于 使用 SpringAOP 的时候,是基于接口还是继承类的。
Q:JDK 动态代理?
两个重要的类:InvocationHnadler 和 Proxy,使用步骤:
- 编写接口极其实现类;
- 自己实现 InvocationHandler 注入目标代理对象,然后编写业务逻辑;
- 利用 Proxy.newProxyInstance() 方法获取代理对象,执行方法;
Q:CGLIB 动态代理?
两个重要的类:MethodInteceptor 和 Enhancer,使用的时候需要引入依赖,因为这是一个开源的项目。
Q:泛型?
泛型是只有在编写代码或者编译期间才能确定的类型,目的是为了类型安全,并且使用泛型不需要进行强制转换。
Q:泛型擦除?
字节码进入 JVM 运行时,会擦出泛型参数。泛型只有在编译期间有用。
总结
提示:这里对文章进行总结:
进度还是要抓紧。