1. 程式人生 > >php監聽redis key失效觸發回撥事件

php監聽redis key失效觸發回撥事件

一、需求分析: 
1、設定了生命時間的key,過期的時候能不能提示,能夠監聽過期的key? 
2、怎樣用redis實現定時任務? 
二、應用場景: 
在我們程式中經常會有需要定時執行的程式,比如:商品下單後半小時內不支付自動撤單等等。 
最簡單粗暴的辦法,就是寫一個程式,讓它定時執行,但是這樣對伺服器壓力比較大。 
這裡說的是用Redis去實現這樣的一個功能。 
三、Redis鍵空間通知介紹 
在 Redis 的 2.8.0 版本之後,推出了一個新的特性——鍵空間訊息(Redis Keyspace Notifications),它配合 2.0.0 版本之後的 SUBSCRIBE 就能完成這個定時任務的操作了,定時的單位是秒。 
(1)釋出訂閱: 
Redis 釋出訂閱(pub/sub)是一種訊息通訊模式:傳送者(pub)傳送訊息,訂閱者(sub)接收訊息。 
Redis 客戶端可以訂閱任意數量的頻道。舉例說明: 
1.我們先訂閱頻道名為 redisChat 
這裡寫圖片描述

 
2.現在,我們重新開啟個 redis 客戶端,然後在同一個頻道 redisChat 釋出訊息,訂閱者就能接收到訊息。 
這裡寫圖片描述 
接收到的訊息如下: 
這裡寫圖片描述 
(2)Key過期事件的Redis配置 
這裡需要配置 notify-keyspace-events 的引數為 “Ex”。x 代表了過期事件。notify-keyspace-events “Ex” 儲存配置後,重啟Redis服務,使配置生效。舉例說明: 
1.先開啟一個redis-cli客服端,訂閱所有操作,等待接收訊息 
這裡寫圖片描述 
2.再開啟一個終端,redis-cli 進入 redis,新增一個 10秒過期的鍵 
這裡寫圖片描述 
10秒過期後,接收到的訊息如下: 
這裡寫圖片描述 
四、PHP redis實現訂閱鍵空間通知 
redis例項化類:redis.class.php

class Redis
{
    private $redis;

    public function __construct($host = '127.0.0.1', $port = 6379)
    {
        $this->redis = new Redis();
        $this->redis->connect($host, $port);
    }

    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); } }
  • 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

過期事件的訂閱:psubscribe.php

require_once './Redis.class.php';
$redis = new \Redis();
// 解決Redis客戶端訂閱時候超時情況
$redis->setOption();
$redis->psubscribe(array('[email protected]__:expired'), 'keyCallback');
// 回撥函式,這裡寫處理邏輯
function keyCallback($redis, $pattern, $chan, $msg)
{
    echo "Pattern: $pattern\n";
    echo "Channel: $chan\n";
    echo "Payload: $msg\n\n";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

keyCallback為訂閱事件後的回撥函式,這裡寫業務處理邏輯,比如前面提到的商品不支付自動撤單,這裡就可以根據訂單id,來實現自動撤單 
設定過期事件:index.php

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

相關推薦

phpredis key失效觸發事件

一、需求分析: 1、設定了生命時間的key,過期的時候能不能提示,能夠監聽過期的key? 2、怎樣用redis實現定時任務? 二、應用場景: 在我們程式中經常會有需要定時執行的程式,比如:商品下單後半小時內不支付自動撤單等等。 最簡單粗暴的辦法,就是寫一個程式,讓它定時執行,

Redis系列】Spring boot實現Redis key失效事件

> talk is cheap, show me the code. ## 一、開啟Redis key過期提醒 - 方式二:修改配置檔案 `redis.conf` ``` # 預設 notify-keyspace-events "" notify-keyspace-events Ex

Android 設定軟鍵盤右下角鍵盤樣式和右下角點選

文章目錄 設定軟鍵盤右下角按鍵顯示樣式 監聽右下角點選回撥 設定軟鍵盤右下角按鍵顯示樣式 在EditText中使用android:imeOptions設定右下角顯示樣式(需要搭配 android

springboot redis 過期key事件

redis 中的key值過期後,觸發通知事件   1、建立springboot工程,建立監聽類   maven配置 <dependencies> <dependency> <groupId>org.springfr

SpringBoot2redis過期的key

1、修改Redis配置 把  #  notify-keyspace-events Ex 前面的註釋去掉,然後重啟redis 2、pom檔案新增 <dependency> <groupId>org.

redis過期的key

一:需要監聽過期的redis keys     在redis.conf 裡新增 notify-keyspace-events "Ex" ,放到配置引數的最後。二:不需要賬號密碼訪問     改變redis.conf 裡的protected-mode 的屬性值為 no三:去掉繫

事件事件

一、事件監聽涉及到三個類物件 1、EventSource(事件源)事件發生的場所 2、Event(事件):事件封裝介面元件上面發生的特定事件 3、EventListener(事件監聽器):負責監聽事件源發生的事件     二、監聽器就是程式中的MyC

Vue.js父元件$on無法子元件$emit觸發事件解決辦法

Vue.js父元件$on無法監聽子元件$emit觸發事件解決辦法 最近學習vuejs看例子中用$on無法監聽子元件$emit觸發事件: 使用版本 vue.js 2.2.5 參考文獻 1.v

pyHook用戶鼠標、鍵盤事件

word 日期 version 消息 彈出 lin .py cti ros 一、代碼部分:獲取用戶輸入信息,並與截圖一起保存到XX目錄下 # -*- coding: utf-8 -*- # import pythoncom import pyHook i

Echarts 裏的地圖縮放事件

echarts 監聽地圖縮放事件 // 獲取百度地圖實例,使用百度地圖自帶的控件 var bmap = myChart.getModel().getComponent(‘bmap‘).getBMap(); bmap.setMapStyle({style:‘normal‘}); bmap

android 通過edittext實現button的點擊事件

監聽 edittext 如果你沒有接第三方的輸入設備,那麽點擊按鈕只需找到你的button然後:button.performClick();就可以了那麽如果你用到第三方輸入法,有些時候監聽就沒有這麽好使了:以下場景為:外接輸入服務,直接給我丟一串字符,我拿到字符後執行按鈕事件代碼如下: editTe

Xamarin.Forms Button的按下、釋放事件

pre generic ews sed nth lose con isp 技術 Xamarin.Forms 監聽Button的按下、釋放事件 工作中遇到這樣的一個需求,模仿微信發生語音功能,需要實現按鈕按下開始錄音,按鈕釋放錄音結束, Xamarin.Forms中Butto

瀏覽器返回,pushState,popstate 事件,window.history對象

當前 rep www 簡單介紹 itl 成了 stat 直接 clas 在WebApp或瀏覽器中,會有點擊返回、後退、上一頁等按鈕實現自己的關閉頁面、調整到指定頁面、確認離開頁面或執行一些其它操作的需求。可以使用 popstate 事件進行監聽返回、後退、上一頁操作。 一、

php陣列元素的遍歷與處理

/** * 陣列函式__回撥處理 * 1.array_filter($arr, $callback):用回撥過濾陣列 * 2.array_walk(&$arr, $callback($val,$key,$data),$data的值) */   /** * 一、array_f

PHPPHP服務端支付寶支付及

支付寶支付 (由app端自行調起支付寶/微信) <?php define('IN_ECS', true); /*App支付 PHP服務端*/ /*引入支付寶PHP SDK*/ header("Content-type:text/html;charset=ut

H5搖一搖和手機傾斜事件(重力感應)

搖一搖功能(DeviceMotion) 搖一搖功能是很多原生APP都可以實現的功能,如微信中的搖一搖找好友,QQ音樂中的搖一搖換歌等。它們都是利用了手機加速感測器提供的API,當監聽到手機加速變化的事件時,根據獲取的加速值來執行不同的動作。 Web APP中HTML

AlarmManager 怎樣在程序被幹掉的情況下觸發

我用 AlarmManager.setRepeating 設定了一個重複的回撥,程序還在的時候能正常呼叫。 把程序殺掉後,這個定時器就不會被觸發了,要怎樣設定才能保證定時器會被觸發 // 啟動程式碼     void InitAlarm()     {           

(轉)jquery div大小變化函式|div resize事件

https://blog.csdn.net/mengzhengjie/article/details/72829828  (原文連結)   視窗有大小改變的監聽事件,卻不適用於div window.onresize = function(){}  

EditText輸入完成和設定點選事件時與父控制元件的衝突問題

最近在做專案時,發現一個問題,最後找到了解決辦法,特在此記錄一下,便於以後自己回憶以及和大家分享 問題描述:我在專案的頁面B放了一個線性佈局,裡面有EditText,本意是從A頁面跳轉到B頁面時,可能會先做別的操作,在修改EditText裡面的內容(闡述一下:

iOS微信分享不觸發函式onResp()解決方法

此問題最近困擾了我三天,檢查專案程式碼與網上方法對照,並沒有發現不對的地方,跟斷點除錯,只發現微信分享後微信端並沒有給應用反饋,onResp()沒有觸發。 問題描述: 線上iOS使用者在第三方應用點選微信分享,無法執行分享後的操作。 用iPhone