no-image

Yii2 教程

                                    

該教程已被合併到《Yii2 權威指南中文版》中!Yiichina 教程地址為《yii2-redis 擴充套件詳解》!

一、簡介

yii2-redis 擴充套件為 Yii2 框架提供了 redis 鍵值儲存支援。包括快取(Cache)、會話儲存處理(Session),並實現了 ActiveRecord 模式,允許您將活動記錄儲存在 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)提供了操作 redis 所有的資料型別和服務(String、Hash、List、Set、SortedSet、HyperLogLog、GEO、Pub/Sub、Transaction、Script、Connection、Server)所需要的方法,並且和 redis 中的方法同名,如果不清楚可以直接到該類中檢視。

四、快取元件

該擴充套件中的 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 命令:


本文首發於馬燕龍個人部落格,歡迎分享,轉載請標明出處。
馬燕龍個人部落格:http://www.mayanlong.com
馬燕龍個人微博:http://weibo.com/imayanlong
馬燕龍Github主頁:https://github.com/yanlongma

關聯文章