yiisoft / yii2-redis

Yii 2 Redis extension.
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
451 stars 184 forks source link

yii2 redis Active Record find is slow #146

Closed fancyecommerce closed 6 years ago

fancyecommerce commented 6 years ago

use yii2Redis extension for Active Record, like mysql AR, find is slow

maybe, redis need a table index like mysql table index?

redis model

namespace fecshop\models\redis;

use yii\redis\ActiveRecord;

/**
 * @author Terry Zhao <2358269014@qq.com>
 * @since 1.0
 */
class SessionStorage extends ActiveRecord
{
    public function attributes()
    {
        return [
            'id', 'session_uuid',
            'session_key', 'session_value',
            'session_timeout','session_updated_at'
        ];
    }
    /**
     * relations can not be defined via a table as there are not tables in redis. You can only define relations via other records.
     */
}

when is select

$one =  SessionStorage::find()->where([
            'session_uuid' => $uuid,
            'session_key'  => $key,
        ])->one();

find is slow, use 200ms, how can is speed it? redis also need index like mysql table indexes?

fancyecommerce commented 6 years ago

redis config:

'redis' => [
            'class' => 'yii\redis\Connection',
            'hostname' => '127.0.0.1',    // redis host
            'port' => 6379,               // redis port
            'password'  => 'xxxxxxa', // redis password
            'database' => 0,    // redis db
        ],
cebe commented 6 years ago

redis is a key-value store, finding data by other fields than the primary key is expected to be slow, there is not much one can do about that.

fancyecommerce commented 6 years ago

I made improvements to this:

public function getUuidKey($uuid, $key){
        return $uuid.'###^^###'.$key;
    }

$r_id = $this->getUuidKey($uuid, $key);
        $one = $this->_sessionModel->find()->where([
            'id' => $r_id,
        ])->one();

while insert data, id Assignment buy function getUuidKey($uuid, $key)

Combine 2 fields into one field for query, Perfectly solved my problem