Distributed Lock

前言

分布式鎖應用場景相當廣,利用redis, RDB(mysql, oracle ...), ZK等來達成的例子所在多有。

Spring Integration 提供了一個可切換的分布式鎖機制,可以避免大家自行重新開發。

使用Redis主要是因為效率高,其他類型的效率慢上好幾個等級,當然如果是應用在早期的系統,使用mysql也是方便的選擇。

準備

Dependencies

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.integration</groupId>
	<artifactId>spring-integration-redis</artifactId>
</dependency>

需要加入上列的libraries

configuration

@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
	return new RedisLockRegistry(redisConnectionFactory, "eckey");
}

配合Redis,使用RedisLockRegistry

Sample

	@GetMapping(path = "/lock")
	public String lockAndDo() {
		/*
		1. Obtain
		2. TryLock
		3. Unlock
		 */
		String lockKey = "SKU_2020_NIKE_AJ_M_BlUE_9";
		log.info("Try to get Lock with key[{}]", lockKey);
		Lock lock = redisLockRegistry.obtain(lockKey);

		try {
			boolean lockStatus = lock.tryLock(10, TimeUnit.SECONDS);
			log.info("Lock with key[{}] is [{}]", lockKey, lockStatus);

			if (lockStatus) {
				try {
					/*
					Do our process here
			 		*/
					// pretend to be busy.
					TimeUnit.SECONDS.sleep(5);
				} finally {
					log.info("Unlock key[{}] success!", lockKey);
					lock.unlock();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "Finish";
	}

簡單4步驟

  1. 決定要鎖的key,像是SKU
  2. Obtain Lock
  3. Try to Lock
  4. Unlock

與Sample一樣,就能為系統增加分布鎖的功能。

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料