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
相關推薦
php監聽redis 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
SpringBoot2監聽redis過期的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
【PHP】PHP服務端支付寶支付及回撥
支付寶支付 (由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