将下列代码缺失部分补全:
基于RedisTemplate实现保存数据并设置过期时间:
@Test
void stringTest(){
ValueOperations operations = redisTemplate.opsForValue();
//保存数据
operations.[ ]
("zy:20:id:1:name","jack");
//获取数据
Object o = operations.[ ]
("zy:20:id:1:name");
//设置过期时间
redisTemplate.[ ]
("zy:20:id:1:name",30, TimeUnit.SECONDS);
}
//这三个空怎么填
保存数据:用ValueOperations对象的set方法来保存数据。
operations.set("zy:20:id:1:name","jack");
获取数据:用ValueOperations对象的get方法来获取数据。参数是要获取的键
operations.set("zy:20:id:1:name","jack");
设置过期时间:用redisTemplate的expire方法设置键的过期时间。
redisTemplate.expire("zy:20:id:1:name", 30, TimeUnit.SECONDS);
建议学会查看源码,找对应的方法
下面给出参考:
@Test
void stringTest(){
ValueOperations operations = redisTemplate.opsForValue();
//保存数据
operations.set("zy:20:id:1:name","jack");
//获取数据
Object o = operations.get("zy:20:id:1:name");
//设置过期时间
redisTemplate.expire("zy:20:id:1:name",30, TimeUnit.SECONDS);
}
@Slf4j
@Component
public class RedisLock {
@Resource
private RedisTemplate<String, Object> redisTemplate;
private final String value = UUID.randomUUID().toString();
public boolean rLock(String key, Long time) {
boolean locked = false;
//重试次数
int tryCount = 3;
//分布式锁,失败重试
while (!locked && tryCount > 0) {
locked = redisTemplate
.opsForValue()
.setIfAbsent(key, this.value, time, TimeUnit.MINUTES);
tryCount--;
if (!locked) {
log.info("抢夺锁失败,等待重试!");
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
log.error("线程被中断" + Thread.currentThread().getId(), e);
}
}
return locked;
}
public Boolean unLock(String key) {
String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n" +
" return redis.call(\"del\",KEYS[1])\n" +
"else\n" +
" return 0\n" +
"end";
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
List<String> keys = Collections.singletonList(key);
Boolean result = redisTemplate.execute(redisScript, keys, value);
log.info("释放锁成功!" + result);
return result;
}
}
使用
@GetMapping("/lock")
public String lock() throws InterruptedException {
boolean lock = redisLock.rLock("order-xxx", 10L);
if (lock){
log.info("抢夺锁成功!执行任务!");
Thread.sleep(5000L);
boolean unLock = redisLock.unLock("order-xxx");
if (unLock){
log.info("释放锁成功!");
}
}else {
log.info("抢夺锁失败!");
}
return "分布式锁执行!";
}