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.时效性要求不高:定时任务每隔一段时间重新生成一个