Tengo una aplicación php redis muy simple que crea claves en ciertos eventos. Todas las claves son solo contadores y tienen un tiempo de caducidad de 24 horas. Básicamente, una ventana móvil de 24 horas para que cada tecla recopile algunas estadísticas.
if ($redis->exists($key)) { $redis->incr($key); } else { $redis->set($key, '1'); $now = time(); // current timestamp $redis->expireAt($key, $now + 86400); } Cuando extraigo una descripción general de todas mis claves con $list = $redis->keys("*"); (o en una consola redis-cli con keys * ), sospecharía un orden cronológico por fecha de creación. Sin embargo, este no es el caso. Tampoco están ordenados alfabéticamente, por valor...
Entonces mi pregunta es, ¿cómo se ordena esta lista?
En primer lugar, no use keys * es una función de depuración no diseñada para una producción, puede matar su servidor ... Si necesita enumerar todas las claves en DB de manera segura, use la función SCAN con LIMIT .
De todos modos, los resultados de keys o el scan no se ordenan de ninguna manera, el orden de los resultados está relacionado con la estructura de la memoria interna de la tabla hash de redis.
Acerca de su secuencia de comandos php, puede hacerlo con un solo comando, sin que exists el set expireat simplemente ejecute:
SET key 1 EX 86400 NX
EX 86400 significa que expirará en 86400 (1 día) segundos a partir de ahora
NX significa crear una clave solo si no existe.
Si este comando devuelve (nil) ejecuta la INCR key normal, significa que la clave ya existe. Por cierto, el comando INCR no eliminará la configuración de caducidad.