2017-01-11 62 views
3

我想使用Yii2和redis作爲數據庫。Yii2 + Redis作爲數據庫

到目前爲止,我從這裏獲得了Yii2的Redis ActiveRecord Class。

link1

link2

,但是,我有一個問題。爲什麼這個類別在REDIS中發生什麼?

以上我不能找到插入數據的模式。我添加一個用戶,它將在user:xxx名稱空間下添加一個用戶,並在s:user:xxx等等下添加另一個記錄,但沒有任何主題具有我在屬性中定義的任何字段!只包含ID。

我知道鍵值類型數據庫和RDBMS是不同的,也知道如何在Redis中實現像記錄這樣的關係,但我不知道它爲什麼只保存ID。

到目前爲止,我找不到任何使用redis ActiveRecords的例子。

有一個在這裏,它不夠好。

所以這裏是我的主要疑慮:如何將數據添加到redis使用activeRecords和不同的數據類型在YII2中?

如果它不可能與ActiveRecords什麼是最好的解決方案?在這種情況下

另一個問題:是否可以使用模型來代替並編寫我自己的model :: save()方法?在這個速度下最好的數據驗證解決方案是什麼?

其實我想製作一個電報機器人,所以我應該得到消息並將它們發送到RabitMQ並在工作中獲取數據,執行該過程並將結果保存到Redis,最後通過RabitMQ發送響應給用戶。

所以我需要做很多課程認證中的驗證和保存和選擇和範圍,並保存到套列表和這個那個....

我想一個好辦法,使型號或主動記錄或適當的驗證解決方案,將數據保存並檢索到Redis和Yii2。

+0

請幫助.... –

回答

4

Redis的DB可以聲明爲緩存組件或作爲數據庫連接兩者

當被聲明爲緩存組分(使用yii/redis/cache)它是可訪問的範圍內的組分來存儲鍵/值as shown here

$cache = Yii::$app->cache; 

// try retrieving $data from cache 
$data = $cache->get($key); 
// store $data in cache so that it can be retrieved next time 
$cache->set($key, $data); 

// one more example: 
$access_token = Yii::$app->security->generateRandomString(); 
$cache->add(
    // key 
    $access_token, 
    // data (can also be an array) 
    [ 
     'id' => Yii::$app->user->identity->id 
     'name' => Yii::$app->user->identity->name 
    ], 
    // expires 
    60*60*3 
); 

而且其它部件可以開始使用它的緩存提出像session如果配置成這樣或類似的yii\web\UrlManager在默認情況下會嘗試緩存在任何根據配置文件中的cache定義有效的緩存機制生成的URL規則組件解釋here。因此,在這種情況下,找到除您之外的一些存儲數據是正常的。

當Redis的聲明爲你提供這意味着使用yii\redis\Connection類,你可以讓你的模型擴展其\yii\redis\ActiveRecord類作爲在Yii中任何其他的ActiveRecord模型的鏈接DB連接等。到目前爲止我所知道的唯一區別是您需要手動定義您的屬性,因爲沒有用於解析NoSQL數據庫的數據庫模式。然後,只需定義規則,場景,關係,事件,...任何其他的ActiveRecord模型:

class Customer extends \yii\redis\ActiveRecord 
{ 
    public function attributes() 
    { 
     return ['id', 'name', 'address', 'registration_date']; 
    } 

    public function rules() 
    { 
     return [ 
      ['name', 'required'], 
      ['name', 'string', 'min' => 3, 'max' => 12, 'on' => 'register'], 
      ... 
     ]; 
    } 

    public function attributeLabels() {...} 
    ... 
} 

所有可用的方法,包括save()validate()getErrors(),...可以發現here,應該像使用任何其他ActiveRecord類as shown in the official guide

+0

謝謝,所以沒有辦法將屬性或數據類型設置爲其他東西,如列表或集?在預定義的方法。我可以定義自己的保存方法並更改其功能嗎?但然後,驗證是一個問題,如果我重寫保存方法,它會工作嗎? –

+0

是的,您可以隨時覆蓋您的模型中從** BaseActiveRecord **繼承的原始[save()](https://github.com/yiisoft/yii2/blob/master/framework/db/BaseActiveRecord.php#L632) 。但你可能只需要重寫更低級別的方法,以更好地瞭解它是如何工作的看看yii/redis/ActiveRecord [源代碼](https://github.com/yiisoft/yii2-redis/blob/a920547708c4a7091896923abc2499bc8c1c0a3b/ActiveRecord .PHP)。您始終可以重寫這些方法或在模型中引入新方法。 '$ db-> executeCommand($ command)'是這裏與REDIS溝通的主要功能...... –

+0

...和default [命令列表可以在這裏看到](https://github.com/yiisoft/yii2- redis/blob/a920547708c4a7091896923abc2499bc8c1c0a3b/Connection.php#L90) –