J2Cache学习梳理
springboot工程配置及使用J2Cache
Spring Cache @Cacheable等注解生效原理简单分析
@Cacheable中Spring EL表达式的使用及借鉴
AopUtils.getMostSpecificMethod解决代理对象获取不到方法参数名称问题
J2Cache架构简单了解
j2cache-spring-boot2-starter中Redis的使用
Redis的单线程高性能原因,扩展:Redis6多线程实现、redis慢查询定位分析
Epoll原理
如何设计一个缓存框架 Redis+Caffeine两级缓存,让访问速度纵享丝滑
当@Transactional遇到@CacheEvict
J2Cache架构简单源码分析
前言先读一遍JCache的README!!!
它主要要解决的问题是:
使用内存缓存时,一旦应用重启后,由于缓存数据丢失,缓存雪崩,给数据库造成巨大压力,导致应用堵塞。
使用内存缓存时,多个应用节点无法共享缓存数据。
使用集中式缓存,由于大量的数据通过缓存获取,导致缓存服务的数据吞吐量太大,带宽跑满。现象就是 Redis 服务负载不高,但是由于机器网卡带宽跑满,导致数据读取非常慢。
J2Cache启动的逻辑从spring-boot2-starter的net.oschina.j2cache.autoconfigure.J2CacheAutoConfiguration为入口,开始看j2cache的启动逻辑。主要目的是弄明白net.oschina.j2cache.CacheChannel抽象类的对象组装。
123456@Bean@DependsOn({"springUtil","j2CacheConfig"})public CacheChannel cacheChannel(net.oschina.j2cache.J2CacheC ...
Cacheable注解中SpEL表达式的借鉴
1、需求调用微信接口之前:统一权限校验及异常处理。
2、思路
提供自定义注解,可配置需要的参数
aop拦截自定义注解,方法执行前校验权限,拦截并过滤方法抛出的异常
3、核心代码3.1、自定义注解@WxFuncAuth1234567891011121314151617181920212223242526@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface WxFuncAuth { /** * 方法权限列表 * * @return 方法权限列表 */ String[] funcs() default {}; /** * 微信认证状态,默认:认证 * 有些接口不需要微信认证即可调用 * * @return 微信认证状态 */ boolean isVerify() default true; /** * appId * ...
SpringCache的Cacheable等缓存注解生效原理简单分析
1、简单分析
以j2cache为切入点,从其使用方式来看,操作j2cache都是通过CacheChannel抽象类。
开源的spring boot2版本的stater中J2CacheSpringCacheAutoConfiguration开启Spring Cache 支持的配置入口,org.springframework.cache.CacheManager接口的实现为:net.oschina.j2cache.cache.support.J2CacheCacheManger。
操作Spring的CacheManager,底层操作的j2cache的CacheChannel。
2、Spring中CacheManager和Cache从源码看一下这两个接口:CacheManager和Cache。(spring-context 5.3.18与j2cache-core 2.8.0-release)
SPI是JDK提供的一种服务扩展接口,全称为 (Service Provider Interface) 。
以j2cache为例,看一下J2CacheCacheManger与CacheManager、 ...
行为型设计模式-观察者模式
1、简介1.1、意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
1.2、适用性
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
1.3、优点
观察者和被观察者是抽象耦合的。
建立一套触发机制。
1.4、缺点
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
2、类图
参考http://c.biancheng.net/view/1390.html
https://blog.csdn.net/zsjlovesm521/article/de ...
结构型设计模式-适配器模式
1、简介1.1、意图将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
1.2、适用性你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象Adapter )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
1.3、优点客户端通过适配器可以透明地调用目标接口。
复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
在很多业务场景中符合开闭原则。
1.4、缺点适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。
2、类图
3、代码123456789101112131415161718192021222324252627282930public interface CarUsb ...
创建型设计模式-建造者模式
1、简介1.1、意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
1.2、适用性当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
1.3、优点各个具体的建造者相互独立,有利于系统的扩展。
客户端不必知道产品内部组成的细节,便于控制细节风险。
1.4、缺点产品的组成部分必须相同,这限制了其使用范围。
如果产品的内部变化复杂,该模式会增加很多的建造者类。
2、类图
3、代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889@Datapublic class Car { /** * 引擎,1.5t 2.0t */ private String engine; /* ...
创建型设计模式-单例模式
1、简介1.1、意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。
1.2、适用性当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
1.3、优点单例模式可以保证内存里只有一个实例,减少了内存的开销。
可以避免对资源的多重占用。
单例模式设置全局访问点,可以优化和共享资源的访问。
1.4、缺点单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。
2、类图
参考https://blog.csdn.net/atu1111/article/details/105364433
https://blog.csdn.net/zsjlovesm521/article/details/94382666
https://blog.csdn.net/bluebo ...
行为型设计模式-策略模式
1、简介1.1、意图定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
1.2、适用性许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
1.3、优点
多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if…else 语句、switch…case 语句。
策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。
策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的实现。
策略模式提供了对开闭原则的完美支持,可以在不修改原代 ...
创建型设计模式-原型模式
1、简介1.1、意图用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
1.2、适用性当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
为了避免创建一个与产品类层次平行的工厂类层次时;或者
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
1.3、优点JAVA自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
1.4、缺点需要为每一个类都配置一个 clone 方法
clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。
2、类图
参考https://blog.csdn.net/ ...