Arquitectura del Event Loop Multiplexado (epoll/kqueue) y Codificaciones Compactas (ListPack & SkipList) (50 min)
Arquitectura del Event Loop Multiplexado (epoll/kqueue) y Codificaciones Compactas (ListPack & SkipList)
1. Por Qué un Único Hilo de Ejecución Supera los 150,000 OPS Sub-Milisegundo
Redis ejecuta los comandos de datos en un Event Loop Single-Threaded respaldado por multiplexación de I/O del kernel (epoll en Linux, kqueue en BSD) y Threaded I/O únicamente para la serialización/deserialización de sockets RESP3:
- Cero Contención de Mutex / Locks: No existen cambios de contexto de CPU ni locks pesimistas entre hilos compitiendo por mutar un Sorted Set.
- Peligro de Comandos $\mathcal{O}(N)$: Un único comando KEYS *, SMEMBERS sobre un conjunto de $10^6$ elementos, o borrar una llave gigante de forma síncrona (DEL en lugar de UNLINK asíncrono) bloquea el hilo único y congela el $100\%$ del clúster.
2. Transición Interna de Codificaciones: listpack vs. hashtable / skiplist
Un objeto ZSET (Sorted Set) en Redis 7+ utiliza dos estructuras según su tamaño:
1. listpack (Bloque contiguo de memoria amigable con la caché L1/L2 del procesador): Mientras tenga $\le 128$ elementos (zset-max-listpack-entries) de $\le 64\text{ bytes}$, ahorra hasta un $70\%$ de RAM al eliminar punteros de 64 bits.
2. dict (Hash Table $\mathcal{O}(1)$) + zskiplist (SkipList $\mathcal{O}(\log N)$): Cuando supera el umbral, mantiene simultáneamente acceso en $\mathcal{O}(1)$ al score de un miembro y barridos por rango (ZRANGEBYSCORE) en $\mathcal{O}(\log N + M)$.