Machez
@Machez
Бу!

Почему при попытке записать значение в Redis через yii\redis\Cache название ключа хэшируется?

Добавил в проект на Yii2 через Composer расширение yii\redis\Cache и задал его конфигурацию
...
'cache' => [
            'class' => 'yii\redis\Cache',
            'redis' => [
                'hostname' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ]
        ],
...


Пытаюсь записать сущность в Redis:
//  Yii::$app->user->identity->email содержит строку: mymail@mail.ru

Yii::$app->cache->set( Yii::$app->user->identity->email, 'my-value', 60 * 60 * 24 );

echo Yii::$app->user->identity->email; // Выводит: mymail@mail.ru


В Redis записывается имя ключа в виде 51ade67559f849edfa94159c13bc296f, а должно быть mymail@mail.ru

В чём может быть проблема?

А при попытке использовать следующий ниже код происходит ошибка
Yii::$app->cache->setValue( Yii::$app->user->identity->email, 'my-value', 60 * 60 * 24 );

Exception 'yii\base\UnknownMethodException' with message 'Calling unknown method: yii\redis\Cache::setValue()'

in E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\base\Component.php:285

Stack trace:
#0 E:\OpenServer\domains\laffu\frontend\controllers\SiteController.php(40): yii\base\Component->__call('setValue', Array)
#1 [internal function]: frontend\controllers\SiteController->actionIndex()
#2 E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\base\InlineAction.php(55): call_user_func_array(Array, Array)
#3 E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\base\Controller.php(154): yii\base\InlineAction->runWithParams(Array)
#4 E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\base\Module.php(454): yii\base\Controller->runAction('', Array)
#5 E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\web\Application.php(87): yii\base\Module->runAction('', Array)
#6 E:\OpenServer\domains\laffu\vendor\yiisoft\yii2\base\Application.php(375): yii\web\Application->handleRequest(Object(yii\web\Request))
#7 E:\OpenServer\domains\laffu\frontend\web\index.php(30): yii\base\Application->run()
#8 {main}
  • Вопрос задан
  • 808 просмотров
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
ключ хешируется и это правильно, это никак отрицательно не должно сказаться на вашем коде. Вашему коду по сути все равно хешируется ключ или нет.
А ошибка у Вас возникает потому что нет такого метода setValue в классе yii\redis\Cache, есть метод set(), который вероятно Вам нужен. Хеш ключа тут не при чем.
Вот описание всех доступных методов: www.yiiframework.com/doc-2.0/yii-redis-cache.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Insolita
@Insolita
Отчаянная домохозяйка
Потому что это кеш... ключи могут быть длинными, для оптимизации ключей длинной >32 байта, или если вдруг там нестандартные символы окажутся, кодируются md5
https://github.com/yiisoft/yii2/blob/master/framew...
Если важно не кодировать - отнаследуйте класс yii\redis\Cache переопределите функцию buldKey на свою и используйте его. [но для кеширования результатов запросов лучше этого не делать, или сделать отдельный компонент с таким поведением]
Но, возможно вам больше подойдёт испльзовать redis напрямую, если так важны ключи (по более весомым причинам, чем удобный просмотр в базе)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы