Redis ключ ограничения со сканированием - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть некоторый код, который хранит в redis флаг того, активен ли пользователь, под уникальным ключом для пользователя.

class RedisProfileActiveRepo implements ProfileActiveRepo
{
    /** @var Redis  */
    private $redis;

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

    public function markProfileIsActive(int $profile_id)
    {
        $keyname = ProfileIsActiveKey::getAbsoluteKeyName($profile_id);

        // Set the user specific key for 10 minutes
        $result = $this->redis->setex($keyname, 10 * 60, 'foobar');
    }

    public function getNumberOfActiveProfiles()
    {
        $count = 0;
        $pattern = ProfileIsActiveKey::getWildcardKeyName();
        $iterator = null;

        while (($keys = $this->redis->scan($iterator, $pattern)) !== false) {
            $count += count($keys);
        }

        return $count;
    }
}

Когда я генерирую ключи из этого кода:

namespace ProjectName;

class ProfileIsActive
{
    public static function getAbsoluteKeyName(int $profile_id) : string
    {
        return __CLASS__ . '_' . $profile_id;
    }

    public static function getWildcardKeyName() : string
    {
        return __CLASS__ . '_*';
    }
}

В результате клавиши выглядят как ProjectName\ProfileIsActive_1234 команда сканирования в Redis не соответствует ни одной клавише.

Когда я заменяю косую черту подчеркиванием:

class ProfileIsActive
{
    public static function getAbsoluteKeyName(int $profile_id) : string
    {
        return str_replace('\\', '', __CLASS__) . '_' . $profile_id;
    }

    public static function getWildcardKeyName() : string
    {
        return str_replace('\\', '', __CLASS__) . '_*';
    }
}

Код работает как положено.

Мой вопрос - почему сканирование с косой чертой в имени ключа не работает должным образом, и есть ли другие символы, которых следует избегать в именах ключей, чтобы избежать подобных проблем?

1 Ответ

0 голосов
/ 04 сентября 2018

Теоретически последние автоэкраны Redis имеют обратную косую черту, когда для ключей установлено значение redis-cli:

127.0.0.1:6379> set this\test 1
OK
127.0.0.1:6379> keys this*
1) "this\\test"

Выполните команду MONITOR в redis-cli, прежде чем запускать свой код клиента php, и наблюдайте за командами SCAN. Если ваша коллекция достаточно велика, а параметр count отсутствует или достаточно низок, вы можете не получить запись:

127.0.0.1:6379> scan 0 match this*
1) "73728"
2) (empty list or set)

127.0.0.1:6379> scan 0 match this* count 10000
1) "87704"
2) 1) "this\\test"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...