spring的aop
springboot4:
try {
环绕前代码
前通知
逻辑代码
环绕后代码
后通知
返回通知
}catch (Exception e){
后通知
异常通知
}
执行顺序: 正常情况下 环绕通知前代码, 前置通知, 环绕通知后代码, 后置通知, 返回通知
执行顺序: 异常情况下 环绕通知前代码, 前置通知, 后置通知, 异常通知
springboot5:
环绕前代码
try {
前通知
逻辑代码
返回通知
}catch (Exception e){
异常通知
}finally(){
后通知
}
环绕后代码
执行顺序: 正常情况下 环绕通知前代码, 前置通知, 返回通知, 后置通知, 环绕通知后代码
执行顺序: 异常情况下 环绕通知前代码, 前置通知, 异常通知, 后置通知,环绕通知后代码
循环引用:
在实际 项目中 禁止同层类注入同层对象作为属性;
循环引用可以使用set方式注入 对象可以解决;
spring内部是通过三级缓存解决循环依赖的.默认情况下 singleton的模式已经解决了循环依赖的问题. 一级依赖 singletonObjects 二级依赖 earlySingletonObject 三级依赖 singletonFactories
spring内部借助map实现 一级\二级\三级缓存 类似 google.guava 借助map实现缓存
spring处理循环引用的过程如下:
redis数据结构以及应用场景:
string: 点赞 和 点踩 数量的统计可以放到redis 某个城市 正在进行中的活动id 可以放到redis中
hash: 购物车可以使用两个 hash 进行存储 一个hash field对应的值存 商品信息和加入时间,另一个hash field对应的值存 商品数量;
list: 晒单分享存储 分享红包领取用户的用户id; 玩吧工作 用户关注某个用户之后其发布的动态信息会使用消息队列同步到redis 的list中;关注的人,拉黑的人
set:没有顺序并且不重复; 抽奖 逻辑可以使用set; srandmember key 人抽奖品; spop 奖品抽人 用户id 放到set中;
zset(sorted set): 各种排名可以使用
redis分布式锁: 设置分布式锁的key的过期时间一定要 和创建对象是原子性的操作,使用原子性的命令;redis 分布式锁删除的时候一定要使用 lua语言保证原子性. redisson 可以方便的实现分布式锁; 步骤: 1 注入redisson 2 获取RLock对象 RLock 3 加锁 4 在finally中释放锁
redis的key淘汰策略 有两个维度 四个方式. 设置过期时间的键\所有键 lru random lfu 设置过期时间(ttl); redis的淘汰方式: 定时(cpu占用大)\定期(折中)\惰性(内存占用大)