2017-01-11 59 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) –