Yii2 教程 - yii2-redis 擴展詳解
該教程已被合並到《Yii2 權威指南中文版》中!Yiichina 教程地址為《yii2-redis 擴展詳解》!
一、簡介
yii2-redis 擴展為 Yii2 框架提供了 redis 鍵值存儲支持。包括緩存(Cache)、會話存儲處理(Session),並實現了 ActiveRecord 模式,允許您將活動記錄存儲在 redis 中。
相關鏈接
- yii2-redis 擴展網址:https://github.com/yiisoft/yii2-redis
二、安裝擴展
在 Yii2 項目根目錄,執行以下命令安裝:
$ composer require yiisoft/yii2-redis
也可以先在 composer.json 文件中聲明如下依賴:
"yiisoft/yii2-redis": "~2.0.0"
再執行下面命令安裝:
$ composer update
三、基本使用
繼續閱讀請確保已安裝並開啟了 redis 服務,安裝請參考《Redis 安裝》。
1. 配置
在組件中添加如下配置:
‘components‘ => [
‘redis‘ => [
‘class‘ => ‘yii\redis\Connection‘,
‘hostname‘ => ‘localhost‘,
‘port‘ => 6379,
‘database‘ => 0 ,
],
]
2. 示例
下面代碼演示了 redis 最基本的 string 類型的使用:
// 獲取 redis 組件
$redis = Yii::$app->redis;
// 判斷 key 為 username 的是否有值,有則打印,沒有則賦值
$key = ‘username‘;
if ($val = $redis->get($key);) {
var_dump($val);
} else {
$redis->set($key, ‘marko‘);
$redis->expire($key, 5);
}
這個類中(yii\redis\Connection
四、緩存組件
該擴展中的 yii\redis\Cache
實現了 Yii2 中的緩存相關接口,所以我們也可以用 redis 來存儲緩存,且用法和原來一樣。
1. 配置
修改組件中 cache 的 class 為 yii\redis\Cache
即可,配置如下:
‘components‘ => [
‘cache‘ => [
// ‘class‘ => ‘yii\caching\FileCache‘,
‘class‘ => ‘yii\redis\Cache‘,
],
],
如果沒有配置過 redis 組件,需要在 cache 組件下配置 redis 服務相關參數,完整配置如下:
‘components‘ => [
‘cache‘ => [
// ‘class‘ => ‘yii\caching\FileCache‘,
‘class‘ => ‘yii\redis\Cache‘,
‘redis‘ => [
‘hostname‘ => ‘localhost‘,
‘port‘ => 6379,
‘database‘ => 0,
],
],
],
2. 示例
下面代碼演示了緩存的基本使用:
// 獲取 cache 組件
$cache = Yii::$app->cache;
// 判斷 key 為 username 的緩存是否存在,有則打印,沒有則賦值
$key = ‘username‘;
if ($cache->exists($key)) {
var_dump($cache->get($key));
} else {
$cache->set($key, ‘marko‘, 60);
}
使用文件緩存(FileCache)時,緩存是存儲在 runtime/cache 目錄下;使用 redis 緩存後,緩存將存儲在 redis 數據庫中,性能將大大提高。
五、會話組件
該擴展中的 yii\redis\Session
實現了 Yii2 中的會話相關接口,所以我們也可以用 redis 來存儲會話信息,且用法和原來一樣。
1. 配置
修改組件 session 的配置,指定 class 為 yii\redis\Session
即可,配置如下:
‘components‘ => [
‘session‘ => [
‘name‘ => ‘advanced-frontend‘,
‘class‘ => ‘yii\redis\Session‘
],
],
如果沒有配置過 redis 組件,需要在 session 組件下配置 redis 服務相關參數,完整配置如下:
‘components‘ => [
‘session‘ => [
‘name‘ => ‘advanced-frontend‘,
‘class‘ => ‘yii\redis\Session‘,
‘redis‘ => [
‘hostname‘ => ‘localhost‘,
‘port‘ => 6379,
‘database‘ => 0,
],
],
],
2. 使用
在開發過程中,切記一定不要使用 PHP 原生的 $_SESSION 去操作,而要使用 Yii 提供的 session 組件,獲取方式如下:
$session = Yii::$app->session;
六、ActiveRecord
該擴展中的 yii\redis\ActiveRecord
實現了 Yii2 中的 ActiveRecord 相關接口,所以我們可以使用 AR 的方式操作 redis 數據庫。關於如何使用 Yii 的 ActiveRecord,請閱讀權威指南中有關 ActiveRecord 的基礎文檔。
定義 redis ActiveRecord 類,我們的模型需要繼承 yii\redis\ActiveRecord
,並至少實現 attributes()
方法來定義模型的屬性。
主鍵可以通過 yii\redis\ActiveRecord::primaryKey()
定義,如果未指定,則默認為 id。 primaryKey 必須在 attributes() 方法定義的屬性中,如果沒有指定主鍵,請確保 id 在屬性中。
下面定義一個 Customer 模型來演示:
class Customer extends \yii\redis\ActiveRecord
{
/**
* 主鍵 默認為 id
*
* @return array|string[]
*/
public static function primaryKey()
{
return [‘id‘];
}
/**
* 模型對應記錄的屬性列表
*
* @return array
*/
public function attributes()
{
return [‘id‘, ‘name‘, ‘age‘, ‘phone‘, ‘status‘, ‘created_at‘, ‘updated_at‘];
}
/**
* 定義和其它模型的關系
*
* @return \yii\db\ActiveQueryInterface
*/
public function getOrders()
{
return $this->hasMany(Order::className(), [‘customer_id‘ => ‘id‘]);
}
}
使用示例:
// 使用 AR 方式新增一條記錄
$customer = new Customer();
$customer->name = ‘marko‘;
$customer->age = 18;
$customer->phone = 13888888888;
$customer->status = 1;
$customer->save();
echo $customer->id;
// 使用 AR 查詢
$customer = Customer::findOne($customer->id);
$customer = Customer::find()->where([‘status‘ => 1])->all();
redis ActiveRecord 的一般用法與權威指南中數據庫的 ActiveRecord 用法非常相似。它們支持相同的接口和方法,除了以下限制:
- 由於 redis 不支持 sql,查詢方法僅限於使用以下方法:where(),limit(),offset(),orderBy() 和 indexBy()。 【 orderBy() 尚未實現:#1305)】
- 由於 redis 沒有表的概念,因此不能通過表定義關聯關系,只能通過其它記錄來定義關系。
七、直接使用命令
直接使用 redis 連接,就可以使用 redis 提供的很多有用的命令。配置好 redis 後,用以下方式獲取 redis 組件:
$redis = Yii::$app->redis;
然後就可以執行命令了,最通用的方法是使用 executeCommand 方法:
$result = $redis->executeCommand(‘hmset‘, [‘test_collection‘, ‘key1‘, ‘val1‘, ‘key2‘, ‘val2‘]);
支持的每個命令都有一些快捷方式,可以按照如下方式使用:
$result = $redis->hmset(‘test_collection‘, ‘key1‘, ‘val1‘, ‘key2‘, ‘val2‘);
有關可用命令及其參數的列表,請參閱 redis 命令:
- redis 命令英文版:http://redis.io/commands
- redis 命令中文版:http://redisdoc.com
本文首發於馬燕龍個人博客,歡迎分享,轉載請標明出處。
馬燕龍個人博客:http://www.mayanlong.com
馬燕龍個人微博:http://weibo.com/imayanlong
馬燕龍Github主頁:https://github.com/yanlongma
Yii2 教程 - yii2-redis 擴展詳解