redis 분산 잠 금

Redisson
redisson 과 다음 두 가지 방식 의 차이 점(장면):
  • 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 "    ";
    }
    

    좋은 웹페이지 즐겨찾기