引出
Redis的应用——接口幂等性,分布式锁,基于注解+拦截器的接口幂等改进
接口幂等&分布式锁
系统的问题:
接口的幂等性:接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;
@RestController
@RequestMapping("/order")
public class OrderController {
private final RedisTemplate redisTemplate;
public OrderController(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@PostMapping("/make")
public String makeOrder(OrderDto orderDto){
if(redisTemplate.hasKey("ORDER_" + orderDto.getOrderNum())){
return "请求已经处理,请勿重复提交!";
}
//setnx key value 做到:判断key是否存在,如果key则不能加入到redis中去,称为:redis的分布式锁
redisTemplate.opsForValue().setIfAbsent("ORDER_" + orderDto.getOrderNum(), "",10, TimeUnit.MINUTES);
//调用业务层:完成订单的创建
System.out.println("orderDto = " + orderDto);
return "ok";
}
}
接口幂等性
if(redisTemplate.hasKey("ORDER_" + orderDto.getOrderNum())){
return "请求已经处理,请勿重复提交!";
}
redis的分布锁,缺陷:业务如果超出了上锁的时间,可能会导致数据不准确
Redisson框架
Redisson框架:它是Redis的封装框架,提供了Redis的所有操作
<!--引入redis的封装框架redission-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.10.0</version>
</dependency>
添加配置类:
@Configuration
public class RedissonConfig {
@Autowired
private Environment env;
//解决redission 和 Springcache的兼容问题
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.