### 推荐学习视频
- 如对分布式锁概念不了解的可以看如下视频学习一下
- https://www.bilibili.com/video/BV1Yy4y1k79y/?spm_id_from=333.880.my_history.page.click&vd_source=ea532250a131052967c53cac567c3fad
官方网站
- https://gitee.com/kekingcn/spring-boot-klock-starter
- 详细使用请直接查看官方网站
spring-boot-klock-starter
基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring boot,和spirng mvc等spring相关项目
joolun项目使用步骤
- 服务POM引入
<dependency>
<groupId>cn.keking</groupId>
<artifactId>spring-boot-klock-starter</artifactId>
</dependency>
- nacos配置application-dev.yml文件中的klock配置,注意!!redis没有密码password就注释掉,有密码就把注释打开,否则会报错
spring:
data:
# redis 相关
redis:
host: joolun-plus-redis
port: 6379
password:
database: 3
# 分布式锁klock配置
klock:
address: redis://${spring.data.redis.host}:${spring.data.redis.port}
# 注意!!redis没有密码下面的password就注释掉,有密码就把注释打开,否则会报错
# password: ${spring.data.redis.password}
database: ${spring.data.redis.database}
- 业务代码使用案例:商城用户UserInfoServiceImpl中重写update和updateById方法,加入@klock注解
@Override
@CacheEvict(value = CacheConstants.APP_USER_INFO_CACHE, key = "#entity.getId()")
@Klock(keys = {"#entity.getId()"}, lockTimeoutStrategy = LockTimeoutStrategy.FAIL_FAST)
public boolean updateById(UserInfo entity) {
return super.updateById(entity);
}
@Override
@CacheEvict(value = CacheConstants.APP_USER_INFO_CACHE, key = "#updateWrapper.getEntity().getId()")
@Klock(keys = {"#updateWrapper.getEntity().getId()"}, lockTimeoutStrategy = LockTimeoutStrategy.FAIL_FAST)
public boolean update(Wrapper<UserInfo> updateWrapper) {
return this.update(updateWrapper);
}
joolun项目中已用到分布式锁的地方
- 支付回调接口
- UserInfo(商城用户)
- CouponInfo(电子券)
- GoodsSku(商品sku)
- SeckillInfo(秒杀商品)