zoukankan      html  css  js  c++  java
  • redis分布式锁的使用

    一  本身自带的方法进行使用:

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
    public class RedisTool {
     
        private static final String LOCK_SUCCESS = "OK";
        private static final String SET_IF_NOT_EXIST = "NX";
        private static final String SET_WITH_EXPIRE_TIME = "PX";
     
        /**
         * 尝试获取分布式锁
         * @param jedis Redis客户端
         * @param lockKey 锁
         * @param requestId 请求标识
         * @param expireTime 超期时间
         * @return 是否获取成功
         */
        public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
     
            String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
     
            if (LOCK_SUCCESS.equals(result)) {
                return true;
            }
            return false;
     
        }
     
    }
    public class RedisTool {
     
        private static final Long RELEASE_SUCCESS = 1L;
     
        /**
         * 释放分布式锁
         * @param jedis Redis客户端
         * @param lockKey 锁
         * @param requestId 请求标识
         * @return 是否释放成功
         */
        public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
     
            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
            Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
     
            if (RELEASE_SUCCESS.equals(result)) {
                return true;
            }
            return false;
     
        }
     
    }

    二:redisson使用:

    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.5.4</version>
    </dependency>
    @RestController
    public class StockController {
        @Autowired
        StockRepository stockRepository;
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        @Autowired
        RedissonClient redissonClient;
        final static String id = "1";
        @RequestMapping("/addStock")
        public void addStock() {
            RLock lock = redissonClient.getLock("redisson:lock:stock:" + id);
            for (int i = 0; i < 100; i++) {
                executorService.execute(() -> {
                    lock.lock();
                    try {
                        Stock stock = stockRepository.findOne(id);
                        stock.setNumber(stock.getNumber() + 1);
                        stockRepository.save(stock);
                    } finally {
                        lock.unlock();
                    }
                });
            }
        }
    }
    @RequestMapping("testReentrant")
    public void ReentrantLock() {
        RLock lock = redissonClient.getLock("fibonacci");
        lock.lock();
        try {
            int result = fibonacci(10);
            System.out.println(result);
        } finally {
            lock.unlock();
        }
    }
    int fibonacci(int n) {
        RLock lock = redissonClient.getLock("fibonacci");
        try {
            if (n <= 1) return n;
            else
                return fibonacci(n - 1) + fibonacci(n - 2);
        } finally {
            lock.unlock();
        }
    }
  • 相关阅读:
    Ghost博客安装
    PHP变量作用域
    ssh文件传输命令:sz与rz命令
    excel怎么固定第一行
    memcache和redis区别
    Memcache分布式部署方案
    Memcache服务器端参数说明
    Memcache基础教程
    在Windows下安装Memcached
    MySQL体系结构和存储引擎概述
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10355616.html
Copyright © 2011-2022 走看看