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
网友评论