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

 

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