該教程已被合併到《Yii2 權威指南中文版》中!Yiichina 教程地址爲《yii2-redis 擴展詳解》!php
yii2-redis 擴展爲 Yii2 框架提供了 redis 鍵值存儲支持。包括緩存(Cache)、會話存儲處理(Session),並實現了 ActiveRecord 模式,容許您將活動記錄存儲在 redis 中。html
在 Yii2 項目根目錄,執行如下命令安裝:git
$ composer require yiisoft/yii2-redis
也能夠先在 composer.json 文件中聲明以下依賴:github
"yiisoft/yii2-redis": "~2.0.0"
再執行下面命令安裝:redis
$ composer update
繼續閱讀請確保已安裝並開啓了 redis 服務,安裝請參考《Redis 安裝》。sql
在組件中添加以下配置:數據庫
'components' => [ 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ], ]
下面代碼演示了 redis 最基本的 string 類型的使用:json
// 獲取 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
)提供了操做 redis 全部的數據類型和服務(String、Hash、List、Set、SortedSet、HyperLogLog、GEO、Pub/Sub、Transaction、Script、Connection、Server)所須要的方法,而且和 redis 中的方法同名,若是不清楚能夠直接到該類中查看。緩存
該擴展中的 yii\redis\Cache
實現了 Yii2 中的緩存相關接口,因此咱們也能夠用 redis 來存儲緩存,且用法和原來同樣。yii2
修改組件中 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, ], ], ],
下面代碼演示了緩存的基本使用:
// 獲取 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 來存儲會話信息,且用法和原來同樣。
修改組件 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, ], ], ],
在開發過程當中,切記必定不要使用 PHP 原生的 $_SESSION 去操做,而要使用 Yii 提供的 session 組件,獲取方式以下:
$session = Yii::$app->session;
該擴展中的 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 鏈接,就可使用 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 命令:
本文首發於馬燕龍我的博客,歡迎分享,轉載請標明出處。
馬燕龍我的博客:http://www.mayanlong.com
馬燕龍我的微博:http://weibo.com/imayanlong
馬燕龍Github主頁:https://github.com/yanlongma