时间戳转换工具

核心结构:

业务系统--(入队)--》消息队列--(出对)--》队列处理系统

 

应用场景:

冗余  解耦    削峰案例  异步通信

扩展性   排序保证


消息队列优缺点:

mysql(mysql订单队列) 可靠性高 易实现 速度慢

redis 速度快 单条大消息包时效率低

消息系统:专业性强 可靠 学习成本高

消息处理触发机制


死循环方式读取:易实现,故障时无法及时恢复

定时任务:压力均分 有处理量上限

解耦案例


架构设计

1.1订单系统接受用户订单 ----》订单列表----》配送系统和标记配送结构


2.2程序流程

接受用户订单---》订单系统---》队列表(order_id,status,address,create)time,update_time)---》配送处理系统goods.php(需要一个定时脚本goods.sh)----》配送系统

流量削峰案例(分流 解压 中间键 )


redis 的list 类型实现秒杀

特点:秒杀就是瞬间有巨大的访问量

不用mysql做秒杀的原因:

myslq需要往硬盘里面写,redis基于内存,而且其他业务也可能使用mysql,如果秒杀使用mysql,那瞬间的流量会把mysql资源耗光,造成mysql死锁。redis会不定期把数据写到硬盘里,不用担心断电的问题。


redis 提供5中类型  双向链表(有序集合):

LPUSH/LPUSHX 将值插入到/(存在的)列表头部

RPUSH/RPUSHX 将值插入到/存在的列表尾部

LPOP 移出并获取列表的第一个元素

RPOP移出并获取列表的最后一个元素

ltrim  保留指定区间内的元素

LIEN 获取列表长度

LSET 通过索引设置列表元素的值

LINDEX 通过索引获取列表中的元素

LRANGE 获取列表制定范围内的元素


架构设计:

秒杀业务程序(标明那个用户,和时间)

---》redis

--》入库程序

---》数据库


代码及设计

1.秒杀程序把请求写入redis(uid,time_stamp微秒时间戳)

2.检查redis已存入数据的长度,超出上限直接丢弃

3.死循环处理存入redis的数据并入库


实现:

存入redis:

先加载redis组件 


$redis = new Redis();

$redis->connect(ip);

$redis_name='miaosha';


接受用户uid

$uid = $_GET['uid'];


获取一个redis里面已经有的数量

$num = 10;

    


如果当天人数少于10的时候,加入队列

if($redis->ILen($reids_name) < 10){

    

    $redis->rFlush($redis_name,$uid.'%'.microtime())

    echo '秒杀成功';

}{

    返回秒杀已完成

}


$redis->close();

处理程序,写入数据库:


加载redis组件


//死循环

从队列最左侧取出一个值来,然后判断这个值是否存在,切割出时间,uid,保存到数据库中,数据库插入失败的时候回滚机制 ,释放redis


whlie(1){

    $user = $redis->IPop($redis_name)//左侧取值

    if(!$user || $user == 'nil'){

        sleep(2);

        continue;

        

    }

    $user_arr = explode('%',$user);

    $insert_data = arraya(

        'uid'=>$user_arr[0];

        'time'=>$user_arr[1];

        //入库操作  insert $res

        

        if(!$res){

           $redis->rPush($redis_name,$user); 

        }

    );

}


$redis->close();



如何在服务器使用:

先 cd 到需要执行的文件目录,ls确认 

php savetodb.php


联系我们 - 首页 - 关于我们
Copyright © 2017-2022 iteam. All Rights Reserved. Current version is 2.50.0.
粤ICP备17021424号
VV:51403 UV:197128 PV:587782