Redis高并发--解决重复提交执行

5 篇文章 0 订阅

方法1(针对所有用户,只要被锁,所有用户都无法进入)

<?php
/*同一时间调用同一方法*/
//参考文档:[https://www.cnblogs.com/fengff/p/10913492.html](https://www.cnblogs.com/fengff/p/10913492.html)
$redis=new \Redis();
$redis->connect('127.0.0.1',6379);//初始化Redis服务器
$lockkey='lock_suo';
$lockexpire=300;
$lockvalue=time()+$lockexpire;
$lock=$redis->setnx($lockkey,$lockvalue);//如果$lockkey不存在,则为$lockkey设置指定的值
if($lock){ //如果设置成功,则表示是没有并发,可进入
    $redis->expire($lockkey, $lockexpire);//设置键的过期时间,过期后自动删除
    /*程序*/
    for($i=0;$i<5;$i++){
        file_put_contents('aa.txt',time().PHP_EOL,FILE_APPEND);//同时执行此脚本可发现,写入的时间戳是按时间顺序依次排列的,而且执行的第二次时间是第一次的二倍
        sleep(1);
    }
    if($redis->ttl($lockkey)){//返回key的剩余过期时间,判断$lockkey是否已过期自动删除
        $redis->del($lockkey);//程序执行完成后,将$lockkey删除
    }
    /*程序*/
}else{
    echo '数据处理中,请不要重复提交';
    exit;
}

方法二(针对每一个用户,各个用户互相不受影响)

<?php
$lockkey='bantong_duihuan'.$userId;
$lockexpire=300;
$lockvalue=time()+$lockexpire;
$redis=new \Redis();
$redis->connect("127.0.0.1", 6379);
$lock=$redis->setnx($lockkey,$lockvalue);
if(!empty($lock)||($redis->get($lockkey) < time() && $redis->getSet($lockkey, $lockvalue) < time() )) {
    $redis->expire($lockkey, $lockexpire);
    /*********************执行程序*********************/
    test();
    /*********************执行程序*********************/
    if($redis->ttl($lockkey))
        $redis->del($lockkey);//每次返回操作执行
    $redis->close();
    return json(['status'=>1,'msg'=>'执行成功']);
}else{
    return json(['status'=>0,'msg'=>'请不要重复提交']);
}
//注意:如果其中设置了mysql事务,一定要先提交事务,后删除锁,以防提交事务执行过程时间过长,导致再次提交

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在使用Redis来防止重复提交时,可以通过以下步骤来实现: 1. 在用户提交请求之前,先检查Redis中是否存在相同的请求标识(例如请求的唯一ID或者请求的URL等)。可以使用Redis的`GET`命令来检查是否存在对应的键。 2. 如果Redis中不存在该请求标识,说明是一个新的请求,可以继续处理。 3. 如果Redis中存在该请求标识,说明是一个重复的请求,可以直接返回重复提交的错误信息给用户,或者执行相应的处理逻辑。 4. 在处理完请求后,将该请求标识存储到Redis中,并设置一个合适的过期时间。可以使用Redis的`SET`命令来设置键值对,并使用`EXPIRE`命令来设置过期时间。 这样,当下次有相同的请求到达时,就可以通过检查Redis中是否存在该请求标识来判断是否为重复提交。 需要注意的是,为了保证防重复提交的准确性和可靠性,需要考虑以下几点: 1. 请求标识的生成:请求标识应该能够唯一地标识一个请求,可以使用请求的唯一ID、请求的URL等作为标识。 2. 过期时间的设置:根据业务需求和系统负载情况,合理设置过期时间,避免Redis中存储过多无效的请求标识。 3. 并发处理:在高并发场景下,可能会有多个请求同时到达,需要考虑并发处理的情况,避免多个请求同时通过重复提交检查。 4. 错误处理:当出现Redis连接异常或者其他错误时,需要有相应的错误处理机制,例如返回错误信息给用户或者执行备用方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值