自定义注解加Aop缓存赋能

1.自定义注解 @GmallCache

2.通过Aop给注解赋能 注解本身啥也没有

aop:aspect oriented progarmming 面向切面编程

1.jdk代理:实现InvocationHandler接口(invoke) proxy.newProxyInstance();

基于接口实现

2.cglib代理: 实现MethodInterceptor接口(intercept) Enhancer.creat():

基于实现类实现

对通用的业务逻辑进行封装

AOP概念:

目标对象:被增强的对象

代理对象:被增强后的对象

连接点:spring仅仅支持方法级别的连接点

切点:切点都是连接点,连接点不一定是切点,就是被增强的连接点

通知:

@Before:前置通知 ,在目标方法执行之前执行

@AfterReturning :返回通知,在目标方法返回之后执行 能够获取目标方法的返回值

@AfterThrowing:异常通知,在目标方法出现异常之后执行

@After :后置通知、最终通知,5.3以后最后执行

@Around: 环绕通知,在目标方法执行前后都可以增强

1.方法必须有返回值Object类型参数

2.方法必须有ProceedingJoinPoint参数

3.方法必须抛出Throwable异常

4.必须手动执行目标方法 joinPoint.proceed(joinPoint.getArgs());来执行

环绕前-->执行前-->目标方法-->返回通知-->后置通知-->环绕后!

切面:@Aspect声明一个切面类

aop增强注解功能,

获取注解上的一些参数,就要获取方法对象

//目标方法签名
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
//获取目标方法对象
Method method = signature.getMethod();

BloomFilter:布隆过滤器,判定一个数据是否存在,牺牲精确度换去空间和时间效率的一种算法。

结构:
    一个二进制数组
    一系列的hash函数
特征:
    1.判定一个数据存在,可能不存在
    2.判定一个数据不存在,就一定不存在
    3.删除和更新困难:CountingBloomFilter(CBF)

误判率影响因子:
    1.hash函数个数:hash函数越多精确度越高,hash函数越多性能越低
    2.二进制数组长度:数组越长精确度越高,数组越长占用的内存空间越多。
    可以接受一定的误判率
    
场景:
    1.缓存穿透
    2.骚扰电话
    3.垃圾邮件
    4.爬虫程序
    
玩法:
    1.google guava工具类库 类似于lang3  单机版本
    2.Redisson :分布式版本
    3.redis插件:违背了devops

解决缓存穿透:
    1.项目启动时初始化一个布隆过滤器,并添加数据
    2.在缓存注解AOP中,使用布隆过滤器解决缓存穿透
    3.将来pms修改了mysql数据库中的分类,布隆过滤器同步数据:
        1.时效性要求较高:pms修改了分类之后发送消息给MQ,首页工程中通过监听器获取消息,重新生成一个
        2.时效性要求不高:定时任务每隔一段时间重新生成一个

你可能感兴趣的:(缓存,java,开发语言,分布式)