У меня есть некоторый код, который хранит в 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__) . '_*';
}
}
Код работает как положено.
Мой вопрос - почему сканирование с косой чертой в имени ключа не работает должным образом, и есть ли другие символы, которых следует избегать в именах ключей, чтобы избежать подобных проблем?