本文主要和大家分享Redis常見的使用場景,簡單字串快取實戰,希望能幫助大家。
1 2 3 4 5 6 7 8 9 10 11 12 | $redis ->connect('127.0.0.1', 6379);
$strCacheKey = 'Test_bihu';
$redis ->set( $strCacheKey , json_encode( $arrCacheData ));
$redis ->expire( $strCacheKey , 30); # 设置30秒后过期 $json_data = $redis ->get( $strCacheKey );
$data = json_decode( $json_data );
print_r( $data ->age);
],
];
$redis ->hSet( $strCacheKey , 'google', json_encode( $arrWebSite ['google']));
$json_data = $redis ->hGet( $strCacheKey , 'google');
$data = json_decode( $json_data );
print_r( $data );
|
登入後複製
簡單隊列實戰
1 2 3 4 5 6 | $redis ->connect('127.0.0.1', 6379);
$strQueueName = 'Test_bihu_queue';
$redis ->rpush( $strQueueName , json_encode(['uid' => 2,'name' => 'Tom']));
$redis ->rpush( $strQueueName , json_encode(['uid' => 3,'name' => 'John'])); echo "---- 进队列成功 ---- <br /><br />";
print_r( $strCount );
print_r( $strCount );
|
登入後複製
簡單發布訂閱實戰
1 2 3 4 | $redis ->connect('127.0.0.1', 6379);
$strChannel = 'Test_bihu_channel';
$redis ->close();
|
登入後複製
簡單計數器實戰
1 2 3 4 5 6 7 | $redis ->connect('127.0.0.1', 6379);
$strChannel = 'Test_bihu_channel';
$redis ->subscribe([ $strChannel ], 'callBackFun'); function callBackFun( $redis , $channel , $msg ){
print_r([ 'redis' => $redis , 'channel' => $channel , 'msg' => $msg
]);
}
|
登入後複製
排行榜實戰
1 2 3 4 | $redis ->connect('127.0.0.1', 6379);
$strKey = 'Test_bihu_comments';
$redis ->INCR( $strKey );
|
登入後複製
1 2 3 4 5 6 7 8 9 10 11 12 | $redis ->connect('127.0.0.1', 6379);
$strKey = 'Test_bihu_score';
$redis ->zadd( $strKey , '70', json_encode(['name' => 'John']));
$redis ->zadd( $strKey , '90', json_encode(['name' => 'Jerry']));
$redis ->zadd( $strKey , '30', json_encode(['name' => 'Job']));
$redis ->zadd( $strKey , '100', json_encode(['name' => 'LiMing']));
$dataOne = $redis ->ZREVRANGE( $strKey , 0, -1, true); echo "---- { $strKey }由大到小的排序 ---- <br /><br />";
print_r( $dataOne );
$dataTwo = $redis ->ZRANGE( $strKey , 0, -1, true); echo "<br /><br />---- { $strKey }由小到大的排序 ---- <br /><br />";
print_r( $dataTwo );
|
登入後複製
解釋:悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀。
每次去拿資料的時候都認為別人會修改,所以每次拿到資料的時候都會上鎖。
場景:如果專案中使用了快取且對快取設定了逾時時間。
當並發量比較大的時候,如果沒有鎖定機制,那麼快取過期的瞬間,
大量並發請求會穿透快取直接查詢資料庫,造成雪崩效應。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public function lock( $key = '', $expire = 5) {
$is_lock = $this ->_redis->setnx( $key , time()+ $expire );
if (! $is_lock ){
$lock_time = $this ->_redis->get( $key );
if (time() > $lock_time ) {
unlock( $key );
$is_lock = $this ->_redis->setnx( $key , time() + $expire );
}
} return $is_lock ? true : false;
}
public function unlock( $key = ''){ return $this ->_redis->del( $key );
}
sleep(5); echo 'success<br>';
unlock( $key );
} else {
echo 'request too frequently<br>';
}
|
登入後複製
簡單事務的樂觀鎖實戰
解釋:樂觀鎖(Optimistic Lock), 顧名思義,就是很樂觀。
每次去拿資料的時候都認為別人不會修改,所以不會上鎖。
watch指令會監視給定的key,當exec時候如果監視的key從呼叫watch後發生過變化,則整個交易會失敗。
也可以呼叫watch多次監視多個key。這樣就可以對指定的key加樂觀鎖了。
注意watch的key是對整個連線有效的,交易也是。
如果連線斷開,監視和交易都會被自動清除。
當然了exec,discard,unwatch指令都會清除連線中的所有監視。
1 2 3 4 5 6 7 8 9 10 11 | $strKey = 'Test_bihu_age';
$redis ->set( $strKey ,10);
$age = $redis ->get( $strKey ); echo "---- Current Age:{ $age } ---- <br/><br/>";
$redis ->watch( $strKey );
$redis -> exec ();
$age = $redis ->get( $strKey ); echo "---- Current Age:{ $age } ---- <br/><br/>";
|
登入後複製
相關推薦:
PHP連結redis的方法代碼
一個php+redis的簡單實例分享
#################################################################################################### ####Redis在PHP的一些使用方法######
以上是Redis常見的使用場景分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!