Задать вопрос
smartup
@smartup

Как выбрать случайное значение из хранилища с помощью memcacheD на PHP (заменитель RANDOMKEY для Redis)?

Здравствуйте.


Моделирую ситуацию (в корне поменять которую, как водится, не представляется возможным). С помощью memcached (используется клиентская Memcached на PHP) хранятся, допустим, цитаты (текст или даже что-то двоичное, но в base64).


Ключи — это номера цитат. Значения — тексты цитат. Номера цитат непоследовательны. То есть сначала могли добавить цитаты с номерами 100 и 101, а потом 18, 25 и 204, а других цитат может не быть совсем. Цитат — тысячи.


Не всё, что лежит в хранилище — цитаты. Кроме цитат в хранилище есть несколько (очень мало — единицы) других значений, но их ключи заранее известны.

Задача: вывести случайную цитату из хранилища.


Подскажите, пожалуйста, наиболее изящный вариант решения с минимальным перекраиванием имеющегося хозяйства.
  • Вопрос задан
  • 2834 просмотра
Подписаться 2 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@Mixail
По моему у вас большая проблема с архитектурой.
Но раз вы сказали, что архитектуру поменять не представляется возможным, то, при условии что известен максимальное значение ключа, вариант может быть такой (но он сверх-неоптимален):
do {
  $str = $m->get(rand(0,$max_key_number));
} while (!$str)
echo $str;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
WebSpider
@WebSpider
В любом случае прежде чем выбирать, придётся «достать» все номера цитат и положить их в какое-то место (например, в субд или обычный PHP-массив, сериализовать его и записать в файл). Затем по ситуации:

1. Если значения хранятся в субд — делаем обычный sql-запрос ORDER BY RAND()
2. Если значения хранятся в массиве ( к примеру, $a):
$id = $a[mt_rand(0, count($a)-1]


При добавлении новой цитаты, естественно, придётся обновлять и эти списки
Ответ написан
opium
@opium
Просто люблю качественно работать
Логично было бы хранить цитаты по ключам целых чисел от 1 до N
В пхп сгенерьте рандом от 1 до N и достаньте по ключу цитату, везде так делаю если что то подобное надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽