Java實現(xiàn)開箱即用的redis分布式鎖
項目簡介
lock 為 java 設(shè)計的分布式鎖,開箱即用,縱享絲滑。
開源地址:https://github.com/houbb/lock
目的
- 開箱即用,支持注解式和過程式調(diào)用
- 基于 redis 的分布式鎖
- 內(nèi)置支持多種 redis 的整合方式
- 漸進式設(shè)計,可獨立于 spring 使用
- 整合 spring
- 整合 spring-boot
快速開始
需要
jdk1.7+
maven 3.x+
maven 引入
<dependency> <groupId>com.github.houbb</groupId> <artifactId>lock-core</artifactId> <version>1.3.0</version> </dependency>
入門例子
基于本地 redis 的測試案例。
public void helloTest() { ILock lock = LockBs.newInstance(); String key = "ddd"; try { // 加鎖 lock.tryLock(key); System.out.println("業(yè)務(wù)處理"); } catch (Exception e) { throw new RuntimeException(e); } finally { // 釋放鎖 lock.unlock(key); } }
配置化
為了便于拓展,LockBs 的配置支持自定義:
LockBs.newInstance() .id(Ids.uuid32()) //id 生成策略 .cache(JedisRedisServiceFactory.pooled("127.0.0.1", 6379)) //緩存策略 .lockSupport(new RedisLockSupport()) // 鎖實現(xiàn)策略 .lockKeyFormat(new LockKeyFormat()) // 針對 key 的格式化處理策略 .lockReleaseFailHandler(new LockReleaseFailHandler()) //釋放鎖失敗處理 ;
整合 spring
maven 引入
<dependency> <groupId>com.github.houbb</groupId> <artifactId>lock-spring</artifactId> <version>1.3.0</version> </dependency>
指定 bean 使用
啟用分布式鎖
@EnableLock
啟用分布式鎖。
@EnableRedisConfig
啟用 redis 的默認配置。
@Configurable @ComponentScan(basePackages = "com.github.houbb.lock.test.service") @EnableLock @EnableRedisConfig public class SpringConfig { }
EnableLock
注解說明,和引導(dǎo)類對應(yīng):
public @interface EnableLock { /** * 唯一標(biāo)識生成策略 * @return 結(jié)果 */ String id() default "lockId"; /** * 緩存實現(xiàn)策略 bean 名稱 * * 默認引入 redis-config 中的配置 * * @return 實現(xiàn) */ String cache() default "springRedisService"; /** * 加鎖 key 格式化策略 * @return 策略 */ String lockKeyFormat() default "lockKeyFormat"; /** * 鎖釋放失敗處理類 * @return 結(jié)果 */ String lockReleaseFailHandler() default "lockReleaseFailHandler"; }
其中 springRedisService
使用的是 redis-config 中的實現(xiàn)。
對應(yīng)注解 @EnableRedisConfig
,redis 的配置信息如下:
配置 | 說明 | 默認值 |
---|---|---|
redis.address | redis 地址 | 127.0.0.1 |
redis.port | redis 端口 | 6379 |
redis.password | redis 密碼 |
使用 LockBs
我們可以直接 LockBs
的引導(dǎo)類,這種適合一些更加靈活的場景。
@ContextConfiguration(classes = SpringConfig.class) @RunWith(SpringJUnit4ClassRunner.class) public class SpringServiceRawTest { @Autowired private UserService userService; @Autowired private LockBs lockBs; @Test public void queryLogTest() { final String key = "name"; try { lockBs.tryLock(key); final String value = userService.rawUserName(1L); } catch (Exception exception) { throw new RuntimeException(exception); } finally { lockBs.unlock(key); } } }
aop 注解使用
指定方法注解
當(dāng)然,我們可以在方法上直接指定注解 @Lock
,使用更加方便。
直接使用,AOP 切面生效即可。
@Service public class UserService { @Lock public String queryUserName(Long userId) { } @Lock(value = "#user.name") public void queryUserName2(User user) { } }
@Lock
屬性說明,value 用于指定 key,支持 SPEL 表達式。
其他屬性,和引導(dǎo)類的方法參數(shù)一一對應(yīng)。
public @interface Lock { /** * 緩存的 key 策略,支持 SpEL * @return 結(jié)果 */ String value() default ""; /** * 時間單位 * @return 單位 */ TimeUnit timeUnit() default TimeUnit.SECONDS; /** * 等待鎖時間 * @return 等待鎖時間 */ long waitLockTime() default 10; /** * 業(yè)務(wù)加鎖時間 * @return 加鎖時間 */ long lockTime() default 60; }
spring boot 整合
maven 引入
<dependency> <groupId>com.github.houbb</groupId> <artifactId>lock-springboot-starter</artifactId> <version>1.3.0</version> </dependency>
使用
同 spring
后期 Road-MAP
支持鎖的可重入
持有鎖的線程可以多次獲取鎖
分布式鎖注解支持
以上就是Java實現(xiàn)開箱即用的redis分布式鎖的詳細內(nèi)容,更多關(guān)于Java redis分布式鎖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析如何在SpringBoot中實現(xiàn)數(shù)據(jù)脫敏
脫敏是指在不改變原數(shù)據(jù)結(jié)構(gòu)的前提下,通過某種方式處理數(shù)據(jù),使數(shù)據(jù)不能直接暴露用戶的真實信息,下面我們就來看看SpringBoot中實現(xiàn)數(shù)據(jù)脫敏的具體方法吧2024-03-03Java 圖解Spring啟動時的后置處理器工作流程是怎樣的
spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期2021-10-10SpringBoot使用Sa-Token實現(xiàn)路徑攔截和特定接口放行
這篇文章主要介紹了SpringBoot使用Sa-Token實現(xiàn)路徑攔截和特定接口放行,文中通過代碼示例講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06

Java的作業(yè)調(diào)度類庫Quartz基本使用指南

Spring boot2.x中集成H2數(shù)據(jù)庫代碼實例