日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

laravel redis mysql_Laravel 5.1 Redis 缓存配合 MySQL 数据库实现「用户最后活跃时间」功能...

發布時間:2025/3/19 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 laravel redis mysql_Laravel 5.1 Redis 缓存配合 MySQL 数据库实现「用户最后活跃时间」功能... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

今日給 PHPHub 開發了記錄用戶「最后活躍時間」的小功能,現在趁著熱乎將相關實現邏輯寫出來,歡迎大家指出不足。

基本思路

通過 Middleware 捕獲用戶的所有請求;

記錄用戶的請求時間,將數據放入緩存 (Redis) 中;

通過 Cron 每十分鐘將緩存 (Redis) 里的數據同步到數據庫中;

讀取數據:先從 Redis 中讀取數據,如 Redis 中沒有,則從數據庫中獲取數據并同步到 Redis 中。

下文中我將針對每一個步驟進行詳細說明。

捕獲用戶的所有請求

只有捕獲用戶的所有請求,我們才能實時的記錄用戶的最后活躍時間。在這里我們通過 中間件 來實現此邏輯。以下是生成中間件的具體操作:

1). 運行以下命令,生成 RecordLastActivedTime 中間件。

php artisan make:middleware RecordLastActivedTime

2). 在 app/Http/Kernel.php 中添加以下配置,將 RecordLastActivedTime 設置為全局中間件。

protected $middleware = [

...

\App\Http\Middleware\RecordLastActivedTime::class,

];

3). 在 app\Http\Middleware\RecordLastActivedTime.php 文件中添加邏輯代碼

...

use Closure;

use Auth;

class RecordLastActivedTime

{

public function handle($request, Closure $next)

{

if (Auth::check()) {

// 在這里記錄用戶的訪問時間,下文將介紹此方法。

Auth::user()->recordLastActivedAt();

}

return $next($request);

}

}

這樣登錄用戶在訪問我們網站任何一個頁面時,都會進入到 RecordLastActivedTime 中,接下來我們將處理「記錄用戶請求時間」的邏輯。

記錄用戶的請求時間,將數據放入 Redis 中

現在,我們需要將用戶的「最后活躍時間」存放到 Redis 中,并且接下來的讀寫操作都在 Redis 里進行,以減少數據庫的開銷。下面是具體操作:

1). 在 app/Models/User.php 中添加以下方法:

public function recordLastActivedAt()

{

$now = Carbon::now()->toDateTimeString();

// 這個 Redis 用于數據庫更新,數據庫每同步一次則清空一次該 Redis 。

$update_key = 'actived_time_for_update';

$update_data = Cache::get($update_key);

$update_data[$this->id] = $now;

Cache::forever($update_key, $update_data);

// 這個 Redis 用于讀取,每次要獲取活躍時間時,先到該 Redis 中獲取數據。

$show_key = 'actived_time_data';

$show_data = Cache::get($show_key);

$show_data[$this->id] = $now;

Cache::forever($show_key, $show_data);

}

actived_time_for_update 和 actived_time_data 的數據結構如下:

array:4 [

1 => "2016-07-31 16:05:44"

2 => "2016-07-31 16:04:48"

3 => "2016-07-30 22:06:48"

4 => "2016-07-29 08:04:11"

]

2). 在 RecordLastActivedTime 中間件中調用 recordLastActivedAt

class RecordLastActivedTime

{

public function handle($request, Closure $next)

{

if (Auth::check()) {

Auth::user()->recordLastActivedAt();

}

return $next($request);

}

}

至此,只要登錄的用戶每訪問一次網站,都會將其「最后活躍時間」記錄到 Redis 中。

定期將 Redis 里的數據同步到數據庫中

完成了上兩步操作后,現在已經能獲取到用戶的「最后活躍時間」了,不過為了保證數據的完整性,我們需要定期將 Redis 數據同步到數據庫中,否則一旦 Redis 出問題或者執行了 Redis 清理操作,用戶的「最后活躍時間」將會丟失。

我的方案是編寫一個同步命令 SyncUserActivedTime,然后在計劃任務里設置每 10 分鐘運行該命令。以下是具體操作:

1). 運行以下命令添加 console

php artisan make:console SyncUserActivedTime --command=phphub:sync-user-actived-time

2). 在 app\Console\Commands\SyncUserActivedTime 添加邏輯代碼

...

use Illuminate\Console\Command;

use App\Models\User;

use Cache;

class SyncUserActivedTime extends Command

{

protected $signature = 'phphub:sync-user-actived-time';

protected $description = 'Sync user actived time';

public function __construct()

{

parent::__construct();

}

public function handle()

{

// 注意這里獲取的 Redis key 為 actived_time_for_update

// 獲取完以后立馬刪除,這樣就只更新需要更新的用戶數據

$data = Cache::pull('actived_time_for_update'));

if (!$data) {

$this->error('Error: No Data!');

return false;

}

foreach ($data as $user_id => $last_actived_at) {

User::query()->where('id', $user_id)

->update(['last_actived_at' => $last_actived_at]);

}

$this->info('Done!');

}

}

3). 在 app/Console/Kernel.php 添加以下配置,生成 計劃任務。

protected $commands = [

...

// 注冊命令

Commands\SyncUserActivedTime::class,

];

protected function schedule(Schedule $schedule)

{

...

// 設置為每 10 分鐘運行一次該命令。

$schedule->command('phphub:sync-user-actived-time')->everyTenMinutes();

}

獲取用戶的「最后活躍時間」

在 UserPresenter 添加以下方法

public function lastActivedAt()

{

$show_key = 'actived_time_data';

$show_data = Cache::get($show_key);

// 如果 Redis 中沒有,則從數據庫里獲取,并同步到 Redis 中

if (!isset($show_data[$this->id])) {

$show_data[$this->id] = $this->last_actived_at;

Cache::forever($show_key, $show_data);

}

return $show_data[$this->id];

}

然后在需要展示的頁面調用 lastActivedAt 即可,例如:

User::find(1)->present()->lastActivedAt;

如果你沒有使用 present,可以將此方法寫到 app/Models/User.php 中。

以上。

總結

以上是生活随笔為你收集整理的laravel redis mysql_Laravel 5.1 Redis 缓存配合 MySQL 数据库实现「用户最后活跃时间」功能...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。