【2023-1-11】try-catch的隐藏用法、redis分布式锁、Spring切面AOP

#转眼就是2023了啊,希望明年开春找工作顺利,祝大家新年快乐,发现自己认识自己热爱自己。

#又被大佬闪瞎眼,总结一下我对大佬能力的印象,那就是各种知识都能够融会贯通,理解程度超出一般人,我想了下提升方法无非是及时复习,并且在掌握一门新技术时,一定要多用多用,说起来简单,可是自己却总是偷懒,技术就是用出来的,不要害怕出现问题,保持良好的心态。

1、try-catch的隐藏用法

try、catch、finally详解,你不知道的异常处理 - YanBigFeg - 博客园

1)没有出现异常的情况:

没有走catch,执行顺序是try=>finally=>return【注意此处return出去的是try中的,其他的return不管

2)出现异常的情况: 

try发生了异常,然后没有正常返回,进入到了catch方法块:try=>catch=>finally=>return【注意此处return出去的是catch中的,其他的return不管

3)没有异常的情况下,在try和finally中对同一个对象进行修改操作

 

执行顺序是try=>finally=>return

虽然finally方法会被执行但是,返回结果不会被改变,也就是如果finally是在return之后执行的那么他会把返回结果先保存起来,然后不管finally代码执行了什么,都不会影响到返回结果,等finally执行完成在返回结果

2、redis分布式锁

redis比mysql拥有更好的处理同时间大量请求的能力

可以通过将数据存储在redis中来快速响应数据,synchronize只能用于单体的,解决分布式的多进程并发问题

redis的setnx策略

redis锁没有正常释放:加入finally代码块中/为redis锁设置过期时间

如果业务流程比较复杂,程序执行的时间超过了锁失效的时间,则会出现释放锁的代码释放的不是自己的锁,而且其它线程的锁:给每一个锁设置一个唯一value值,在释放锁的时候判断一下释放的锁是否是自己的锁

通过引入reddision解决多进程并发问题

3、Spring切面AOP复习(又忘了。。。想4)

细说Spring——AOP详解(AOP概览)_Jivan2233的博客-CSDN博客_spring aop织入在什么时间完成

面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式_小样5411的博客-CSDN博客_ioc和aop

https://tudan.blog.csdn.net/article/details/114695437?spm=1001.2014.3001.5506

AOP的引入方式主要有两种:xml配置文件(了解)和注解

注解又分为两种方式:批量添加(不用在相关接口上再添加注解,直接在)+自定义

切点+通知增强=切面

注解的格式:

1)@通知类型(execution(需要切面管理的文件地址))

2)@通知类型(value = “@annotation(自定义注解)”)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Spring Redis实现Redis分布式锁的例子: 首先,在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 然后,创建一个Redis分布式锁的接口: ```java public interface RedisLock { /** * 获取锁 * * @param key 锁的key * @param expireTime 锁的过期时间 * @return 是否获取成功 */ boolean lock(String key, long expireTime); /** * 释放锁 * * @param key 锁的key */ void unlock(String key); } ``` 接着,实现Redis分布式锁的接口: ```java @Component public class RedisLockImpl implements RedisLock { private final RedisTemplate<String, String> redisTemplate; private final ThreadLocal<Map<String, Integer>> lockers = new ThreadLocal<>(); @Autowired public RedisLockImpl(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } @Override public boolean lock(String key, long expireTime) { Map<String, Integer> localLockers = getLocalLockers(); Integer count = localLockers.get(key); if (count != null) { localLockers.put(key, count + 1); return true; } Boolean result = redisTemplate.opsForValue().setIfAbsent(key, ""); if (!result) { return false; } redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS); localLockers.put(key, 1); return true; } @Override public void unlock(String key) { Map<String, Integer> localLockers = getLocalLockers(); Integer count = localLockers.get(key); if (count == null) { return; } if (count > 1) { localLockers.put(key, count - 1); } else { localLockers.remove(key); redisTemplate.delete(key); } } private Map<String, Integer> getLocalLockers() { Map<String, Integer> localLockers = lockers.get(); if (localLockers != null) { return localLockers; } lockers.set(new HashMap<>()); return lockers.get(); } } ``` 最后,在需要使用分布式锁的地方,注入RedisLock接口,使用lock()方法获取锁,使用unlock()方法释放锁: ```java @Service public class UserService { private final RedisLock redisLock; @Autowired public UserService(RedisLock redisLock) { this.redisLock = redisLock; } public void updateUser(String userId) { String lockKey = "user_" + userId; boolean locked = redisLock.lock(lockKey, 5000); if (!locked) { throw new RuntimeException("获取锁失败"); } try { // 更新用户信息 } finally { redisLock.unlock(lockKey); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值