最近有个每日签到的活动 用户每天只能签到一次。 一开始考虑用 get set 但是万一并发情况下
刚刚set 为1 然后再去get 数据的时候 从库数据 延迟还没同步过来 还岂不是又可以签到一下
get set 完全满足不了 这个需求的原子性要求
后面找到 incrby 统一操作 主库
redis incrby
将key所储存的值加上增量increment。
如果key不存在,以0为key的初始值,然后执行INCRBY命令。
总体测试代码如下:
刚刚set 为1 然后再去get 数据的时候 从库数据 延迟还没同步过来 还岂不是又可以签到一下
get set 完全满足不了 这个需求的原子性要求
后面找到 incrby 统一操作 主库
redis incrby
将key所储存的值加上增量increment。
如果key不存在,以0为key的初始值,然后执行INCRBY命令。
总体测试代码如下:
<?php
$redis=new redis();
$redis->connect('127.0.0.1','6379');
$user_id=1;
$redis_key=sprintf('redis_sign_user_%d',$user_id);
//如果已经签到过
if($redis->incrby($redis_key)>1){
echo '您已经签到!';
}
?>