smartup
@smartup

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

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


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


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


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

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


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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽