springboot整合redisson实现商品详情缓存的分布式锁
1.首先加入依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<-- <version>3.3.2</version> 此版本不支持netty高版本,用以下版本-->
<version>3.9.1</version>
</dependency>
配置类:
package com.maipu.xmall;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @title:
* @description:
* @author: Asing
* @date: 2020-04-14 12:23:09
*/
@Configuration
public class RedissonCofig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedissonClient getRedisson(){
Config config = new Config();
config.useSingleServer().setAddress("redis://"+host+":"+port);
RedissonClient redisson=Redisson.create(config);
return redisson;
}
}
引入实现类:
@Autowired
private RedissonClient redissonClient;
开始实现功能:
@Override
public PmsSkuInfo getSkuInfo(Long id) {
Jedis jedis = redisUtil.getJedis();
String key = "sku:" + id + ":info";
String skuJson = jedis.get(key);
PmsSkuInfo skuInfoFromDB;
if (StringUtil.isNotEmpty(skuJson)) {
PmsSkuInfo pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
jedis.close();
return pmsSkuInfo;
} else {
//生成分布式锁
RLock lock = redissonClient.getLock("sku:" + id + ":lock");
lock.lock();
skuInfoFromDB = getSkuInfoFromDB(id);
if (skuInfoFromDB != null) {
jedis.set(key, JSON.toJSONString(skuInfoFromDB));
} else {
//防止缓存穿透设置此key的缓存,数值为空,过期时间3分钟,三分钟之内无法访问mysql
jedis.setex(key, 60 * 3, "");
}
lock.unlock();
}
jedis.close();
return skuInfoFromDB;
}
总结:完成缓存和锁之后,服务更加安全,可防止一般恶意攻击,数据库压力变小。