1.簡單字串快取實戰
$redis->connect('127.0.0.1', 6379);
$strcachekey = 'test_bihu';
//set 應用
$arrcachedata = [
'name' => 'job',
'***' => '男',
'age' => '30'
];$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); //輸出資料
//hset 應用
$arrwebsite = [
'google' => [
'google.com',
'google.com.hk'
],];$redis->hset($strcachekey, 'google', json_encode($arrwebsite['google']));
$json_data = $redis->hget($strcachekey, 'google');
$data = json_decode($json_data);
print_r($data); //輸出資料
2.簡單佇列實戰
$redis->connect('127.0.0.1', 6379);
$strqueuename = 'test_bihu_queue';
//進佇列
$redis->rpush($strqueuename, json_encode(['uid' => 1,'name' => 'job']));
$redis->rpush($strqueuename, json_encode(['uid' => 2,'name' => 'tom']));
$redis->rpush($strqueuename, json_encode(['uid' => 3,'name' => 'john']));
echo "---- 進佇列成功 ----
";//檢視佇列
$strcount = $redis->lrange($strqueuename, 0, -1);
echo "當前佇列資料為:
";print_r($strcount);
//出佇列
$redis->lpop($strqueuename);
echo "
---- 出佇列成功 ----
";
//檢視佇列
$strcount = $redis->lrange($strqueuename, 0, -1);
echo "當前佇列資料為:
";print_r($strcount);
3.簡單發布訂閱實戰
//以下是 pub.php 檔案的內容 cli下執行
ini_set('default_socket_timeout', -1);
$redis->connect('127.0.0.1', 6379);
$strchannel = 'test_bihu_channel';
//發布
$redis->publish($strchannel, "來自頻道的推送");
echo "---- ---- 頻道訊息推送成功~
";$redis->close();
//以下是 sub.php 檔案內容 cli下執行
ini_set('default_socket_timeout', -1);
$redis->connect('127.0.0.1', 6379);
$strchannel = 'test_bihu_channel';
//訂閱
echo "---- 訂閱這個頻道,等待訊息推送...----
";$redis->subscribe([$strchannel], 'callbackfun');
function callbackfun($redis, $channel, $msg)
4.簡單計數器實戰
$redis->connect('127.0.0.1', 6379);
$strkey = 'test_bihu_comments';
//設定初始值
$redis->set($strkey, 0);
$redis->incr($strkey); //+1
$redis->incr($strkey); //+1
$redis->incr($strkey); //+1
$strnowcount = $redis->get($strkey);
echo "---- 當前數量為。 ---- ";
5.排行榜實戰
$redis->connect('127.0.0.1', 6379);
$strkey = 'test_bihu_score';
//儲存資料
$redis->zadd($strkey, '50', json_encode(['name' => 'tom']));
$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 "---- 由大到小的排序 ----
";print_r($dataone);
$datatwo = $redis->zrange($strkey, 0, -1, true);
echo "
---- 由小到大的排序 ----
";print_r($datatwo);
6.簡單字串悲觀鎖實戰
解釋:悲觀鎖(pessimistic lock), 顧名思義,就是很悲觀。
每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖。
場景:如果專案中使用了快取且對快取設定了超時時間。
當併發量比較大的時候,如果沒有鎖機制,那麼快取過期的瞬間,
大量併發請求會穿透快取直接查詢資料庫,造成雪崩效應。
/**
* 獲取鎖
* @param string $key 鎖標識
* @param int $expire 鎖過期時間
* @return boolean
*/public function lock($key = '', $expire = 5)
}return $is_lock? true : false;
}
/**
* 釋放鎖
* @param string $key 鎖標識
* @return boolean
*/public function unlock($key = '')
// 定義鎖標識
$key = 'test_bihu_lock';
// 獲取鎖
$is_lock = lock($key, 10);
if ($is_lock) else
7.簡單事務的樂觀鎖實戰
解釋:樂觀鎖(optimistic lock), 顧名思義,就是很樂觀。
每次去拿資料的時候都認為別人不會修改,所以不會上鎖。
watch命令會監視給定的key,當exec時候如果監視的key從呼叫watch後發生過變化,則整個事務會失敗。
也可以呼叫watch多次監視多個key。這樣就可以對指定的key加樂觀鎖了。
注意watch的key是對整個連線有效的,事務也一樣。
如果連線斷開,監視和事務都會被自動清除。
當然了exec,discard,unwatch命令都會清除連線中的所有監視。
$strkey = 'test_bihu_age';
$redis->set($strkey,10);
$age = $redis->get($strkey);
echo "---- current age: ----
";$redis->watch($strkey);
// 開啟事務
$redis->multi();
//在這個時候新開了乙個新會話執行
$redis->set($strkey,30); //新會話
echo "---- current age: ----
"; //30
$redis->set($strkey,20);
$redis->exec();
$age = $redis->get($strkey);
echo "---- current age: ----
"; //30
//當exec時候如果監視的key從呼叫watch後發生過變化,則整個事務會失敗
Redis常見使用場景
1 使用string實現計數 特點 string的value一般是string,也可以是數字 內部實現 當涉及數字運算時,自動把string轉換為integer進行運算 應用場景 對客戶端傳送驗證碼次數進行限制 string借助incr incrby decr decrby可以實現原子計數 2 使用...
Redis學習總結(7)之常見使用場景
redis 是乙個開源的使用 ansi c 語言編寫 支援網路 可基於記憶體亦可持久化的日誌型 key value 資料庫。在之前的博文中已經介紹了redis了,大家有需要的可以自行查閱。在目前的網際網路 中,快取幾乎是 都在用的,合理的使用快取不但可以提公升 訪問速度,還可以大大降低資料庫的壓力。...
redis常見的幾種使用場景
排行榜top100 相關函式zadd lrange 使用方式使用zadd記錄每個value的分數值,字段即可實現排序,再進行lrange進行取前100,就實現了排行榜的效果 計數器 相關函式incr decr 使用方式設定乙個初始值為1的key,對其進行incr decr操作,進行計數的功能。佇列 ...