PHP+redis 實現一些功能以及場景的基本操作附基本代碼

消息隊列

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}共同關注的用戶有";
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章