Yii2 教程 - yii2-redis 擴展詳解

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

1、簡介

yii2-redis 擴展爲 Yii2 框架提供了 redis 鍵值存儲支持。包括緩存(Cache)、會話存儲處理(Session),並實現了 ActiveRecord 模式,容許您將活動記錄存儲在 redis 中。html

相關連接

2、安裝擴展

在 Yii2 項目根目錄,執行如下命令安裝:git

$ composer require yiisoft/yii2-redis

也能夠先在 composer.json 文件中聲明以下依賴:github

"yiisoft/yii2-redis": "~2.0.0"

再執行下面命令安裝:redis

$ composer update

3、基本使用

繼續閱讀請確保已安裝並開啓了 redis 服務,安裝請參考《Redis 安裝》sql

1. 配置

在組件中添加以下配置:數據庫

'components' => [
    'redis' => [
        'class' => 'yii\redis\Connection',
        'hostname' => 'localhost',
        'port' => 6379,
        'database' => 0,
    ],
]

2. 示例

下面代碼演示了 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 中的方法同名,若是不清楚能夠直接到該類中查看。緩存

4、緩存組件

該擴展中的 yii\redis\Cache 實現了 Yii2 中的緩存相關接口,因此咱們也能夠用 redis 來存儲緩存,且用法和原來同樣。yii2

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 數據庫中,性能將大大提升。

5、會話組件

該擴展中的 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;

6、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 沒有表的概念,所以不能經過表定義關聯關係,只能經過其它記錄來定義關係。

7、直接使用命令

直接使用 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

相關文章
相關標籤/搜索