1、redis是項目中比較常見使用的內(nèi)存型數(shù)據(jù)庫,具有以下方面的特點:
1、redis是純內(nèi)存型的數(shù)據(jù)庫。
2單線程模型,減少線程上下文切換。
3、非阻塞IO,IO多路復用,將數(shù)據(jù)庫的開、關、讀、寫都轉換成了事件,減少了線程切換時上下文的切換 和競爭。
4、Redis全程使用hash結構,讀取速度快,還有一些特殊的數(shù)據(jù)結構,對數(shù)據(jù)存儲進行了優(yōu)化。
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結構數(shù)據(jù)緩存:
//緩存用戶信息,文章,商品等
$id="xxxx";
$redis->hmset(‘user_’.$id,['name'=>'xxxxx', 'sex'=>1, 'addr'=>'xxxxxxxxxf']);
var_dump($redis->hgetall('user_'.$id));
字符串:
//手機驗證碼
$redis->setex('15689889565', 60, 3455); //驗證碼60秒過期
//計數(shù)器
$redis->incr($key); //自增
$redis->incrby($key, $increase_num); //按量增加
防商品超發(fā)
//計數(shù)器方式
$max_num = 10; //模擬商品限購數(shù)量
$pro_id = 453645; //模擬商品id
if($redis->incr($pro_id) > $max_num){
echo "下單失敗";
exit();
}
echo "下單成功!";
//入庫操作
//事務方式
$len = $redis->get('num');
$total = 10; //商品總數(shù)
if($len < $total){
$redis->watch('list); //可寫在判斷條件外面 在事務執(zhí)行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷
$redis->multi();
$redis->hmset('order',['order_id'=>'xxxxx','user'=>'xxxx','pro'=>'xxxxxx']);
$redis->set('num', $len+1);
$result = $redis->exec(); //執(zhí)行事務
if($result){
echo "成功";
exit();
}else{
echo "失敗,請繼續(xù)購買!";
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 模式執(zhí)行訂閱事件
相關的代碼git地址:https://github.com/yspwf/redis_application
其次是網(wǎng)絡上大同小異的總結:https://my.oschina.net/PHPDOTAER/blog/1814733