RedisTemplate 분산 식 잠 금 사용 데 몬 스 레 드 키 로 수명 연장

1.수호 스 레 드 를 잘 알 고 원칙:스 레 드 생 성,수호 스 레 드 생 성;수호 랜 덤 생 성 라인,생사 랜 덤;테스트 코드 는 다음 과 같 습 니 다.
public static void main(String[] args) {
        //demo     
        Integer count = 3;
        while (count-- > 0) {
            if (count == 2) {
                Thread testThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Thread thread = Thread.currentThread();
                        Thread demoThread = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                int countOfDemo = 0;
                                while (true) {
                                    System.out.println("      ,     " + (++countOfDemo));
                                    try {
                                        Thread.sleep(1000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }, "    ");
                        demoThread.setDaemon(true);
                        demoThread.start();
                        int counts = 10;
                        while (counts-- >=0){
                            System.out.println(Thread.currentThread().getName()+ " is alive");
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                },count.toString());
                testThread.start();
            } else {
                Thread testThread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("      , " + Thread.currentThread().getName());
                        int counts = 5;
                        while (counts-- >=0){
                            System.out.println(Thread.currentThread().getName()+ " is alive");
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                },count.toString());
                testThread.start();
            }
        }
    }

테스트 결 과 는 다음 과 같다.

      , 1
      ,     1
1 is alive
      , 0
0 is alive
2 is alive
      ,     2
0 is alive
1 is alive
2 is alive
      ,     3
0 is alive
1 is alive
2 is alive
      ,     4
1 is alive
0 is alive
2 is alive
      ,     5
0 is alive
1 is alive
      ,     6
2 is alive
1 is alive
0 is alive
2 is alive
      ,     7
2 is alive
      ,     8
2 is alive
      ,     9
2 is alive
      ,     10
2 is alive
      ,     11
      ,     12

Process finished with exit code 0

2.redis 명령 을 계속 하고 코드 를 직접 올 리 며 RedisCluster 와 Jedis 패 키 지 를 사용 하여 실현 하 는 방식 이 유사 하 므 로 불필요 하 게 쓰 지 않 습 니 다.(이 가능 하 다,~할 수 있다,...
public Boolean tryLock(String key, String value, long expireTime) {
        try {
            //    
            int waitCount = timeout;
            while (waitCount > 0) {
                //SET    OK ,        
                Boolean setIfAbsent = redisTemplate.opsForValue().setIfAbsent(key, value, expireTime, TimeUnit.SECONDS);
                if (setIfAbsent) {
                    //  
                    Thread demo = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            while (true) {
                                Boolean expire = redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
//         key,      
                                if(!expire){
                                    return;
                                }
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                    demo.setDaemon(true);
                    demo.start();
                    return true;
                }
                //      , timeout         ,     
                Thread.sleep(3000);
                waitCount--;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {

        }
        //     ,      
        return false;
    }

unlock
    private static final String UNLOCK_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";   
 public synchronized Boolean unlock(String key, String value) {
        logger.info("release object " + Thread.currentThread().getName());
        if (value != null) {
            //     value    。              , JSon    
            value = "\"" + value + "\"";
        }
        DefaultRedisScript redisScript = new DefaultRedisScript<>(UNLOCK_SCRIPT, Long.class);
        Object result = redisTemplate.execute(redisScript, Collections.singletonList(key), value);
        return Objects.equals(result, SUCCESS);
    }

좋은 웹페이지 즐겨찾기