分布式锁工具类

package com.guangxun.car.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**

  • @Date: 2019/1/22 15:02

  • @Description:Redis服务操作接口
    */
    @Service
    public class RedisService {

    @Autowired
    @Qualifier(value = “redisTemplate”)
    private RedisTemplate redisTemplate;

    private static final Long LOCK_SUCCESS = 1L;

    private static final String SET_IF_NOT_EXIST = “NX”;

    private static final String SET_WITH_EXPIRE_TIME = “PX”;

    private static final Long RELEASE_SUCCESS = 1L;

    /**

    • 尝试获取分布式锁

    • @param lockKey 锁

    • @param requestId 请求标识

    • @param expireTime 超期时间

    • @param retryIntervalTimeMillis 重试周期

    • @return 是否获取成功
      */
      public boolean tryGetDistributedLock(String lockKey, String requestId, int expireTime, int retryIntervalTimeMillis) {

      String script = “if redis.call(‘setnx’,KEYS[1],ARGV[1]) == 1 then return redis.call(‘expire’,KEYS[1],ARGV[2]) else return 0 end”;
      Object result = redisTemplate.execute(RedisScript.of(script, Long.class), Collections.singletonList(lockKey), requestId, TimeUnit.MILLISECONDS.toSeconds(expireTime));

      if(LOCK_SUCCESS.equals(result)){
      return true;
      }else{
      try {
      Thread.sleep(retryIntervalTimeMillis);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      //递归调用,直到获取到锁为止
      return tryGetDistributedLock(lockKey, requestId, expireTime, retryIntervalTimeMillis);
      }
      }

    /**

    • 释放分布式锁

    • @param lockKey 锁

    • @param requestId 请求标识

    • @return 是否释放成功
      */
      public boolean releaseDistributedLock(String lockKey, String requestId) {

      String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then redis.call(‘del’, KEYS[1]) return 1 else return 0 end”;

      Long result = (Long) redisTemplate.execute(RedisScript.of(script, Long.class), Collections.singletonList(lockKey), requestId);
      return result != null && result > 0;
      }

    /**

    • 判断key是否存在
    • @param key
    • @return
      */
      public boolean existsKey(String key) {
      return redisTemplate.hasKey(key);
      }

    /**

    • 重名名key,如果newKey已经存在,则newKey的原值被覆盖
    • @param oldKey
    • @param newKey
      */
      public void renameKey(String oldKey, String newKey) {
      redisTemplate.rename(oldKey, newKey);
      }

    /**

    • newKey不存在时才重命名
    • @param oldKey
    • @param newKey
    • @return 修改成功返回true
      */
      public boolean renameKeyNotExist(String oldKey, String newKey) {
      return redisTemplate.renameIfAbsent(oldKey, newKey);
      }

    /**

    • 删除key
    • @param key
      */
      public void deleteKey(String key) {
      redisTemplate.delete(key);
      }

    /**

    • 删除多个key
    • @param keys
      */
      public void deleteKey(String… keys) {
      Set kSet = Stream.of(keys).map(k -> k).collect(Collectors.toSet());
      redisTemplate.delete(kSet);
      }

    /**

    • 删除Key的集合
    • @param keys
      */
      public void deleteKey(Collection keys) {
      Set kSet = keys.stream().map(k -> k).collect(Collectors.toSet());
      redisTemplate.delete(kSet);
      }

    /**

    • 设置key的生命周期
    • @param key
    • @param time
    • @param timeUnit
      */
      public void expireKey(String key, long time, TimeUnit timeUnit) {
      redisTemplate.expire(key, time, timeUnit);
      }

    /**

    • 指定key在指定的日期过期
    • @param key
    • @param date
      */
      public void expireKeyAt(String key, Date date) {
      redisTemplate.expireAt(key, date);
      }

    /**

    • 查询key的生命周期
    • @param key
    • @param timeUnit
    • @return
      */
      public long getKeyExpire(String key, TimeUnit timeUnit) {
      return redisTemplate.getExpire(key, timeUnit);
      }

    /**

    • 将key设置为永久有效
    • @param key
      */
      public void persistKey(String key) {
      redisTemplate.persist(key);
      }
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值