Redis实现锁和幂等性

486 阅读1分钟

1. 流程示意图

image-20220726111536269

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}