国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - Redis在Laravel項目中的應用實例詳解

Redis在Laravel項目中的應用實例詳解

2021-06-15 16:07JellyBean PHP教程

這篇文章主要給大家介紹了關于Redis在Laravel項目中應用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用laravel具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。

前言

本文主要給大家介紹了關于RedisLaravel項目中的應用實例,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

在初步了解Redis在Laravel中的應用 那么我們試想這樣的一個應用場景 一個文章或者帖子的瀏覽次數的統計 如果只是每次增加一個瀏覽量

就到數據庫新增一個數據 如果請求來那個太大這對數據庫的消耗也就不言而喻了吧 那我們是不是可以有其他的解決方案

這里的解決方案就是 即使你的網站的請求量很大 那么每次增加一個訪問量就在緩存中去進行更改 至于刷新Mysql數據庫可以自定義為

多少分鐘進行刷新一次或者訪問量達到一定數量再去刷新數據庫 這樣數據也是準確的 效率也比直接每次刷新數據庫要高出許多了

既然給出了相應的解決方案 我們就開始實施

我們以一篇帖子的瀏覽為例 我們先去創建對應的控制器

?
1
$ php artisan make:controller PostController

再去生成需要用到的 Model

?
1
$ php artisan make:model Post -m

填寫posts的遷移表的字段內容

?
1
2
3
4
5
6
7
Schema::create('posts', function (Blueprint $table) {
 $table->increments('id');
 $table->string("title");
 $table->string("content");
 $table->integer('view_count')->unsigned();
 $table->timestamps();
});

還有就是我們測試的數據的Seeder填充數據

?
1
2
3
4
5
6
7
$factory->define(App\Post::class, function (Faker\Generator $faker) {
 return [
 'title' => $faker->sentence,
 'content' => $faker->paragraph,
 'view_count' => 0
 ];
});

定義帖子的訪問路由

?
1
Route::get('/post/{id}', 'PostController@showPost');

當然我們還是需要去寫我們訪問也就是瀏覽事件的(在app/providers/EventServiceProvider中定義)

?
1
2
3
4
5
6
protected $listen = [
 'App\Events\PostViewEvent' => [
//  'App\Listeners\EventListener',
  'App\Listeners\PostEventListener',
 ],
 ];

執行事件生成監聽

?
1
$ php artisan event:generate

之前定義了相關的路由方法 現在去實現一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public function showPost(Request $request,$id)
{
 //Redis緩存中沒有該post,則從數據庫中取值,并存入Redis中,該鍵值key='post:cache'.$id生命時間5分鐘
 $post = Cache::remember('post:cache:'.$id, $this->cacheExpires, function () use ($id) {
 return Post::whereId($id)->first();
 });
 
 //獲取客戶端請求的IP
 $ip = $request->ip();
 
 //觸發瀏覽次數統計時間
 event(new PostViewEvent($post, $ip));
 
 return view('posts.show', compact('post'));
}

這里看的出來就是以Redis作為緩存驅動 同樣的 會獲取獲取的ip目的是防止同一個ip多次刷新來增加瀏覽量

同樣的每次瀏覽會觸發我們之前定義的事件 傳入我們的post和id參數

Redis的key的命名以:分割 這樣可以理解為一個層級目錄 在可視化工具里就可以看的很明顯了

接下來就是給出我們的posts.show的視圖文件

?
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
42
43
44
45
46
47
<html lang="en">
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <title>Bootstrap Template</title>
 <!-- 新 Bootstrap 核心 CSS 文件 -->
 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="external nofollow" >
 <style>
 html,body{
  width: 100%;
  height: 100%;
 }
 *{
  margin: 0;
  border: 0;
 }
 .jumbotron{
  margin-top: 10%;
 }
 .jumbotron>span{
  margin: 10px;
 }
 </style>
</head>
<body>
<div class="container">
 <div class="row">
 <div class="col-xs-12 col-md-12">
  <div class="jumbotron">
  <h1>Title:{{$post->title}}</h1>
  <span class="glyphicon glyphicon-eye-open" aria-hidden="true"> {{$post->view_count}} views</span>
  <p>Content:{{$post->content}}</p>
  </div>
 </div>
 </div>
</div>
 
<!-- jQuery文件-->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script>
 
</script>
</body>
</html>

初始化我們的事件就是接收一下這些參數即可

?
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
class PostViewEvent
{
 use Dispatchable, InteractsWithSockets, SerializesModels;
 
 public $ip;
 public $post;
 
 
 /**
 * PostViewEvent constructor.
 * @param Post $post
 * @param $ip
 */
 public function __construct(Post $post, $ip)
 {
 $this->post = $post;
 $this->ip = $ip;
 }
 
 /**
 * Get the channels the event should broadcast on.
 *
 * @return Channel|array
 */
 public function broadcastOn()
 {
 return new PrivateChannel('channel-name');
 }
}

最主要的還是編寫我們的監聽事件:

?
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
class PostEventListener
{
 /**
 * 一個帖子的最大訪問數
 */
 const postViewLimit = 20;
 
 /**
 * 同一用戶瀏覽同一個帖子的過期時間
 */
 const ipExpireSec = 200;
 
 /**
 * Create the event listener.
 *
 */
 public function __construct()
 {
 
 }
 
 
 /**
 * @param PostViewEvent $event
 */
 public function handle(PostViewEvent $event)
 {
 $post = $event->post;
 $ip = $event->ip;
 $id = $post->id;
 //首先判斷下ipExpireSec = 200秒時間內,同一IP訪問多次,僅僅作為1次訪問量
 if($this->ipViewLimit($id, $ip)){
  //一個IP在300秒時間內訪問第一次時,刷新下該篇post的瀏覽量
  $this->updateCacheViewCount($id, $ip);
 }
 }
 
 /**
 * 限制同一IP一段時間內得訪問,防止增加無效瀏覽次數
 * @param $id
 * @param $ip
 * @return bool
 */
 public function ipViewLimit($id, $ip)
 {
 $ipPostViewKey = 'post:ip:limit:'.$id;
 //Redis命令SISMEMBER檢查集合類型Set中有沒有該鍵,Set集合類型中值都是唯一
 $existsInRedisSet = Redis::command('SISMEMBER', [$ipPostViewKey, $ip]);
 //如果集合中不存在這個建 那么新建一個并設置過期時間
 if(!$existsInRedisSet){
  //SADD,集合類型指令,向ipPostViewKey鍵中加一個值ip
  Redis::command('SADD', [$ipPostViewKey, $ip]);
  //并給該鍵設置生命時間,這里設置300秒,300秒后同一IP訪問就當做是新的瀏覽量了
  Redis::command('EXPIRE', [$ipPostViewKey, self::ipExpireSec]);
  return true;
 }
 return false;
 }
 
 /**
 * 達到要求更新數據庫的瀏覽量
 * @param $id
 * @param $count
 */
 public function updateModelViewCount($id, $count)
 {
 //訪問量達到300,再進行一次SQL更新
 $post = Post::find($id);
 $post->view_count += $count;
 $post->save();
 }
 
 /**
 * 不同用戶訪問,更新緩存中瀏覽次數
 * @param $id
 * @param $ip
 */
 public function updateCacheViewCount($id, $ip)
 {
 $cacheKey = 'post:view:'.$id;
 //這里以Redis哈希類型存儲鍵,就和數組類似,$cacheKey就類似數組名 如果這個key存在
 if(Redis::command('HEXISTS', [$cacheKey, $ip])){
  //哈希類型指令HINCRBY,就是給$cacheKey[$ip]加上一個值,這里一次訪問就是1
  $save_count = Redis::command('HINCRBY', [$cacheKey, $ip, 1]);
  //redis中這個存儲瀏覽量的值達到30后,就去刷新一次數據庫
  if($save_count == self::postViewLimit){
  $this->updateModelViewCount($id, $save_count);
  //本篇post,redis中瀏覽量刷進MySQL后,就把該篇post的瀏覽量清空,重新開始計數
  Redis::command('HDEL', [$cacheKey, $ip]);
  Redis::command('DEL', ['laravel:post:cache:'.$id]);
  }
 }else{
  //哈希類型指令HSET,和數組類似,就像$cacheKey[$ip] = 1;
  Redis::command('HSET', [$cacheKey, $ip, '1']);
 }
 }
}

最后可以通過我們的工具查看具體效果

Redis在Laravel項目中的應用實例詳解

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

相關鏈接

Redis 命令

原文鏈接:https://segmentfault.com/a/1190000010576277

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美激情视频一区二区三区在线播放 | 大片免费播放在线观看视频 | 色综合久久久久久久久久久 | 欧美影| 国产高清精品一区 | 成人精品一区二区 | 日韩视频精品 | 久久久久这里只有精品 | 免费午夜电影 | 国变精品美女久久久久av爽 | 午夜影视免费观看 | 成人免费视频观看 | 久久久久久久久99精品 | 欧美精品1区2区3区 日本电影中文字幕 | 国产成人精品一区二区在线 | 久久精品99久久 | 国产白浆在线观看 | 亚洲成人精品在线 | 亚洲精品中文字幕在线观看 | 国产精品久久久久无码av | 一区二区三区视频免费在线观看 | 日韩久久久久久 | 国产91久久久久蜜臀青青天草二 | 在线观看国产一区 | 91精品国产乱码久 | 伊人网站| 精品国产乱码久久久久久丨区2区 | 国产成人精品一区二 | 国产精品视频一区二区三区不卡 | 一区二区在线免费观看 | 亚洲精品一二三 | 五月婷婷网站 | 日韩欧美二区 | 亚洲激情在线视频 | 中文字幕欧美在线 | 中文字幕在线不卡 | 一区二区三区久久 | 日韩中文字幕一区二区 | 丁香综合| 欧美视频第一页 | 九九av|