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);
}
}
-