訂單超時人乓,活動過期解決方案:php監(jiān)聽redis鍵重復(fù)觸發(fā)引發(fā)事件
Redis的2.8.0版本之后可用,鍵空間消息(Redis Keyspace Notifications)绿满,配合2.0.0版本之后的SUBSCRIBE?可以完成這個定時任務(wù)的操作了,定時的單位是秒窟扑。
1.我們先訂閱頻道稱為?redisChat
2.現(xiàn)在喇颁,我們重新開啟個redis客戶端,然后在同一個頻道redisChat發(fā)布消息嚎货,訂閱者可以接收到消息橘霎。
接收到的消息如下:
3.Key過期事件的Redis配置
需要這里配置notify-keyspace-events的參數(shù)為“EX” .X代表了過期事件。notify-keyspace-events “Ex”保存配置后殖属,重啟Redis的服務(wù)姐叁,使配置生效。
PHP Redis實現(xiàn)訂閱鍵空間通知
redis實例化類:
redis.class.php
1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18歲
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//遇到類別重復(fù)的報錯洗显,所有叫Redis2
classRedis2??
{
????private$redis;
????publicfunction__construct($host= '127.0.0.1', $port= 6379)
????{
????????$this->redis = newRedis();
????????$this->redis->connect($host, $port);
????}
????publicfunctionsetex($key, $time, $val)
????{
????????return$this->redis->setex($key, $time, $val);
????}
????publicfunctionset($key, $val)
????{
????????return$this->redis->set($key, $val);
????}
????publicfunctionget($key)
????{
????????return$this->redis->get($key);
????}
????publicfunctionexpire($key= null, $time= 0)
????{
????????return$this->redis->expire($key, $time);
????}
????publicfunctionpsubscribe($patterns= array(), $callback)
????{
????????$this->redis->psubscribe($patterns, $callback);
????}
????publicfunctionsetOption()
????{
????????$this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
????}
}
過期事件的訂閱:
psubscribe.php
1個
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require_once'./Redis.class.php';
$redis= new\Redis2();
// 解決Redis客戶端訂閱時候超時情況
$redis->setOption();
$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');
// 回調(diào)函數(shù),這里寫處理邏輯
functionkeyCallback($redis, $pattern, $chan, $msg)
{
????echo"Pattern: $pattern\n";
????echo"Channel: $chan\n";
????echo"Payl
????oad: $msg\n\n";
????//keyCallback為訂閱事件后的回調(diào)函數(shù)外潜,這里寫業(yè)務(wù)處理邏輯,
????//比如前面提到的商品不支付自動撤單墙懂,這里就可以根據(jù)訂單id,來實現(xiàn)自動撤單
}
設(shè)置過期事件:
index.php
1個
2
3
4
require_once'./Redis.class.php';
$redis= new\Redis2();
$order_id= 123;
$redis->setex('order_id',10,$order_id);
先用命令行模式執(zhí)行?psubscribe.php
在瀏覽器訪問?index.php
效果如下: