当前位置:首页 > PHP教程 > php高级应用 > 列表

php监听redis key失效触发回调事件

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-26 10:31:00 浏览: 评论:0 

订单超时、活动过期解决方案:php监听redis key失效触发回调事件

Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的单位是秒。

1.我们先订阅频道名为 redisChat

php监听redis key失效触发回调事件

2.现在,我们重新开启个 redis 客户端,然后在同一个频道 redisChat 发布消息,订阅者就能接收到消息。

php监听redis key失效触发回调事件

接收到的消息如下:

php监听redis key失效触发回调事件

3.Key过期事件的Redis配置

这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件。notify-keyspace-events “Ex” 保存配置后,重启Redis服务,使配置生效。

PHP redis实现订阅键空间通知

redis实例化类:

redis.class.php

  1. //遇到类别重复的报错,所有叫Redis2 
  2.  
  3. class Redis2    
  4.  
  5.  
  6.     private $redis
  7.  
  8.    
  9.  
  10.     public function __construct($host = '127.0.0.1'$port = 6379) 
  11.  
  12.     { 
  13.  
  14.         $this->redis = new Redis(); 
  15.  
  16.         $this->redis->connect($host$port); 
  17.  
  18.     } 
  19.  
  20.    
  21.  
  22.     public function setex($key$time$val
  23.  
  24.     { 
  25.  
  26.         return $this->redis->setex($key$time$val); 
  27.  
  28.     } 
  29.  
  30.    
  31.  
  32.     public function set($key$val
  33.  
  34.     { 
  35.  
  36.         return $this->redis->set($key$val); 
  37.  
  38.     } 
  39.  
  40.    
  41.  
  42.     public function get($key
  43.  
  44.     { 
  45.  
  46.         return $this->redis->get($key); 
  47.  
  48.     } 
  49.  
  50.    
  51.  
  52.     public function expire($key = null, $time = 0) 
  53.  
  54.     { 
  55.  
  56.         return $this->redis->expire($key$time); 
  57.  
  58.     } 
  59.  
  60.    
  61.  
  62.     public function psubscribe($patterns = array(), $callback
  63.  
  64.     { 
  65.  
  66.         $this->redis->psubscribe($patterns$callback); 
  67.  
  68.     } 
  69.  
  70.    
  71.  
  72.     public function setOption() 
  73.  
  74.     { 
  75.  
  76.         $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1); 
  77.  
  78.     } 
  79.  
  80.    
  81.  

过期事件的订阅:

psubscribe.php

  1. require_once './Redis.class.php'
  2.  
  3. $redis = new \Redis2(); 
  4.  
  5. // 解决Redis客户端订阅时候超时情况 
  6.  
  7. $redis->setOption(); 
  8.  
  9. $redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback'); 
  10.  
  11. // 回调函数,这里写处理逻辑 
  12.  
  13. function keyCallback($redis$pattern$chan$msg
  14.  
  15.  
  16.     echo "Pattern: $pattern\n"
  17.  
  18.     echo "Channel: $chan\n"
  19.  
  20.     echo "Payl 
  21.  
  22.     oad: $msg\n\n"; 
  23.  
  24.     //keyCallback为订阅事件后的回调函数,这里写业务处理逻辑, 
  25.  
  26.     //比如前面提到的商品不支付自动撤单,这里就可以根据订单id,来实现自动撤单  
  27.  

设置过期事件:

index.php

  1. require_once './Redis.class.php'
  2.  
  3. $redis = new \Redis2(); 
  4.  
  5. $order_id = 123; 
  6.  
  7. $redis->setex('order_id',10,$order_id); 

先用命令行模式执行 psubscribe.php

在浏览器访问 index.php

效果如下:

php监听redis key失效触发回调事件

Tags: php监听redis key失效

分享到: