幂等性

本文聚焦于幂等性使用场景,为避免动作重复提交导致数据不准确,介绍了使用Redis实现幂等性功能。还包含小场景流程图、Maven依赖以及相关Demo。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

幂等性的使用的场景是为了避免一个动作重复提交,可能会造成数据不准确。本文使用redis来实现幂等性功能。

小场景流程图:

 

maven依赖

 <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

demo

/**
 * 幂等性
 */
public class Idempotent {
    private static Jedis jedis;
    private static final String LUASCRIPT = "if redis.call('get', KEYS[1]) == nil then return 0 else  return redis.call('del', KEYS[1]) end";
    private static final String IDEMPOTENT_KEY = "idempotent_";
    public static void main(String[] args) {
        jedis = new Jedis("121.4.39.102",6379);
        //生成订单token
        String token = createToken();
        //再请求支付,避免重复支付
        checkToken(token);
    }

    private static void checkToken(String token) {
        try {
            //需要保持原子性。所以用到了lua脚本去执行
            long result = (long) jedis.eval(LUASCRIPT, Arrays.asList(IDEMPOTENT_KEY+token),new ArrayList<>());
            if (result == 1){//执行业务
                System.out.println("开始执行业务");
            }
        } catch (Exception e) {
            //出现异常必须将缓存设置回来
            jedis.setex(IDEMPOTENT_KEY+token,2 * 60,"1");
            System.out.println(e.getMessage());
        }
    }

    private static String createToken() {
        String token = UUID.randomUUID().toString();
        jedis.setex(IDEMPOTENT_KEY+token,15 * 60,"1");
        return token;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YaYicho

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值