PHP使用redis中setnx防止大并发下二次写入

在大并发下会出现同时多个php进程写入的情况,这个时候需要加一个锁,即获取锁的php进程有权限写。思路是:设置一个锁的key,setnx是原子操作,只能一个进程写入成功,写入成功返回true(表示获取锁权限),然后写入内容再释放锁即删除锁key。获取不到锁的进程直接返回。

$lock_key = 'lock_' . $uid;
$is_lock = $redis->setnx($lock_key, 1); // 加锁
if($is_lock == true){ // 获取锁权限
    // 程序逻辑处理:
   
    // 释放锁
    $redis->del($lock_key);
}else{
    // 防止死锁
    if($redis->ttl($lock_key) == -1){
        $redis->expire($lock_key, 5);
    }
    return true; // 获取不到锁权限,直接返回
}
在Spring Boot使用Redissetnx命令,可以使用RedisTemplate类来操作。下面是一个示例代码: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class RedisService { @Autowired private RedisTemplate<String, String> redisTemplate; public boolean setIfNotExists(String key, String value) { return redisTemplate.opsForValue().setIfAbsent(key, value); } } ``` 在上面的示例,我们使用RedisTemplate来操作Redis。首先,我们通过@Autowired注解自动注入了RedisTemplate对象。 在RedisService类,我们定义了一个setIfNotExists方法,它接受一个key和value作为参数,并使用RedissetIfAbsent方法来实现setnx命令。 setIfAbsent方法会将key-value键值对存储到Redis,如果key不存在,则设置成功并返回true;如果key已经存在,则设置失败并返回false。 要使用setIfNotExists方法,可以在任何需要使用Redis setnx功能的地方调用它。例如: ```java @Service public class ExampleService { @Autowired private RedisService redisService; public boolean doSomething(String key, String value) { return redisService.setIfNotExists(key, value); } } ``` 上述示例,我们调用了RedisService的setIfNotExists方法来执行setnx功能。根据方法的返回值,可以判断设置是否成功。 这是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值