美文网首页工具类
redis分布式锁加锁删除

redis分布式锁加锁删除

作者: 爱吃苹果的西瓜 | 来源:发表于2019-07-31 16:23 被阅读0次

下面的分布式锁分别是利用JedisPool 和Redisson 实现的,可以选择行使用。其中方法的命名匹配的为一类,希望可以帮助大家!

package com.utils;

import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
 * @des 分布式锁,下面有两种方式实现
 * @author 719383495@qq.com
 * @date 2019/7/31 15:50
 */
@Component
public class RedisUtil {

    private static final Logger logger = LoggerFactory.getLogger(RedisUtil.class);
    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";
    private static final String DEFAULT_VALUE = "V";


    @Resource
    private JedisPool jedisPool;

    @Resource
    private Redisson redisson;


    /***
     * @desc  lock
     * @param redisKey
     * @param waitTime
     * @param timeout
     * @return
     */
    public boolean addRedisLock(String redisKey, long waitTime, long timeout) {

        RLock lock = redisson.getLock(redisKey);
        try {
//            尝试加锁,等待时间之内加锁,加锁之后timeout之间内自动解锁
            boolean result = lock.tryLock(waitTime, timeout, TimeUnit.MILLISECONDS);

            if (result) {
                return true;
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
            return false;
        }


        return false;
    }

    public void delRedisLock1(String redisKey) {
        redisson.getLock(redisKey).unlock();
    }

    public Jedis getJedis() {
        return jedisPool.getResource();
    }

    /***
     * @desc redis's set and del operation to lock
     * @param redisKey
     * @param timeout
     * @return
     */
    public boolean addRedisLock(String redisKey, long timeout) {

        try (Jedis jedis = getJedis()) {
            if ("".equals(redisKey) || null == redisKey) {
                return false;
            }
            String result = jedis.set(redisKey, DEFAULT_VALUE, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, timeout);
            if (LOCK_SUCCESS.equals(result)) {
                return true;
            }
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
        return false;
    }




    public void delRedisLock(String redisKey) {

        try {
            Jedis jedis = getJedis();
            if (!"".equals(redisKey)) {
                Long del = jedis.del(redisKey);
                logger.info("锁名:{}, 释放锁是否成功:{}", redisKey, del);
            }
        } catch (Exception e) {
            logger.info(e.getMessage());
        }
    }

}

相关文章

  • 分布式锁redis和zk的使用和比较

    一 基于redis的分布式锁 setnx 方式设置值;从而加锁; 解锁时,为了保证原子性(查询锁,判断值并删除),...

  • Redis分布式锁

    Redis分布式锁 实现 Redis 锁主要利用 Redis 的 setnx 命令。 加锁命令:SETNX key...

  • 基于Redis的分布式锁

    1.基于Redis单点的分布式锁 1.1 加锁 Redis命令 Java 版本 1.2 释放锁 Redis命令:R...

  • redis分布式锁加锁删除

    下面的分布式锁分别是利用JedisPool 和Redisson 实现的,可以选择行使用。其中方法的命名匹配的为一类...

  • redis

    1.redis 分布式锁及问题 (1)实现: 加锁:setnx、解锁:del、锁超时:expire (2)可能出现...

  • redis分布式锁(幂等性处理),lua脚本实现,java调用(

    关于redis分布式锁的理论不做赘述。 加锁 java调用方式 redis_lock.lua 解锁 java调用方...

  • 分布式锁

    分布式锁分类 mysql,redis等类cas自旋式分布式锁,应用程序询问中间件能否加锁zookeeper,etc...

  • 分布式锁

    分布式锁需要解决下面问题 互斥性 续命(比如想延长redis锁的加锁时间) 锁释放 HA一致性(比如redis主备...

  • 拜托,面试请不要再问我Redis分布式锁的实现原理!

    目录 一、写在前面 二、Redisson实现Redis分布式锁的底层原理 (1)加锁机制 (2)锁互斥机制 (3)...

  • redis锁

    redis分布式锁的实现,本质是使用setnx 【set if not exits】命令设置key,设置成功则加锁...

网友评论

    本文标题:redis分布式锁加锁删除

    本文链接:https://www.haomeiwen.com/subject/xtjtdctx.html