消息隊列
1.異步處理場景
用戶在註冊成功後,需要給用戶發送註冊短信和手機驗證碼進行告知。
問題:三個動作是併發執行的
解決方案:用戶註冊成功後直接寫入數據庫,發送短信和發送驗證碼寫入消息隊列
用戶註冊成功此方法做異步處理,當寫入數據庫後,消息隊列執行另外兩個動作(因爲redis的寫入和讀取是非常快的,可以忽略這個時間)
2.解耦sku場景
最常見的就是訂單和sku這塊,訂單和庫存的解耦
問題:訂單下單的同時,減少相應庫存,庫存改變不及時,導致超賣問題
解決:下單直接進數據庫,因爲訂單是持久化的問題,訂單記錄只允許生成修改,下單就要入庫。redis這邊拉/推拿到訂單那邊的下單情況,庫存這邊進行相應的改變。下單庫存這是一體的,我們分開的話,一環出問題不會導致另一環也出問題,再就是redis速度是非常快的,能及時的響應下單那邊的商品數量,庫存這邊及時更改。
3.秒殺場景
問題:一瞬間訂單數量特別大單靠mysql是吃不下的
解決:所有的訂單先進redis,不管進的速度是什麼樣的,出的速度是一致的,因爲redis是操作原子的。進來的都按照同樣的速度一個一個出
最基本的代碼:
1.php
<?php
$redis = new Redis();
//連接redis服務器
$redis->connect('127.0.0.1', 6379);
// echo "Connection to server sucessfully <br/>";
$msg = array('1','2','3','4','5','6');
//將數據一個一個寫入
foreach ($msg as $key => $value)
{
# code...
$redis->rpush('mylist',$value);
}
2.php
<?php
$redis = new Redis();
//連接redis服務器
$redis->connect('127.0.0.1', 6379);
// echo "Connection to server sucessfully <br/>";
$value = $redis->lpop('mylist');
// var_dump($value);
// exit;
if($value)
{
echo "出隊值".$value;
}
else
{
echo "出隊完成";
}
可以藉助 redis desktop manager工具,redis的安裝https://blog.csdn.net/qq_31164125/article/details/103704180
redis desktop manager使用,下載安裝就不說了
先進到redis的目錄,找到
redis.windows.conf文件
requirepass foobared Sky!123
打開註釋,後面寫上密碼,然後連接,name隨便寫,host:127.0.0.1,端口:6379,密碼:自己設置的我這裏是(Sky!123)
PHP+redis實現共同好友
1.php
<?php
$redis = new Redis();
//連接redis服務器
$redis->connect('127.0.0.1', 6379);
// echo "Connection to server sucessfully <br/>";
// 每執行一次,實現一個粉絲關注一個用戶,執行多次錄入數據
if(!empty($_GET['uid'])&&!empty($_GET['fansid']))
{
$key="user:{$_GET['uid']}:fansid";
$redis->sadd($key,$_GET['fansid']);
}
else
{
echo "關注不成功";
}
2.php
<?php
$redis = new Redis();
//連接redis服務器
$redis->connect('127.0.0.1', 6379);
// echo "Connection to server sucessfully <br/>";
// exit;
if(!empty($_GET['uid'])&&!empty($_GET['followsid']))
{
$key="user:{$_GET['uid']}:follows";
$redis->sadd($key,$_GET['followsid']);
}
else
{
echo "關注不成功";
}
3.php
<?php
$redis = new Redis();
//連接redis服務器
$redis->connect('127.0.0.1', 6379);
//通過sinter獲取自己的粉絲和自己所有的關注用戶交集
$userlist1 = $redis->sinter("user:{$_GET['uid']}:fansid","user:{$_GET['uid']}:follows");
if($userlist1)
{
echo "和用戶{$_GET['uid']}互關的有";
print_r($userlist1);
}
else
{
echo "沒有和用戶{$_GET['uid']}互關的有";
}
echo "<br>";
$user1id=1;
$user2id=2;
$userlist2 = $redis->sinter("user:{$user1id}:follows","user:{$user2id}:follows");
if($userlist2)
{
echo "和用戶{$user1id}和{user2id}共同關注的用戶有";
print_r($userlist2);
}
else
{
echo "沒有和用戶{$user1id}和{user2id}共同關注的用戶有";
}