1. 程式人生 > >Yii2 教程 - yii2-redis 擴展詳解

Yii2 教程 - yii2-redis 擴展詳解

鍵值 lob hostname var 包括 blog 很多 框架 username

該教程已被合並到《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

)提供了操作 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 命令:

  • 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 擴展詳解