smartup
@smartup

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

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


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


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


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

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


Подскажите, пожалуйста, наиболее изящный вариант решения с минимальным перекраиванием имеющегося хозяйства.
  • Вопрос задан
  • 2829 просмотров
Решения вопроса 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 и достаньте по ключу цитату, везде так делаю если что то подобное надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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