1. 流程示意图
2. 示例程序
2.1 程序主体
private static String lockTest(String orderId, Jedis jedis) {
//写入防重Key
long result = jedis.setnx("union_" + orderId, "1");
// 1 第一次请求
if (result == 1) {
//正常处理
try {
String dealResult = "";
System.out.println("正常处理过程");
dealResult = "处理结果:{X:XXXXXXX}";
//处理完成,处理结果写入Redis
jedis.set("result_" + orderId, dealResult);
System.out.println("返回正常结果");
return dealResult;
} catch (Exception e) {
//异常情况,删除防重Key
jedis.del("union_" + orderId);
throw new RuntimeException("异常,请重试");
}
} else {//重复请求
//返回上次请求结果
System.out.println("返回幂等取结果");
return jedis.get("result_" + orderId);
}
}
2.2 测试程序
public static void main(String[] args) {
String orderId = "order123456";
Jedis jedis = new Jedis("127.0.0.1", 6379);
//删除之前测试结果
jedis.del("union_" + orderId);
jedis.del("result_" + orderId);
System.out.println(lockTest(orderId, jedis));
System.out.println(lockTest(orderId, jedis));
}
2.3 执行结果
第一次返回的是正常处理结果,第二次幂等性返回的第一次处理结果。
正常处理过程
返回正常结果
处理结果:{X:XXXXXXX}
返回幂等取结果
处理结果:{X:XXXXXXX}