书接上回,上一篇博客里了解了缓存击穿的问题,其中解决的一个办法就是给缓存重建部分加互斥锁,此处我们不是使用Java中的synchronized,而是通过redis中String类型里的setnx来实现一个互斥锁,setnx命令是指插入一个键值对,如果存在则失败,如果不存在则成功
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;
/**
* 通过redis实现互斥锁
*/
public class LockByRedis {
@Autowired
private static StringRedisTemplate redisTemplate;
/**
* 通过setNx实现互斥锁,加锁过程即为增加key
* @param key
* @return
*/
public static boolean tryLock(String key) {
Boolean flag = redisTemplate.opsForValue().setIfAbsent(key,"1",10, TimeUnit.SECONDS);
return flag;
}
/**
* 释放锁:删除加锁过程存入的key即可
* @param key
*/
public static void unlock(String key) {
redisTemplate.delete(key);
}
}