Redis常見7種使用場景

2021-08-07 13:40:52 字數 4925 閱讀 1157

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操作,進行計數的功能。佇列 ...