目录
Redis实现分布式锁
原理
Redis中有这么个东西(key:k1 value:v1),k1这个key就是判断的锁
当线程进来访问时,判断redis中是否有k1,如果没有,就设置k1然后访问资源,操作,此时另一个线程过来再次获取是否存在k1,当然此时k1肯定是存在的,所以该线程不能访问锁的资源,需要等待或者重新访问。
当访问的线程访问完之后要释放k1也就是删除k1。
测试代码
package com.shao.seckill;
import com.shao.seckill.utils.UUIDUtil;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.script.RedisScript;
import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class SeckillApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private RedisScript<Boolean> script;
@Test
void contextLoads() {
ValueOperations valueOperations = redisTemplate.opsForValue();
//占位,如果key不存在才可以设置成功返回true
Boolean isLock = valueOperations.setIfAbsent("k1", "v1");
//如果占位成功,进行正常操作
if(isLock){
//操作
valueOperations.set("name","xxxx");
String name = (String) valueOperations.get("name");
System.out.println(name);
//操作完之后删除锁,让其它线程能够使用
redisTemplate.delete("k1");
}else{
System.out.println("有线程在使用,请稍后尝试");
}
}
}
测试结果
可以正常锁和解锁资源
问题
看似没有问题其实有很大