ID в beginCache

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
Andres
Сообщения: 20
Зарегистрирован: 2014.05.03, 17:11

ID в beginCache

Сообщение Andres »

Не совсем мне понятен смысл генерации ключей. Вот я столкнулся с проблемой поиска по ключам в redis. Может я и невнимательно копал, но добавить хотя бы префикс к ключу было бы неплохо. Придумал вот такой костыль, но мне что-то совсем он не нравится.

Код: Выделить всё

$oldPrefix = Yii::$app->cache->keyPrefix;
$key = $clubId . 'TeamInfo';
Yii::$app->cache->keyPrefix = Yii::$app->cache->keyPrefix . $key;
if ($this->beginCache($key, ['duration' => 0, 'dependency' => $dependency])) {
bla bla bla
    $this->endCache();
}
Yii::$app->cache->keyPrefix = $oldPrefix;
В таком случае поиск по ключам нормально работает.

Код: Выделить всё

$keys = $redis->keys($cache->keyPrefix . '???TeamInfo*');
Может есть другой способ?
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: ID в beginCache

Сообщение SiZE »

Последний раз редактировалось SiZE 2017.05.30, 14:51, всего редактировалось 1 раз.
Аватара пользователя
Andres
Сообщения: 20
Зарегистрирован: 2014.05.03, 17:11

Re: ID в beginCache

Сообщение Andres »

SiZE писал(а): 2017.05.30, 12:39 Зачем эта дич в примере?
По теме вот:
https://github.com/yiisoft/yii2/blob/ma ... e.php#L190
Это вообще не по теме.
1. https://redis.io/commands/keys
2. \yii\widgets\FragmentCache::calculateKey возвращает массив, который далее успешно превращается в хэш функцией \yii\caching\buildKey
И как по вашему я смогу в хеше часть строки найти?
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: ID в beginCache

Сообщение SiZE »

FragmentCache это приемник COutputCache из первой версии. Разработчики предполагали, что генерируемый для кеша ключ может быть очень сложный. Поэтому для получения конеретного кеша, ты должен знать его точно.
Добавить еще один префикс с полпинка не получится и для большинства будет оверхедом, вряд ли это добавлят в фреймворк. Вижу это как-то так:

Код: Выделить всё

$this->beginCache($key, ['duration' => 0, 'dependency' => $dependency, 'variations' => [new CacheKeyPrefix($clubId . 'TeamInfo')]])

Код: Выделить всё

class Redis extends \yii\cache\Redis
{

    /**
     * @override
     */
    public function buildKey($key)
    {
        if (is_string($key) || !is_array($key)) {
            return parent::buildKey($key);
        } else {
            $keyPrefix = $this->keyPrefix;
            $newKey = [];
            foreach ($key as $k => $v) {
               if ($v instanceof CacheKeyPrefix) {
                  $keyPrefix .= (string) $v;
               } else {
                   $newKey[$k] => $v;
               }
            }
            $newKey = md5(json_encode($newKey));
            return $this->keyPrefix . $newKey;
        }
    }
}

Код: Выделить всё

class CacheKeyPrefix
{

    private $prefix;

    public function __construct($prefix)
    {
        $this->prefix = $prefix;
    }

    public function __toString()
    {
        return $this->prefix;
    }
}
Аватара пользователя
Andres
Сообщения: 20
Зарегистрирован: 2014.05.03, 17:11

Re: ID в beginCache

Сообщение Andres »

Так симпатичнее, но костыль тот же. А в общем соглашусь, что вряд ли добавят в фреймворк
Ответить