[TOC]
### **1、簡介**
[Redis](http://redis.io/)是一個開源的、高級的鍵值對存儲系統,經常被用作[數據結構](http://laravelacademy.org/tags/%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84 "View all posts in 數據結構")服務器,因為其支持[字符串](http://redis.io/topics/data-types#strings)、[Hash](http://redis.io/topics/data-types#hashes)、[列表](http://redis.io/topics/data-types#lists)、[集合](http://redis.io/topics/data-types#sets)和[有序集合](http://redis.io/topics/data-types#sorted-sets)等數據結構。在[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")中使用[Redis](http://laravelacademy.org/tags/redis "View all posts in Redis")之前,需要通過Composer安裝`[predis](http://laravelacademy.org/tags/predis "View all posts in predis")/predis`包(~1.0)。
#### **配置**
應用的Redis配置位于配置文件`config/database.php`。在這個文件中,可以看到包含被應用使用的Redis服務器的`redis`數組:
~~~
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
~~~
默認服務器配置可以滿足開發需要,然而,你可以基于環境隨意修改該數組,只需要給每個Redis服務器一個名字并指定該Redis服務器使用的主機和接口。
`cluster`選項告訴Laravel Redis 客戶端在多個Redis節點間執行客戶端分片,從而形成節點池并創建大量有效的RAM。然而,客戶端分片并不處理故障轉移,所以,非常適合從另一個主數據存儲那里獲取有效的緩存數據。
此外,你可以在Redis連接定義中定義options數組值,從而允許你指定一系列Predis[客戶端選項](https://github.com/nrk/predis/wiki/Client-Options)。
如果Redis服務器要求認證信息,你可以通過添加`password`配置項到Redis服務器配置數組來提供密碼。
> 注意:如果你通過PECL安裝PHP的Redis擴展,需要在?`config/app.php`?文件中修改Redis的別名。
### **2、基本使用**
你可以通過調用`Redis`[門面](http://laravelacademy.org/post/2920.html)上的多個方法來與Redis進行交互,該門面支持動態方法,所以你可以任何[Redis命令](http://redis.io/commands),該命令將會直接傳遞給Redis,在本例中,我們通過調用`Redis`門面上的`get`方法來調用Redis上的GET命令:
~~~
<?php
namespace App\Http\Controllers;
use Redis;use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 顯示指定用戶屬性
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
$user = Redis::get('user:profile:'.$id);
return view('user.profile', ['user' => $user]);
}
}
~~~
當然,如上所述,可以在`Redis`門面上調用任何Redis命令。Laravel使用魔術方法將命令傳遞給Redis服務器,所以只需簡單傳遞參數和Redis命令如下:
~~~
Redis::set('name', 'Taylor');
$values = Redis::lrange('names', 5, 10);
~~~
此外還可以使用`command`方法傳遞命令到服務器,該方法接收命令名作為第一個參數,參數值數組作為第二個參數:
~~~
$values = Redis::command('lrange', ['name', 5, 10]);
~~~
##### **使用多個Redis連接**
你可以通過調用`Redis::connection`方法獲取Redis實例:
~~~
$redis = Redis::connection();
~~~
這將會獲取默認Redis服務器實例,如果你沒有使用服務器集群,可以傳遞服務器名到`connection`方法來獲取指定Redis配置中定義的指定服務器:
~~~
$redis = Redis::connection('other');
~~~
#### **[管道](http://laravelacademy.org/tags/%e7%ae%a1%e9%81%93 "View all posts in 管道")命令**
當你需要在一次操作中發送多個命令到服務器的時候應該使用管道,`pipeline`方法接收一個參數:接收Redis實例的閉包。你可以將所有Redis命令發送到這個Redis實例,然后這些命令會在一次操作中被執行:
~~~
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
~~~
### **3、[發布](http://laravelacademy.org/tags/%e5%8f%91%e5%b8%83 "View all posts in 發布")/[訂閱](http://laravelacademy.org/tags/%e8%ae%a2%e9%98%85 "View all posts in 訂閱")**
Redis還提供了調用Redis的`publish`和`subscribe`命令的接口。這些Redis命令允許你在給定“頻道”監聽消息,你可以從另外一個應用發布消息到這個頻道,甚至使用其它編程語言,從而允許你在不同的應用/進程之間輕松通信。
首先,讓我們使用`subscribe`方法通過Redis在一個頻道上設置監聽器。由于調用`subscribe`方法會開啟一個常駐進程,我們將在[Artisan命令](http://laravelacademy.org/post/3106.html)中調用該方法:
~~~
<?php
namespace App\Console\Commands;
use Redis;
use Illuminate\Console\Command;
class RedisSubscribe extends Command{
/**
* 控制臺命令名稱
*
* @var string
*/
protected $signature = 'redis:subscribe';
/**
* 控制臺命令描述
*
* @var string
*/
protected $description = 'Subscribe to a Redis channel';
/**
* 執行控制臺命令
*
* @return mixed
*/
public function handle()
{
Redis::subscribe(['test-channel'], function($message) {
echo $message;
});
}
}
~~~
現在,我們可以使用`publish`發布消息到該頻道:
~~~
Route::get('publish', function () {
// 路由邏輯...
Redis::publish('test-channel', json_encode(['foo' => 'bar']));
});
~~~
##### **通配符訂閱**
使用`psubscribe`方法,你可以訂閱到一個通配符定義的頻道,這在所有相應頻道上獲取所有消息時很有用。`$channel`名將會作為第二個參數傳遞給提供的回調閉包:
~~~
Redis::psubscribe(['*'], function($message, $channel) {
echo $message;
});
Redis::psubscribe(['users.*'], function($message, $channel) {
echo $message;
});
~~~
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統