话不多说,封装的逻辑已经在注释中写的很清晰了 。
将切面也放入自动配置spring.factories中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.itdl.lock.config.RedisLockConfig,com.itdl.lock.anno.RedisLockAop
测试注解版分布式锁
@RedisLock(lockName = "demo4_lock")public TestEntity getById4(Long id) throws InterruptedException {index++;log.info("current index is : {}", index);Thread.sleep(new Random().nextInt(10) * 100);TestEntity testEntity = new TestEntity(new Random().nextLong(), UUID.randomUUID().toString(), new Random().nextInt(20) + 10);log.info("模拟查询数据库:{}", testEntity);return testEntity;}
可以看到,我们就是一个注解分布式锁的效果,而分布式锁与缓存注解通常不会一起使用,因为一般会在存在事务问题的地方我们会使用锁,在多个JMV操作同一条数据做写操作时需要加分布式锁 。
编写测试程序
@SpringBootTestpublic class TestRedisLockRunner6 {@Autowiredprivate MyTestService myTestService;// 创建一个固定线程池private ExecutorService executorService = Executors.newFixedThreadPool(16);/*** 多线程访问请求,测试切面的线程安全性*/@Testpublic void testMultiMyTestService() throws InterruptedException {for (int i = 0; i < 100; i++) {executorService.submit(() -> {try {TestEntity t1 = myTestService.getById4(1L);} catch (InterruptedException e) {e.printStackTrace();}});}// 主线程休息10秒种Thread.sleep(60000);}}
测试结果
文章插图
5、小结我们将分布式锁基于缓存扩展了一版,也就是说本starter即有分布式缓存功能,又有分布式锁功能 。
而注解版的分布式锁能够解决大多数场景的并核问题,小粒度的Lock锁方式补全其他场景 。
【Springboot+Redisson封装分布式锁Starter】将两者封装成为一个starter,我们就可以很方便的使用分布式锁功能,引入相关包即可,开箱即用 。
推荐阅读
- EasyNetQ库:让你的分布式系统消息开发快人一步!
- Kubernetes 微内核的分布式操作系统
- Seata Stellar:无缝整合不同框架的分布式事务解决方案
- 智能体的「一方有难八方支援」,一种分布式AI计算新范式诞生了
- 清华发布SmartMoE:一键实现高性能MoE稀疏大模型分布式训练
- 分布式系统中的CAP理论
- 四种分布式限流算法实现!
- 分布式基础理论 CAP & BASE
- App在线封装容易吗?是什么原理?
- 再聊聊分布式数据库,你知道了吗?