# 服務 —— Redis
## 1、簡介
[Redis](http://redis.io/)是一個開源的、高級的鍵值對存儲系統,經常被用作數據結構服務器,因為其支持[字符串](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中使用Redis/predis`包(~1.0)。
### 1.1?配置
應用的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/97.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');
~~~
### 2.1?管道命令
當你需要在一次操作中發送多個命令到服務器的時候應該使用管道,`pipeline`方法接收一個參數:接收Redis實例的閉包。你可以將所有Redis命令發送到這個Redis實例,然后這些命令會在一次操作中被執行:
~~~
Redis::pipeline(function ($pipe) {
for ($i = 0; $i < 1000; $i++) {
$pipe->set("key:$i", $i);
}
});
~~~
## 3、發布
Redis還提供了調用Redis的`publish`和`subscribe`命令的接口。這些Redis命令允許你在給定“頻道”監聽消息,你可以從另外一個應用發布消息到這個頻道,甚至使用其它編程語言,從而允許你在不同的應用/進程之間輕松通信。
首先,讓我們使用`subscribe`方法通過Redis在一個頻道上設置監聽器。由于調用`subscribe`方法會開啟一個常駐進程,我們將在[Artisan命令](http://laravelacademy.org/post/170.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']));
});
~~~
### 3.1?通配符訂閱
使用`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模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證