一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
  • 欢迎来自美国弗吉尼亚州的访客,您好!
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

网站统计

  • 观海听潮•博客
  • 57篇
  • 145条
  • 28869次
  • 245次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > redis  > php php

观海听潮

redis订阅模式实现订单过时取消等业务逻辑

摘要
redis订阅模式实现订单过时取消等业务逻辑

1、开启配置

截图 (32).png

linux修改redis.conf的notify-keyspace-events参数值为 Ex。

windows下也是修改这个参数,但是我windows下修改后没有生效,我也不清楚什么问题,后来我直接在redis下修改的:

截图 (33).png

2、输入命令:

psubscribe __keyevent@*__:expired

截图 (34).png

3、重新打开一个新窗口cmd,在 redis命令界面设置key

截图 (35).png

新界面也需要重新设置一下conf配置,因为在窗口设置的值不是持久的。

这样的话在上一个窗口就可以看到过期的key值。

4、在项目中应用:

1)新建Redis.class.php文件:

<?php

//遇到类别重复的报错,所有叫Redis2

class Redis2  

{

   private $redis;

   public function __construct($host = '127.0.0.1', $port = 7268)

   {

       $this->redis = new Redis();

       $this->redis->connect($host, $port);

       $this->redis->auth('5863chengzhigang');

   }

   public function setex($key, $time, $val)

   {

       return $this->redis->setex($key, $time, $val);

   }

   public function set($key, $val)

   {

       return $this->redis->set($key, $val);

   }

   public function get($key)

   {

       return $this->redis->get($key);

   }

   public function expire($key = null, $time = 0)

   {

       return $this->redis->expire($key, $time);

   }

   public function psubscribe($patterns = array(), $callback)

   {

       $this->redis->psubscribe($patterns, $callback);

   }

   public function setOption()

   {

       $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);

   }

}

2)新建psubscribe.php文件

<?php

require_once './Redis.class.php';

$redis = new \Redis2();

// 解决Redis客户端订阅时候超时情况

$redis->setOption();

$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');

// 回调函数,这里写处理逻辑

function keyCallback($redis, $pattern, $chan, $msg)

{

   echo "Pattern: $pattern\n";

   echo "Channel: $chan\n";

   echo "Payload: $msg\n\n";

   //keyCallback为订阅事件后的回调函数,这里写业务处理逻辑,

   //比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单

}

3)新建server.php文件

<?php

require_once './Redis.class.php';

$redis = new \Redis2();

$order_id = 123;

$redis->setex('order_id',10,$order_id);

4)在cmd窗口去运行psubscribe.php

具体方法是在psubscribe.php所在目录,执行命令:php psubscirbe.php

5)调用server.php文件,比如可以在浏览器上打开这个文件等。

6)补充说明一下,像处理过时订单业务场景,是在keyCallback回调函数进行的,$msg就是订单的key。但是因为key已经失效了,所以无法获取到它的值。也就没有办法处理订单状态等业务。我的建议是可以把key设置成key+订单id的形式。

7)以上知识很大一部分是参考别人写的,写这个得目的也主要是为了收藏和巩固一下知识。

讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表