处理流程

数据库设计:
需要两个程序:
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不会占用空间。