处理流程
数据库设计:
需要两个程序:
1个是处理用户请求,并存入到redis中的程序;另一个,从redis取出并存入到数据库中的程序.
首先加载redis组件:
然后操作:
第二个程序:
首先启用redis和mysql:
死循环:从队列最左侧取出一个值来,然后判断这个值是否存在,切割出时间和UID,保存到数据库中,数据库插入失败的时候回滚释放redis
架构设计图
user.php 客户端 <?php //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); if ($redis) { echo "success"; } $redis_name='miaosha'; for ($i=0; $i<100; $i++) { $uid = rand(100000, 9999999); //接受用户id // $uid = $_GET['uid']; //获取一下redis里面已有的数量 $num = 10; //如果当前人数少于时候的时候,则加入这个队列 if ($redis->lLen($redis_name) < 10) { $redis->rPush($redis_name,$uid.'%'.microtime()); echo $uid . '秒杀成功!'.'<br>'; } else { //如果当天人数已经达到了十个人,则返回秒杀已完成 echo "秒杀已结束"; } } $redis->close(); ?>
服务端 <?php include './db.php'; //连接本地的 Redis 服务 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis_name="miaosha"; $db=DB::getIntance(); //死循环, while (1){ //第一步 //从队列最左侧取出一个值来, $user = $redis->lPop($redis_name); //然后判断这个值是否存在, if(!$user||$user=='nil'){ sleep(2); continue; } //如果存在切割出时间,uid $user_arr = explode('%', $user); $insert_data = array( 'uid' => $user_arr[0], 'time_stamp' => $user_arr[1]); $res = $db->insert('redis_queue',$insert_data); //保存数据库中, if(!$res){ $redis->rPush($redis_name,$user); } sleep(2); //第二部 //redis如果把值取出来这个值就不在队列里了 //如果出现问题了我的业务没有完成失败的情况下,我们需要有一个备份机制把值重新插回队列里 //数据库插入失败时候的回滚机制 //释放一下redis } $redis->close(); ?>
棒 继续加油
redis新手学习:949359454,不懂的可以在群里提问哦
redis新手学习交流群:949359454,不懂的可以在群里提问哦
redis新手学习交流群:949359454,不懂的可以在群里提问哦
代码实现2
代码实现1
100个用户测试
redis实现秒杀
redis队列表
while(1){
$user=$redis->lpop($key);
if(!$user){
sleep(2);continue;
$arr=explode('%',$user);
$res=$db->inset($sql);
if(!$res){
$redsi->rpush($key,$user);
}
}
}
for($i=1;$i<100;$i++){
if($redis->llen($key)<10){
$redis->rpush($key,$uid.time()); echo 'success';
} else {
echo 'fail';
}
}
创建数据库表:
一、接收用户请求存入到redis的程序
二、将redis的数据插入到数据库的程序
<?php inlcude_onceA './include/db.php'; $redis = new Redis(); $resid->connect('127.0.0.1', 6379); $reds_name = 'miaosha'; $db = DB::getInstance(); //死循环 while(1) { //从队列最左侧取出一个值来 $user = $redis->lPop($redis_name); //然后判断这个值是否存在 if (!$user || $user == 'nil') { sleep(2); continue; } //切割出时间, uid $user_arr = explode('%', $user); $insert_data = array( 'uid' => $user_arr[0], 'time_stamp' => $use_arr[1]] ); //保存到数据库中 $res = $db->insert('redis_queue', $insert_data);: //数据库插入失败时回滚 if (!$res) { $redis->rPop($redis_name, $user); } } //释放redis $redis->close(); }
</php //首先,加载一个Reids组件, $redis = new Redis(); $resid->connect('127.0.0.1', 6379); $reds_name = 'miaosha'; for ($i = 0;$i < 100;$i++) { $uid = rand(1000000, 9999999); } //接收用户的id, //$uid = $_GET['uid']; //获取redis里面已有的数量 $num = 10; //如果当前人数少于10的时候,则加入这个队列 if ($redis->lLen($resid_name) < 10) { $redis->rPush($redis_name . $uid . '%' . microtime()); echo $uid . '秒杀成功'; }else{ //如果当前人数已经达到10人,责任返回秒杀已完成 echo '秒杀已结束'; } $redis->close();
Nil 只针对对象,而 空对象 不是说不占用空间,相当于一个“洗白”,回到初始状态。 Null 是 空值,是针对指针的,对对象指针和非对象指针都有效,Null不会占用空间。