Как организовать грамотно стэк исполняемых задач в REDIS
Продолжаю возиться с Redis. Смысл рабочего процесса классическая: с фронта сайта первый юзер читает из базы список статей и кладет его в редис. Все последующие юзеры дергают данные из редиса до тех пор, пока админ в цмс не произвел какое либо действие типа удаление, создание, перенос и тд - ну любую движуху которая оказывает влияние на текущий список. В результате действий админа ключи сбрасываются и первый после этой процедуры юзер с фронта опять кладет результат свежего запроса в редис и тд по кругу.
Проблема в том что я поймал момент, что случаются накладки что админ сделал действие в админке, а в эти доли секунды юзер с фронта сделал запрос, в результате чего в редиске оказываются не свежие данные с учетом админских изменений, а все те же старые, и админу приходится повторно что то сделать чтобы ключи уверенно сбросились. Люди говорят что в момент использования после функции keys и перед циклом ухитряется проскочить юзерский запрос с фронта
public function deleteRedisKeysByPrefix($prefix)
{
$keys = $this->api->redis->r->keys($prefix."*");
if(count($keys) > 0)
{
foreach($keys as $key)
{
$this->api->redis->r->del($key);
}
}
}
посоветовали использовать scan но я так понимаю, что тут надо как то очередь создать, но не понимаю, как структуру этой схемы организовать, архитектуру. Пока сделал изврат, что уменя редис блокируется либо админом, либо юзером с фронта, чтобы как то гарантировать целостность транзакции, но имхо конечно это не правильно. Созадется и проверяется ключ blocked и удаляется в конце операции.
// Блокировка редиса
public function blockRedis()
{
//ждем если кто то заблочил
while($this->api->redis->isRedisKeyExist("blocked") == true)
{
sleep(1);
}
// Блокируем для себя (на 6 секунд), хватит на операцию
$this->api->redis->setRedisKey("blocked", "1", 6);
}
// Разблокировка редиса
public function releaseRedis()
{
$this->api->redis->deleteRedisKey("blocked");
}
помогите плиз понять как организовать нерушимость и целостность операции, стал читать про RedLock, но не пойму как его приплести. Lua какой то мутный, имхо, в общем не пойму что делать
спасибо