php操作redis(list) 秒杀

public function actionUserTest(){
$redis = Yii::$app->get('redis');
$key = 'miaosha';
$num = 30;
for ($i=0;$i<=100;$i++){
$uuid = rand(1000,9999);
if($uuidInsert){
if($num > $redis->llen($key) ){
$redis->rpush($key,$uuid);
}else{
echo '超过30条'.$uuid;
}
echo 'success'.$uuid;
}else{
echo 'fail'.$uuid;
}
}

}
public function actionMiaoSha()
{
$redis = Yii::$app->get('redis');
$key = 'miaosha';
$flag = $redis->exists($key);
while (1){
if($flag){
$uid = $redis->lpop($key);
if(!$uid || $uid == 'nil'){
sleep(1);
continue;
}
$update_at = time();
$sql = "update user_queue set updated_at = '{$update_at}',status=1 where uuid = $uid";
$uuidUp = yii::$app->db->createCommand($sql)->execute();
if($uuidUp){
echo $uid ."抢购成功!,进行订单处理操作<br/>";
}else{
$redis->rpush($key,$uid);//回滚数据
}
sleep(1);
}else {
echo "出列完毕!";
}
}
}
可以用brPop提供阻塞获取的功能,所以在消费任务速度大于投递速度的情况下,可以认为是实时异步处理

list适用场景
消息队列
list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。
最新列表
list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。
#消息队列demo 简单模拟抢购商品
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('123456');

$redis->flushAll(); //清空所有数据
//入列
$key = 'product1';#商品1
for ($i = 0; $i < 100; $i++) {
$uid = rand(1000, 9999);
$number = 10; //次数,假设这件商品只能10个人抢购
if ($number > $redis->lLen($key)) {
$redis->rpush($key, $uid); //不够10个就入列
} else {
continue;
}
}
//出列
while (true){
$flag = $redis->exists($key);
if($flag){
$uid = $redis->rpop($key);
echo $uid ."抢购成功!,进行订单处理操作<br/>";
} else {
echo "出列完毕!";
exit;
}
}
对list数据的操作
#创建
#从列表左边放入一个或者多个元素,不存在创建
$redis->lpush('list','值1','value2','value3');
#当列表存在时,从左边放入一个元素,不存在时报错
$redis->lpushx('list','值2');
#从列表右边放入一个或者多个元素,不存在创建
$redis->rpush('list','值1');
#当列表存在时,从右边放入一个元素,不存在时报错
$redis->rpushx('list','值2');
#获取
#根据索引获取列表中的元素,列表索引最后一个可以使用-1
$redis->lrange('list',0,-1);
$redis->lgetrange('list',0,-1)
#根据列表索引获取值
$redis->lindex('list',0);
$redis->lget('list',0);
#修改
#根据索引设置列表中元素的值,当list不存在时报错
$redis->lset('list',0,'新值');
#删除
#从列表左边删除一个元素
$redis->lpop('list');
#从列表右边删除一个元素
$redis->rpop('list');

/*
* 从list列表里移除前 2(count)次出现的值为 value 的元素
* #count > 0: 从头往尾移除值为 value 的元素
* #count < 0: 从尾往头移除值为 value 的元素
* #count = 0: 移除所有值为 value 的元素
*/
$redis->lremove('list','value',2);

#删除list列表右边的最后一个元素将其追加到list1列表,list1不存在会创建
$redis->rpoplpush('list','list1');
#根据索引start和stop保留列表元素,其他元素全删除
$redis->ltrim('list',1,2);
#获取列表长度
$redis->llen('list');


原文链接:https://blog.csdn.net/u010404725/java/article/details/99956911

posted @ 2020-04-21 10:39  星云惊蛰  阅读(569)  评论(0)    收藏  举报