1. 幂等性
幂等性的含义是一个用户对一个操作发起的一次或多次请求的结果是一致的。
下面是2个例子,创建订单和校验订单的时候,一段时间的请求的响应是一致的,并且只创建了一个订单。
2.创建订单
流程图:
样例代码:
Redis操作工具类:
public class RedissonUtil {
private static RedissonUtil redissonUtil = new RedissonUtil();
private static RedissonClient client = init();
private RedissonUtil(){}
private static RedissonClient init(){
for(int i = 0; i < 3; i++){
Config config = new Config();
config.useSingleServer().setAddress("redis://107.150.98.45:7777")
.setPassword("morlia123")
.setConnectionMinimumIdleSize(10);
try{
RedissonClient client = Redisson.create(config);
//不抛异常,就说明创建成功
return client;
}catch (Exception e){
System.out.println(e);
}
}
return null;
}
/**
* 获取分布式锁,分布式锁的key值会自动加_lock后缀
* @param key 原生key值
* @param millis 超时时间,必选
* @return 是否获取锁
*/
public boolean getLock(String key, long millis){
millis = millis <= 0 ? 2000:millis;
String lockKey = key + "_lock";
RBucket<String> keyObject = client.getBucket(lockKey);
return keyObject.trySet(lockKey,millis, TimeUnit.MILLISECONDS);
}
/**
* 释放掉lock锁
* @param key 原始key值
* @return 是否成功
*/
public boolean releaseLock(String key){
String lockKey = key + "_lock";
RBucket<String> keyObject = client.getBucket(lockKey);
return keyObject.delete();
}
public String getValue(String key){
RBucket<String> keyObject = client.getBucket(key);
return keyObject.get();
}
public void setValue(String key, String value, long millis){
RBucket<String> keyObject = client.getBucket(key);
keyObject.set(value, millis, TimeUnit.MILLISECONDS);
}
public boolean delValue(String key){
RBucket<String> keyObject = client.getBucket(key);
return keyObject.delete();
}
/**
* 设置单例模式
* 为了统一判定是否初始化成功
* @return redissonUtil 对象
*/
public static RedissonUtil getInstance(){
//这边只是简单处理
while(null == client){}
return redissonUtil;
}
}
创建订单流程主类
public static void main(String[] args){
RedissonUtil util = RedissonUtil.getInstance();
String createKey = "create_test_key";
String createValue = "create_test_value";
System.out.println("--------------------------------------创建流程开始------------------------------------------");
//每300毫秒发送1次请求,模拟重复请求
IntStream.range(0,10).forEach(i -> {
new Thread(() ->{
String value = util.getValue(createKey);
if(null != value){
System.out.println("====================="
+ Thread.currentThread().getName()
+"重复请求,直接返回结果:"
+ value
+ "============&#