• 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();
        }
    }
  • 相关阅读:
    Datastage 调度相关 dsjob
    DropdownList内容树状展示 字段前空格不显示
    IE兼容低版本设置
    跑数速度慢,修改参数
    cognos samples 安装配置【转】
    在子窗口中操作父窗口(刷新)
    html长文本自动换行
    Asp.net禁止缓存
    【Range Lookup】 根据年龄 求年龄分段ID
    目标表已有对应数据则不插入
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10355616.html
Copyright © 2020-2023  润新知