redis 분산 잠 금
34970 단어 자바비 관계 형 데이터베이스redisredisson
redisson 과 다음 두 가지 방식 의 차이 점(장면):
4.567917.다른 두 가지 방식 은 자 물 쇠 를 얻 지 못 하면 포기 하고 업무 코드 를 실행 하지 않 습 니 다
<dependency>
<groupId>org.redissongroupId>
<artifactId>redisson-spring-boot-starterartifactId>
<version>3.13.6version>
dependency>
@Autowired
private Redisson redisson;
@GetMapping("/redissonLock")
public String redissonLock() {
log.info(" ");
RLock lock = redisson.getLock("redissonLock");
try {
lock.lock(30, TimeUnit.SECONDS);
Thread.sleep(10000);
System.out.println(" ");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return " ";
}
RedisTemplate 패키지 redis 자물쇠(1)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
package com.util;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.core.types.Expiration;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
public class RedisLock {
private static RedisTemplate redisTemplate;
private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then
" +
"\treturn redis.call(\"del\",KEYS[1])
" +
"else
" +
" \treturn 0\t
" +
"end ";
public RedisLock(RedisTemplate redisTemplate) {
RedisLock.redisTemplate = redisTemplate;
}
public static Boolean getLock(String key, String value, Long expireTime) {
RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
Expiration expiration = Expiration.seconds(expireTime);
RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
}
};
return (Boolean) redisTemplate.execute(booleanRedisCallback);
}
public static Boolean unLock(String key, String value) {
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
}
}
@GetMapping("/redisLock")
public String redisLock() {
log.info(" ");
String key = "redisLock";
String uuid = UUID.randomUUID().toString();
try {
if (RedisLock.getLock(key, uuid, 30L)) {
log.info(" ");
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
RedisLock.unLock(key, uuid);
}
log.info(" ");
return " ";
}
RedisTemplate 패키지 redis 자물쇠(2)
package com.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisStringCommands;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.core.types.Expiration;
import java.util.Arrays;
import java.util.UUID;
@Slf4j
public class HighRedisLock implements AutoCloseable{
private RedisTemplate redisTemplate;
private String key;
private String value;
private Long expireTime;
private static String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then
" +
"\treturn redis.call(\"del\",KEYS[1])
" +
"else
" +
" \treturn 0\t
" +
"end ";
public HighRedisLock(RedisTemplate redisTemplate, String key, Long expireTime) {
this.redisTemplate = redisTemplate;
this.key = key;
this.value = UUID.randomUUID().toString();
this.expireTime = expireTime;
}
public Boolean getLock() {
RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
Expiration expiration = Expiration.seconds(expireTime);
RedisCallback<Boolean> booleanRedisCallback = new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
return connection.set(redisTemplate.getKeySerializer().serialize(key), redisTemplate.getValueSerializer().serialize(value), expiration, setOption);
}
};
return (Boolean) redisTemplate.execute(booleanRedisCallback);
}
public Boolean unLock() {
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
return (Boolean) redisTemplate.execute(redisScript, Arrays.asList(key), value);
}
@Override
public void close() throws Exception {
unLock();
}
}
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/highRedisLock")
public String highRedisLock() {
log.info(" ");
try (HighRedisLock redisLock = new HighRedisLock(redisTemplate, "highRedisLock", 30L)) {
if (redisLock.getLock()) {
log.info(" ");
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
log.info(" ");
return " ";
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.