Laravel 6.x 使用 keyspace notification 監(jiān)聽不到 Key 過期事件

場景使用:假設(shè)有一個訂單 30 分鐘以后未付款 自動關(guān)閉該訂單潘懊》谱欤或者會員到期自動提醒續(xù)費等等拘哨。

這個在 Laravel 中其實有更好的選擇方式 隊列,使用延時隊列

ProcessPodcast::dispatch($podcast)->delay(now()->addMinutes(30));

但是我還想到一種方案就是使用?Redis?的鍵空間通知(keyspace notification)互广。意思就是當 Redis 的 key 刪除是,回主動通知發(fā)送消息給我們,我們只需要監(jiān)聽訂閱對應(yīng)的事件即可惫皱。

接下來我還原事情經(jīng)過像樊。說一下我遇到的問題,以及最后是如何解決的旅敷。

首先 Redis 的?keyspace notification?默認是不開啟的生棍。我們需要主動開啟,開啟方式如下 修改 redis.conf 配置文件 找到?notify-keyspace-events ""?默認是空字符串媳谁,表示未開啟.

notify-keyspace-events "Ex"

然后重啟?Redis

或者直接 redis-cli 下輸入如下命令進行修改

redis-cli configsetnotify-keyspace-eventsEx

具體?Ex?代表啥意思 參考如下表格:

接下來在 Laravel 中涂滴,我是新建一個 Command 命令

php artisan make:commandOrderExpire

內(nèi)容如下:

<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use Illuminate\Support\Facades\Redis;classOrderExpireextendsCommand{

? ? /**? ? * The name and signature of the console command.? ? *? ? *@varstring? ? */? ? protected $signature = 'order:expire';

? ? /**? ? * The console command description.? ? *? ? *@varstring? ? */? ? protected $description = '處理訂單失效';

? ? /**? ? * Create a new command instance.? ? *? ? *@returnvoid? ? */? ? public function__construct(){

? ? ? ? parent::__construct();

? ? }

? ? /**? ? * Execute the console command.? ? *? ? *@returnint? ? */? ? public functionhandle(){

? ? ? ? $redis = Redis::connection('publisher');

? ? ? ? Redis::subscribe(['__keyevent@0__:expired'], function($message, $channel){

? ? ? ? ? ? // 處理訂單失效 邏輯? ? ? ? ? ? echo '訂單已失效';

? ? ? ? });

? ? }

}

?>

在?config?下?database.php?中 redis 配置里添加 如下內(nèi)容:

'publisher' => [

? ? 'host' => env('REDIS_HOST', '127.0.0.1'),

? ? 'password' => env('REDIS_PASSWORD', null),

? ? 'port' => env('REDIS_PORT', 6379),

? ? 'database' => 0,

? ? 'read_timeout' => 0,

? ? 'persistent' => true,

? ? 'read_write_timeout' => 0,

],

在 路由文件下 編寫?Redis?鍵 到期命令晴音,設(shè)置 5 秒失效

use Illuminate\Support\Facades\Redis;

Route::get('/', function(){

? ? Redis::setex('order_2000123421',5,'2000123421');

});

接下來運行行項目

我們首先在 Laravel 項目中運行 控制臺命令

php? artisan? order:expire

接下來在 red-cli 中也監(jiān)聽過期命令

redis-cli127.0.0.1:6379> psubscribe __keyevent@0__:expired

Reading messages... (press Ctrl-C to quit)

1) "psubscribe"

2) "__keyevent@0__:expired"

3) (integer) 1

1) "pmessage"

2) "__keyevent@0__:expired"

3) "__keyevent@0__:expired"

訪問路由文件柔纵,設(shè)置 Redis Key,但是你會發(fā)現(xiàn)實際上我們編寫的控制臺命令锤躁,Redis 5 秒過后并不會觸發(fā)任何事件搁料。而 redis-cli 5 秒以后會監(jiān)聽到。

下面是 redis-cli 的結(jié)果:?

下圖是 Laravel 項目的結(jié)果进苍,過一定事件還會出現(xiàn)連接錯誤:

這個問題糾結(jié)了挺久加缘。最后解決方案如下:

解決方案

不使用 Laravel 自帶的?Redis?門面,改為原生?Redis?觉啊。修改 handle 方法

$redis = new \Redis();

$redis->connect('127.0.0.1', '6379');

$redis->auth('Reids密碼');

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

$redis->subscribe(['__keyevent@0__:expired'], function($instance,$channelName, $message) {

? ? ? ? ? ? ? ? var_dump($channelName);

? ? var_dump($message);

});

原鏈接地址:https://laravelcode.cn/posts/159/laravel-7x-uses-keyspace-notification-to-listen-for-non-key-expiration-events

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拣宏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子杠人,更是在濱河造成了極大的恐慌勋乾,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗡善,死亡現(xiàn)場離奇詭異辑莫,居然都是意外死亡,警方通過查閱死者的電腦和手機罩引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門各吨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袁铐,你說我怎么就攤上這事揭蜒。” “怎么了剔桨?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵屉更,是天一觀的道長。 經(jīng)常有香客問我洒缀,道長瑰谜,這世上最難降的妖魔是什么欺冀? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮萨脑,結(jié)果婚禮上隐轩,老公的妹妹穿的比我還像新娘。我一直安慰自己砚哗,他們只是感情好龙助,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛛芥,像睡著了一般提鸟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仅淑,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天称勋,我揣著相機與錄音,去河邊找鬼涯竟。 笑死赡鲜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的庐船。 我是一名探鬼主播银酬,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼筐钟!你這毒婦竟也來了揩瞪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤篓冲,失蹤者是張志新(化名)和其女友劉穎李破,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹将,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡嗤攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诽俯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妇菱。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暴区,靈堂內(nèi)的尸體忽然破棺而出闯团,到底是詐尸還是另有隱情,我是刑警寧澤颜启,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布偷俭,位于F島的核電站浪讳,受9級特大地震影響缰盏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一口猜、第九天 我趴在偏房一處隱蔽的房頂上張望负溪。 院中可真熱鬧,春花似錦济炎、人聲如沸川抡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崖堤。三九已至,卻和暖如春耐床,著一層夾襖步出監(jiān)牢的瞬間密幔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工撩轰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胯甩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓堪嫂,卻偏偏與公主長得像偎箫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皆串,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348