redis_key设计

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 "请求过于频繁!";
          }
      }
      
      
      
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值