redis_key设计
1、string类型
- key设计原则:
- key的唯一性
- 见名知意 ;例如(user:1:add_time)不会重叠
2、hash哈希
- 用法:秒杀商品,购物车 聚合信息
- key设计原则:
- 例如购物车:car:user:1002 [sku_id1=>1, sku_id2=>3] sku+数量
3、list列表
- 用法:关注、推荐、、订阅、支付通知、消息模板通知
- key设计原则:lpush user:123 009
栈、队列、阻塞队列
- 先进后出:栈 lpush+lpop
- 先进先出:队列 lpush+rpop
- 阻塞队列: lpush+brpop 处理在生产者小于消费者,队列为空的情况下。进行阻塞地等待并消费消息
秒杀
-
流程
- 选购商品------点击购买-------生成订单(记录库存/消除库存)--------支付
-
模拟数据库秒杀
-
$data = MiaoSha::find(1); // sleep(1); if($data->number <= 0){ return '抢完了'; } MiaoSha::where('id',1)->update(['number'=>$data->number-1]);
-
压力测试:找到apache 找到bin目录打开命令工具 ab -c600 -n600 http://laravelpyg:8020/miaosha
乐观锁秒杀
-
//设置库存跟销量 // Redis::set('number',5); // Redis::set('count',0); Redis::watch('count'); //监听销售量字段 $num = Redis::get('number'); $count = Redis::get('count'); // dd($num,$count); if($count >= $num){ return '抢完了'; } Redis::multi(); //开启事物 Redis::set('count',$count+1); //修改销售量 $res = Redis::exec(); //结束事物 //保存用户信息到哈希 //数据库库存增减 //保存订单表
各个平台限流
-
用户量大,流量限制
-
redis借口限流
-
1、IP地址访问+用户携带的标识(限制次数的标识,记录到redis中)
-
//假设是用ip地址来做限流 //先判断是否存在key $ip = $_SERVER['REMOTE_ADDR']; if(!Redis::existx($key)){ //不存在则创建一个且设置自增 Redis::incr($key); //原子计数器 //设置key过期时间 Redis:;expire($key,60);//60秒 }else{ Redis::incr($key); //原子计数器 $count = Redis::get($key); //获取总数 if($count >= 5){ return "请求过于频繁!"; } }
-
2、队列形式进行限流
-
//假设是用ip地址来做限流 //先判断是否存在key $ip = $_SERVER['REMOTE_ADDR']; //判断队列长度 if(Redis::llen($key)<=10){ //设置队列 Redis::lpush($ip,time()); //设置key过期时间 Redis:;expire($key,60);//60秒 }else{ //获取最后插入的值 $end_key = Redis::lindex($key,0); if(time() - $end_key <= 60){ return "请求过于频繁!"; } }
-