Как организовать грамотно стэк исполняемых задач в 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 какой то мутный, имхо, в общем не пойму что делать

спасибо


Ответы (0 шт):