php

redis 应用场景

2019-03-14  本文已影响0人  ysp123

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

上一篇 下一篇

猜你喜欢

热点阅读