美文网首页php
redis 应用场景

redis 应用场景

作者: ysp123 | 来源:发表于2019-03-14 17:03 被阅读0次

    1、redis是项目中比较常见使用的内存型数据库,具有以下方面的特点:
    1、redis是纯内存型的数据库。
    2单线程模型,减少线程上下文切换。
    3、非阻塞IO,IO多路复用,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换 和竞争。
    4、Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化。
    2、使用方式
    基本连接:

    $ip_addr='127.0.0.1';
    $port=6379;
    $redis  = new Redis();
    $redis->connect(ip_addr,$port);
    $redis->auth($password);   //config设置密码时使用
    $redis->select(); //库选择,0 -- 15
    

    hash结构数据缓存:

    //缓存用户信息,文章,商品等
    $id="xxxx";
    $redis->hmset(‘user_’.$id,['name'=>'xxxxx',  'sex'=>1,  'addr'=>'xxxxxxxxxf']);
    var_dump($redis->hgetall('user_'.$id));
    

    字符串:

    //手机验证码
    $redis->setex('15689889565', 60, 3455);  //验证码60秒过期
    //计数器
    $redis->incr($key);  //自增
    $redis->incrby($key, $increase_num);  //按量增加
    

    防商品超发

    //计数器方式
    $max_num = 10;  //模拟商品限购数量
    $pro_id = 453645;  //模拟商品id
    if($redis->incr($pro_id) > $max_num){
        echo "下单失败";
        exit();
    }
    echo "下单成功!";
    //入库操作
    
    
    //事务方式
    $len = $redis->get('num');
    $total = 10;  //商品总数
    if($len < $total){
           $redis->watch('list);  //可写在判断条件外面 在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
           $redis->multi();
           $redis->hmset('order',['order_id'=>'xxxxx','user'=>'xxxx','pro'=>'xxxxxx']);
           $redis->set('num', $len+1);
           $result = $redis->exec();   //执行事务
            if($result){
                  echo "成功";
                  exit();
            }else{
                  echo "失败,请继续购买!";
                  exit();
            }
    }else{
            exit('抢光了!');
    }
    

    缓存瞬时操作量大的操作:

    //点赞,弹幕等
    $redis->hset('article:id', 'click', xxxx);   //点赞
    $redis->hincrby('article:id', 'click', 1);    //点赞增加
    
    

    订单延时支付:

    $redis->setex($key, 5, 'xxxxxx');  //设置变量 5秒过期
    
    //过期事件订阅
    $redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
    $db_id = 0;
    $redis->psubscribe([__keyevent@$db_id__:expired], 'keycallback');
    function keycallback($redis, $pattern, $chan, $msg){
        echo "Pattern: $pattern \r\n";
        echo "Channel: $chan \r\n";
        echo "Payload: $msg \r\n";
    }
    //cli 模式执行订阅事件
    

    相关的代码git地址:https://github.com/yspwf/redis_application
    其次是网络上大同小异的总结:https://my.oschina.net/PHPDOTAER/blog/1814733

    相关文章

      网友评论

        本文标题:redis 应用场景

        本文链接:https://www.haomeiwen.com/subject/knjcmqtx.html