Такую эту задачу внешним кэшированием решать - это какое-то адское извращение. Может, просто послать упоминаемого пионэра лесом?
Я, когда подобное делал, хитро извратился. Точно не помню, но примерно так:
0. Положим, что там прямо полный честный рандом нафиг не нужен, достаточно "похожести".
1. Берется вспомогательная таблица OrderTable(id references MainTable(id), order_idx default floor(rand() * 1000000000000000), sequence_id).
Сиквенсов ограниченное количество. Ну, скажем, 10.
При добавлении записи в основную таблицу делаем 10 инсертов с sequence_id 1..10.
2. Для каждого уникального посетителя генерируем и сохраняем в куке/сессии $srand_seed_value.
3. Инициализируем генератор случайных чисел этим seed value, получаем оттуда два числа - $sequence_id 1..10 и boolean $desc_order.
4. В случае memcache miss, делаем
select * from MainTable inner join OrderTable using (id) where sequence_id = $sequence_id order by order_idx {$desc_order ? 'DESC' : 'ASC'} limit ... offset ...
5. делаем полученному shuffle и кладем в мемкеш с ключиком ($srand_seed_value, номер страницы)
Я, когда подобное делал, хитро извратился. Точно не помню, но примерно так:
0. Положим, что там прямо полный честный рандом нафиг не нужен, достаточно "похожести".
1. Берется вспомогательная таблица OrderTable(id references MainTable(id), order_idx default floor(rand() * 1000000000000000), sequence_id).
Сиквенсов ограниченное количество. Ну, скажем, 10.
При добавлении записи в основную таблицу делаем 10 инсертов с sequence_id 1..10.
2. Для каждого уникального посетителя генерируем и сохраняем в куке/сессии $srand_seed_value.
3. Инициализируем генератор случайных чисел этим seed value, получаем оттуда два числа - $sequence_id 1..10 и boolean $desc_order.
4. В случае memcache miss, делаем
select * from MainTable inner join OrderTable using (id) where sequence_id = $sequence_id order by order_idx {$desc_order ? 'DESC' : 'ASC'} limit ... offset ...
5. делаем полученному shuffle и кладем в мемкеш с ключиком ($srand_seed_value, номер страницы)