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