{"id":1722,"date":"2026-09-23T12:49:53","date_gmt":"2026-09-23T15:49:53","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1722"},"modified":"2026-09-23T12:49:53","modified_gmt":"2026-09-23T15:49:53","slug":"keydb-fork-multithread-do-redis","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/keydb-fork-multithread-do-redis\/","title":{"rendered":"KeyDB: el fork multihilo de Redis, probado en 2026"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/keydb-fork-multithread-redis.webp\" alt=\"Mascote LinuxPro conectando dois servidores KeyDB com um cabo, com o cachorro caramelo cyborg deitado ao lado e o logo do KeyDB na parede\" width=\"1486\" height=\"856\" \/><\/p>\n<p>KeyDB naci\u00f3 con una promesa sencilla: tomar Redis, que ejecuta los comandos en un \u00fanico hilo, y hacer que use todos los n\u00facleos de la m\u00e1quina. Funcion\u00f3, se convirti\u00f3 en producto, fue comprado por Snap y gan\u00f3 caracter\u00edsticas que Redis nunca tuvo, como la replicaci\u00f3n activa entre dos maestros y la expiraci\u00f3n de miembros dentro de un conjunto. Sin embargo, en septiembre de 2026 la \u00faltima versi\u00f3n de KeyDB tiene casi tres a\u00f1os. Antes de poner KeyDB en producci\u00f3n, conviene saber qu\u00e9 hace bien, qu\u00e9 se rompe y en qu\u00e9 estado est\u00e1 el proyecto. Este post instala, configura, replica y mide KeyDB en contenedores, y termina con una recomendaci\u00f3n.<\/p>\n<h2>De d\u00f3nde vino KeyDB<\/h2>\n<p>KeyDB empez\u00f3 a principios de 2019 como un experimento de <strong>John Sully<\/strong> e <strong>Ben Schermel<\/strong>, en Toronto, para a\u00f1adir multithreading a Redis. El proyecto creci\u00f3, pas\u00f3 por Y Combinator (promoci\u00f3n del verano de 2020) y se convirti\u00f3 en la empresa EQ Alpha Technology, que manten\u00eda dos ediciones: la abierta y KeyDB Pro, cerrada y de pago.<\/p>\n<p>En <strong>12 de mayo de 2022<\/strong> KeyDB <a href=\"https:\/\/docs.keydb.dev\/news\/2022\/05\/12\/keydb-joins-snap\">anunci\u00f3 que pasaba a formar parte de Snap<\/a>, propietaria de Snapchat. Con la compra, el c\u00f3digo de la edici\u00f3n Pro se abri\u00f3 y la versi\u00f3n 6.3.0 fusion\u00f3 todo en un \u00fanico proyecto bajo licencia <strong>BSD-3-Clause<\/strong>. El repositorio pas\u00f3 de <code data-no-translation=\"\">EQ-Alpha\/KeyDB<\/code> para <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\">Snapchat\/KeyDB<\/a>, y Snap comenz\u00f3 a utilizar KeyDB en parte de su propia capa de cach\u00e9.<\/p>\n<p>O motivo declarado do fork est\u00e1 no README: os autores achavam que o Redis priorizava a simplicidade do c\u00f3digo em detrimento da simplicidade para o usu\u00e1rio, que acabava precisando de componentes externos (Sentinel, proxies, scripts) para resolver problemas comuns. O KeyDB quis ser o Redis &#8220;com pilhas inclu\u00eddas&#8221;, mantendo compatibilidade com o protocolo, os m\u00f3dulos e os scripts Lua.<\/p>\n<h2>C\u00f3mo funciona la arquitectura multihilo<\/h2>\n<p>El Redis cl\u00e1sico ejecuta todos los comandos en un hilo principal. Desde la versi\u00f3n 6 puede usar <code data-no-translation=\"\">io-threads<\/code> para leer y escribir en los sockets en paralelo, pero la ejecuci\u00f3n de los comandos sigue siendo serializada. KeyDB fue por otro camino: ejecuta <strong>el bucle de eventos completo en varios hilos<\/strong>. Cada conexi\u00f3n se asigna a un hilo en el <code data-no-translation=\"\">accept()<\/code>, y el parsing y la E\/S de red ocurren en paralelo. El acceso a la tabla de claves est\u00e1 protegido por un <strong>spinlock<\/strong>, y las transacciones mantienen ese bloqueo durante todo el <code data-no-translation=\"\">EXEC<\/code>, lo que preserva la atomicidad que las aplicaciones esperan de Redis (<a href=\"https:\/\/docs.keydb.dev\/blog\/2019\/10\/07\/blog-post\/\">explicaci\u00f3n de los autores<\/a>).<\/p>\n<p>En la pr\u00e1ctica, esto se controla mediante dos directivas en el <code data-no-translation=\"\">keydb.conf<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">server-threads 4              # threads que atendem clientes (padr\u00e3o do pacote: 2)\nserver-thread-affinity true   # fixa cada thread num n\u00facleo<\/code><\/pre>\n<p>El README recomienda relacionar <code data-no-translation=\"\">server-threads<\/code> al n\u00famero de colas de la placa de red, no al n\u00famero de n\u00facleos, y sugiere 4 como punto de partida: como KeyDB usa spinlocks, demasiados hilos aumentan la contenci\u00f3n por el lock. En el benchmark m\u00e1s abajo, 8 hilos a\u00fan rindieron m\u00e1s que 4 con 6 n\u00facleos dedicados al servidor, as\u00ed que mide en tu propio hardware.<\/p>\n<p>El diagrama muestra los dos nodos usados en el laboratorio de este post, cada uno con cuatro hilos, y la replicaci\u00f3n activa entre ellos:<\/p>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/keydb-arquitetura-replicacao-ativa.webp\" width=\"1200\" height=\"730\" alt=\"Diagrama da arquitetura do KeyDB: aplica\u00e7\u00f5es, HAProxy e dois n\u00f3s com quatro threads cada, replicando escritas nos dois sentidos\" \/><\/figure>\n<h2>Caracter\u00edsticas que Redis no tiene<\/h2>\n<p>Seg\u00fan la <a href=\"https:\/\/docs.keydb.dev\/\">documentaci\u00f3n oficial<\/a>, KeyDB a\u00f1ade al conjunto de funcionalidades de Redis:<\/p>\n<ul>\n<li><strong>Replicaci\u00f3n activa (active-replica)<\/strong>: dos o m\u00e1s nodos son r\u00e9plicas entre s\u00ed y aceptan lectura y escritura al mismo tiempo. No hay promoci\u00f3n de r\u00e9plica ni Sentinel en el failover; basta con un balanceador TCP que apunte a los nodos sanos. Con varios nodos en malla, la funcionalidad se convierte en <strong>multi-master<\/strong>. A documenta\u00e7\u00e3o promete que, ap\u00f3s uma divis\u00e3o de rede, &#8220;a escrita mais nova vence&#8221; (<em>last write wins<\/em>). En las pruebas de abajo, esto no ocurri\u00f3.<\/li>\n<li><strong>Subkey expires<\/strong>: el comando <code data-no-translation=\"\">EXPIREMEMBER<\/code> da TTL a un miembro de set, hash o sorted set, no a la clave entera. En Redis, esta funcionalidad solo lleg\u00f3 en la versi\u00f3n 7.4, y \u00fanicamente para campos de hash.<\/li>\n<li><strong>MVCC<\/strong>: a <a href=\"https:\/\/docs.keydb.dev\/docs\/mvcc\/\">documentaci\u00f3n<\/a> describe instant\u00e1neas que permiten ejecutar <code data-no-translation=\"\">KEYS<\/code> e <code data-no-translation=\"\">SCAN<\/code> sin bloquear la base de datos, y un <em>background save<\/em> sin <code data-no-translation=\"\">fork()<\/code>, que evita la duplicaci\u00f3n de p\u00e1ginas de memoria durante la instant\u00e1nea.<\/li>\n<li><strong>FLASH storage<\/strong>: con <code data-no-translation=\"\">storage-provider flash \/caminho<\/code>, KeyDB lo escribe todo en un RocksDB en SSD\/NVMe y mantiene en RAM solo los datos calientes. La <a href=\"https:\/\/docs.keydb.dev\/docs\/flash\/\">propia documentaci\u00f3n<\/a> clasifica la funci\u00f3n como <strong>beta\/experimental<\/strong>.<\/li>\n<li><strong>Copia de seguridad directa a S3<\/strong> con <code data-no-translation=\"\">db-s3-object<\/code>, y <strong>ModJS<\/strong>, un m\u00f3dulo para escribir comandos en JavaScript sobre V8.<\/li>\n<\/ul>\n<h2>La situaci\u00f3n del proyecto en septiembre de 2026<\/h2>\n<p>Consult\u00e9 GitHub, Docker Hub y el repositorio APT del proyecto el 23 de septiembre de 2026:<\/p>\n<table>\n<thead>\n<tr>\n<th>Indicador<\/th>\n<th>Situaci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u00daltima release<\/td>\n<td><strong>v6.3.4<\/strong>, publicada el 30\/10\/2023<\/td>\n<\/tr>\n<tr>\n<td>\u00daltimo commit en la rama <code data-no-translation=\"\">main<\/code><\/td>\n<td>abril de 2024 (ajustes de build)<\/td>\n<\/tr>\n<tr>\n<td>Imagen Docker <code data-no-translation=\"\">eqalpha\/keydb:latest<\/code><\/td>\n<td>6.3.4 de 30\/10\/2023, base Ubuntu 20.04<\/td>\n<\/tr>\n<tr>\n<td>Repositorio APT<\/td>\n<td>Ubuntu 20.04\/22.04 y Debian 11\/12; <strong>sin<\/strong> Ubuntu 24.04 ni Debian 13<\/td>\n<\/tr>\n<tr>\n<td>Issues abiertas<\/td>\n<td>292<\/td>\n<\/tr>\n<tr>\n<td>Base de c\u00f3digo<\/td>\n<td>Redis 6.2 (el propio servidor se anuncia como <code data-no-translation=\"\">redis_version:6.3.4<\/code>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>En <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\/issues\/895\">31 de enero de 2025<\/a>, John Sully, autor principal de KeyDB, public\u00f3 una issue de despedida: era su \u00faltimo d\u00eda en Snap, no sab\u00eda qu\u00e9 har\u00eda la empresa con el proyecto y sugiri\u00f3 que el esfuerzo de desarrollo migrase al <strong>Valkey<\/strong>, que, en sus pruebas, ya hab\u00eda alcanzado el rendimiento de KeyDB. Desde entonces, la issue <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\/issues\/923\">&#8220;Is KeyDB abandoned by Snap Inc?&#8221;<\/a> sigue sin respuesta de ning\u00fan mantenedor.<\/p>\n<p>El dato m\u00e1s grave es el de seguridad. La <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2025-49844\">CVE-2025-49844<\/a> (CVSS 9.9 en el NVD) es un <em>use-after-free<\/em> no Lua que permite execu\u00e7\u00e3o remota de c\u00f3digo por um usu\u00e1rio autenticado, e segundo o NVD afeta &#8220;todas as vers\u00f5es do Redis com scripting Lua&#8221;. O KeyDB herdou esse c\u00f3digo. A <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\/pull\/918\">PR que\u79fb\u690d la correcci\u00f3n<\/a> est\u00e1 abierto desde octubre de 2025: recibi\u00f3 aprobaciones de usuarios de la comunidad, pero ning\u00fan mantenedor hizo el merge.<\/p>\n<p><strong>Conclusi\u00f3n honesta: KeyDB est\u00e1 parada.<\/strong> El repositorio no se ha archivado y Snap puede seguir usando una versi\u00f3n interna, pero el proyecto p\u00fablico no recibe releases, correcciones de seguridad ni paquetes para las distribuciones actuales.<\/p>\n<h2>Instalaci\u00f3n en Ubuntu y Debian<\/h2>\n<p>El proyecto mantiene un repositorio APT propio. Prob\u00e9 el procedimiento en contenedores con systemd y funcion\u00f3 en <strong>Ubuntu 22.04<\/strong> y en <strong>Debian 12<\/strong>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">echo \"deb https:\/\/download.keydb.dev\/open-source-dist $(lsb_release -sc) main\" \\\n  | sudo tee \/etc\/apt\/sources.list.d\/keydb.list\nsudo wget -O \/etc\/apt\/trusted.gpg.d\/keydb.gpg \\\n  https:\/\/download.keydb.dev\/open-source-dist\/keyring.gpg\nsudo apt update\nsudo apt install keydb\nsudo systemctl enable --now keydb-server<\/code><\/pre>\n<p>El paquete <code data-no-translation=\"\">keydb<\/code> instala el <code data-no-translation=\"\">keydb-server<\/code> (servicio systemd ejecut\u00e1ndose como usuario <code data-no-translation=\"\">keydb<\/code>, configuraci\u00f3n en <code data-no-translation=\"\">\/etc\/keydb\/keydb.conf<\/code>) y el <code data-no-translation=\"\">keydb-tools<\/code> (<code data-no-translation=\"\">keydb-cli<\/code>, <code data-no-translation=\"\">keydb-benchmark<\/code>, <code data-no-translation=\"\">keydb-check-aof<\/code> e <code data-no-translation=\"\">keydb-check-rdb<\/code>). Para revisar los comandos del servicio, consulta <a href=\"\/es\/2026\/09\/dominando-o-systemd-comandos-essenciais\/\">Dominando systemd<\/a>.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">systemctl is-active keydb-server\n# active\nkeydb-cli ping\n# PONG\nkeydb-cli set curso linuxpro &amp;&amp; keydb-cli get curso\n# OK\n# \"linuxpro\"<\/code><\/pre>\n<p>En el <strong>Ubuntu 24.04<\/strong> y en <strong>Debian 13<\/strong>, el <code data-no-translation=\"\">apt update<\/code> falla porque el repositorio no tiene las suites <code data-no-translation=\"\">noble<\/code> e <code data-no-translation=\"\">trixie<\/code>. En Ubuntu 24.04, cambiar <code data-no-translation=\"\">$(lsb_release -sc)<\/code> por <code data-no-translation=\"\">jammy<\/code> instal\u00f3 y levant\u00f3 el servicio sin errores en mi prueba. Esto es un workaround, no soporte oficial, y Debian 13 sigue sin paquete (hay una <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\/issues\/920\">issue pidiendo<\/a>, sin respuesta).<\/p>\n<h2>Ejecut\u00e1ndolo con Docker<\/h2>\n<p>La imagen oficial es <code data-no-translation=\"\">eqalpha\/keydb<\/code>. de Redis <code data-no-translation=\"\">protected-mode no<\/code> y ninguna contrase\u00f1a en la <code data-no-translation=\"\">keydb.conf<\/code> predeterminada, as\u00ed que nunca publiques el puerto sin configurar autenticaci\u00f3n. Una instancia m\u00ednima, solo en localhost y con contrase\u00f1a:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker run -d --name keydb \\\n  -p 127.0.0.1:6379:6379 \\\n  -v keydb-data:\/data \\\n  eqalpha\/keydb:x86_64_v6.3.4 \\\n  keydb-server \/etc\/keydb\/keydb.conf \\\n    --requirepass 'TroqueEstaSenha' \\\n    --server-threads 4 \\\n    --appendonly yes\n\ndocker exec -it keydb keydb-cli -a 'TroqueEstaSenha' ping<\/code><\/pre>\n<p>Cualquier cliente Redis funciona sin cambios, incluido <code data-no-translation=\"\">redis-cli<\/code> y las bibliotecas de los lenguajes, porque el protocolo es el mismo. Si todav\u00eda no usas contenedores en el d\u00eda a d\u00eda, <a href=\"\/es\/2026\/09\/a-historia-do-docker\/\">la historia de Docker<\/a> explica de d\u00f3nde viene la herramienta.<\/p>\n<h2>Replicaci\u00f3n activa entre dos nodos<\/h2>\n<p>El laboratorio utiliza dos contenedores, <code data-no-translation=\"\">keydb-lab-a<\/code> e <code data-no-translation=\"\">keydb-lab-b<\/code>, en una red Docker. Cada nodo apunta al otro con <code data-no-translation=\"\">replicaof<\/code> y activa <code data-no-translation=\"\">active-replica<\/code>:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># keydb-a.conf  (no keydb-b.conf, troque para: replicaof keydb-lab-a 6379)\nport 6379\nbind 0.0.0.0\nprotected-mode yes\nrequirepass SenhaForte123\nmasterauth SenhaForte123\nserver-threads 4\nactive-replica yes\nreplicaof keydb-lab-b 6379\nappendonly yes\ndir \/data<\/code><\/pre>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker network create keydb-lab-net\nfor n in a b; do\n  docker run -d --name keydb-lab-$n --network keydb-lab-net \\\n    -v $PWD\/keydb-$n.conf:\/etc\/keydb\/keydb.conf:ro \\\n    eqalpha\/keydb:x86_64_v6.3.4 keydb-server \/etc\/keydb\/keydb.conf\ndone\n\nA=\"docker exec keydb-lab-a keydb-cli -a SenhaForte123 --no-auth-warning\"\nB=\"docker exec keydb-lab-b keydb-cli -a SenhaForte123 --no-auth-warning\"\n\n$A info replication | grep -E 'role|link_status'\n# role:active-replica\n# master_global_link_status:up\n# master_link_status:up\n\n$A set site linuxpro.com.br ; $B get site     # \"linuxpro.com.br\"\n$B set autor nilton         ; $A get autor    # \"nilton\"<\/code><\/pre>\n<p>El registro confirma los cuatro hilos (<code data-no-translation=\"\">Thread 0 alive<\/code> hasta <code data-no-translation=\"\">Thread 3 alive<\/code>) y el aviso de que <code data-no-translation=\"\">active-replica yes<\/code> implica <code data-no-translation=\"\">replica-read-only no<\/code>. Escrituras hechas en cualquier nodo aparecieron en el otro en menos de un segundo.<\/p>\n<p>Tambi\u00e9n funcion\u00f3 el escenario que la documentaci\u00f3n destaca: con el nodo B detenido, grab\u00e9 un valor nuevo en A. Al volver a encender B, se sincroniz\u00f3 y pas\u00f3 a mostrar el valor nuevo, sin sobrescribir A con el dato antiguo de su AOF.<\/p>\n<h3>La prueba de partici\u00f3n de red<\/h3>\n<p>Despu\u00e9s simul\u00e9 una partici\u00f3n de red. Baj\u00e9 el <code data-no-translation=\"\">repl-timeout<\/code> durante 5 segundos, desconect\u00e9 el nodo B de la red Docker y esper\u00e9 a que el <code data-no-translation=\"\">master_link_status<\/code> pasara a <code data-no-translation=\"\">down<\/code>. Con los nodos aislados, grab\u00e9 la misma clave en ambos y reconect\u00e9 B:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">$A config set repl-timeout 5 ; $B config set repl-timeout 5\ndocker network disconnect keydb-lab-net keydb-lab-b\n# ... aguarda master_link_status:down em B ...\n$B set k6 azul-antigo      # escrita mais velha, em B\n$A set k6 verde-novo       # escrita mais nova, em A (2 s depois)\ndocker network connect keydb-lab-net keydb-lab-b\n# ... aguarda master_link_status:up ...\n$A get k6    # \"azul-antigo\"\n$B get k6    # \"verde-novo\"<\/code><\/pre>\n<p>En lugar de converger hacia la escritura m\u00e1s reciente, <strong>los nodos intercambiaron los valores y quedaron divergentes<\/strong>. El log mostr\u00f3 una resincronizaci\u00f3n parcial (<code data-no-translation=\"\">Successful partial resynchronization<\/code>), y cada nodo aplic\u00f3 por encima la escritura del otro. Repet\u00ed la prueba siete veces, con particiones de 3 a 15 segundos, tanto con el enlace de replicaci\u00f3n cayendo como sin llegar a caer, y el resultado fue siempre el mismo. La divergencia continu\u00f3 hasta que un <code data-no-translation=\"\">docker restart keydb-lab-b<\/code> forz\u00f3 una sincronizaci\u00f3n completa, y entonces los dos nodos quedaron con <code data-no-translation=\"\">azul-antigo<\/code>: <strong>la escritura m\u00e1s reciente se perdi\u00f3<\/strong>.<\/p>\n<p>El comportamiento es conocido. La <a href=\"https:\/\/github.com\/Snapchat\/KeyDB\/issues\/366\">issue #366<\/a> relata el mismo problema desde septiembre de 2021, y en diciembre de 2023 otro usuario confirm\u00f3 que continuaba en la 6.3.4. Como la replicaci\u00f3n activa es la principal raz\u00f3n para elegir KeyDB, esto pesa: <strong>no use active-replica donde una divergencia silenciosa de datos sea inaceptable<\/strong>.<\/p>\n<h2>Expiraci\u00f3n de miembros con EXPIREMEMBER<\/h2>\n<p>Esta funci\u00f3n funcion\u00f3 como se documenta, incluso replicada al otro nodo:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">$A sadd sessoes u1 u2 u3\n$A expiremember sessoes u1 3          # u1 expira em 3 s\n$A ttl sessoes                        # -1: a chave em si n\u00e3o expira\nsleep 4\n$A smembers sessoes                   # u2, u3\n$B smembers sessoes                   # u2, u3\n\n$A hset carrinho item1 a item2 b\n$A expiremember carrinho item1 2000 ms   # unidade opcional: s ou ms<\/code><\/pre>\n<p>Para cach\u00e9s con etiquetas o listas de sesiones, esto evita el truco de mantener un sorted set paralelo solo para controlar la validez de cada miembro.<\/p>\n<h2>Benchmark sencillo: KeyDB, Valkey y Redis<\/h2>\n<p>El README de KeyDB advierte que los <code data-no-translation=\"\">keydb-benchmark<\/code> y el <code data-no-translation=\"\">redis-benchmark<\/code> son demasiado lentos para saturar un servidor multihilo y recomienda el <a href=\"https:\/\/github.com\/RedisLabs\/memtier_benchmark\">memtier_benchmark<\/a>. Fue lo que us\u00e9, en contenedores en la misma m\u00e1quina.<\/p>\n<p><strong>Entorno:<\/strong> AMD Ryzen 9 9900X (12 n\u00facleos\/24 hilos), 186 GB de RAM, Docker en red bridge. El servidor qued\u00f3 fijado a 6 n\u00facleos f\u00edsicos (<code data-no-translation=\"\">--cpuset-cpus 0-5,12-17<\/code>) y memtier a los otros 6 (<code data-no-translation=\"\">6-11,18-23<\/code>), sin compartir n\u00facleo. Sin persistencia (<code data-no-translation=\"\">--save \"\" --appendonly no<\/code>), 200 mil claves de 100 bytes precargadas, 8 hilos \u00d7 50 conexiones en memtier, 1 SET por cada 10 GETs, claves aleatorias, 20 segundos por ronda. Hice tres rondas por configuraci\u00f3n, y la tabla muestra la mediana. La m\u00e1quina ejecutaba otros contenedores al mismo tiempo, as\u00ed que compare las filas entre s\u00ed, no con cifras de otros entornos.<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\">docker run --rm --network keydb-lab-net --cpuset-cpus 6-11,18-23 \\\n  redislabs\/memtier_benchmark:latest -s keydb-lab-srv -p 6379 \\\n  --protocol=redis --threads=8 --clients=50 --ratio=1:10 \\\n  --data-size=100 --key-maximum=200000 --key-pattern=R:R \\\n  --test-time=20 --hide-histogram<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th>Servidor y configuraci\u00f3n<\/th>\n<th>ops\/s (mediana)<\/th>\n<th>latencia media<\/th>\n<th>p99<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>KeyDB 6.3.4, <code data-no-translation=\"\">server-threads 1<\/code><\/td>\n<td>213 mil<\/td>\n<td>1,88 ms<\/td>\n<td>2,78 ms<\/td>\n<\/tr>\n<tr>\n<td>Valkey 9.1.2, <code data-no-translation=\"\">io-threads 1<\/code><\/td>\n<td>214 mil<\/td>\n<td>1,86 ms<\/td>\n<td>3,81 ms<\/td>\n<\/tr>\n<tr>\n<td>KeyDB 6.3.4, <code data-no-translation=\"\">server-threads 4<\/code><\/td>\n<td>833 mil<\/td>\n<td>0,48 ms<\/td>\n<td>1,01 ms<\/td>\n<\/tr>\n<tr>\n<td>Valkey 9.1.2, <code data-no-translation=\"\">io-threads 4<\/code><\/td>\n<td>633 mil<\/td>\n<td>0,63 ms<\/td>\n<td>1,01 ms<\/td>\n<\/tr>\n<tr>\n<td>KeyDB 6.3.4, <code data-no-translation=\"\">server-threads 8<\/code><\/td>\n<td>1,30 mill\u00f3n<\/td>\n<td>0,31 ms<\/td>\n<td>0,81 ms<\/td>\n<\/tr>\n<tr>\n<td>Valkey 9.1.2, <code data-no-translation=\"\">io-threads 8<\/code><\/td>\n<td>1,25 mill\u00f3n<\/td>\n<td>0,32 ms<\/td>\n<td>0,58 ms<\/td>\n<\/tr>\n<tr>\n<td>Redis 8.10.2, <code data-no-translation=\"\">io-threads 8<\/code><\/td>\n<td>1,28 mill\u00f3n<\/td>\n<td>0,31 ms<\/td>\n<td>0,65 ms<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Qu\u00e9 muestran los n\u00fameros:<\/p>\n<ul>\n<li>Con un hilo, KeyDB y Valkey empatan, lo cual tiene sentido: es esencialmente el mismo motor heredado de Redis.<\/li>\n<li>Con 4 hilos, KeyDB queda aproximadamente un 30% por delante de Valkey. Ejecutar comandos en varios hilos todav\u00eda rinde m\u00e1s cuando hay pocos hilos.<\/li>\n<li>Con 8 hilos, los tres quedan a menos de un 4% entre s\u00ed, y Valkey y Redis tienen el p99 m\u00e1s bajo. En ese punto, el l\u00edmite probablemente sea el propio memtier o la pila de red de Docker, y ya no el servidor.<\/li>\n<\/ul>\n<p>En resumen, la ventaja de rendimiento que justificaba a KeyDB en 2019 hoy es peque\u00f1a, y solo aparece con pocos hilos. Esto coincide con lo que el propio John Sully escribi\u00f3 al salir de Snap.<\/p>\n<h2>Redis vs Valkey vs KeyDB<\/h2>\n<p>Datos cotejados en los repositorios oficiales en 23\/09\/2026:<\/p>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Redis<\/th>\n<th>Valkey<\/th>\n<th>KeyDB<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Licencia<\/td>\n<td>triple desde la 8.0: RSALv2, SSPLv1 o <strong>AGPLv3<\/strong> (7.4 era solo RSALv2\/SSPL)<\/td>\n<td><strong>BSD-3-Clause<\/strong><\/td>\n<td><strong>BSD-3-Clause<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Qui\u00e9n lo mantiene<\/td>\n<td>Redis Ltd.<\/td>\n<td>comunidad, bajo la Linux Foundation<\/td>\n<td>Snap (sin actividad p\u00fablica)<\/td>\n<\/tr>\n<tr>\n<td>\u00daltima versi\u00f3n estable<\/td>\n<td>8.10.2 (17\/09\/2026)<\/td>\n<td>9.1.2 (01\/09\/2026)<\/td>\n<td>6.3.4 (30\/10\/2023)<\/td>\n<\/tr>\n<tr>\n<td>Base de c\u00f3digo<\/td>\n<td>propia<\/td>\n<td>fork del \u00faltimo Redis BSD (serie 7.2)<\/td>\n<td>fork de Redis 6.2<\/td>\n<\/tr>\n<tr>\n<td>Multihilo<\/td>\n<td>hilos de I\/O; comandos en un hilo<\/td>\n<td>hilos de I\/O; comandos en un hilo<\/td>\n<td>event loop y comandos en varios hilos<\/td>\n<\/tr>\n<tr>\n<td>Cluster con sharding<\/td>\n<td>sim<\/td>\n<td>sim<\/td>\n<td>s\u00ed (modo cluster de Redis 6.2)<\/td>\n<\/tr>\n<tr>\n<td>Replicaci\u00f3n multi-master<\/td>\n<td>no en la edici\u00f3n open source<\/td>\n<td>no<\/td>\n<td>s\u00ed, con el bug de divergencia mencionado<\/td>\n<\/tr>\n<tr>\n<td>Expiraci\u00f3n por miembro<\/td>\n<td>campos de hash (desde 7.4)<\/td>\n<td>campos de hash (desde 9.0)<\/td>\n<td>set, hash y sorted set<\/td>\n<\/tr>\n<tr>\n<td>Correcci\u00f3n de la CVE-2025-49844<\/td>\n<td>s\u00ed (8.2.2 y backports)<\/td>\n<td>sim<\/td>\n<td><strong>no<\/strong><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>El cambio de licencia de Redis se anunci\u00f3 el <a href=\"https:\/\/redis.io\/blog\/redis-adopts-dual-source-available-licensing\/\">20 de marzo de 2024<\/a>. La Linux Foundation <a href=\"https:\/\/www.linuxfoundation.org\/press\/linux-foundation-launches-open-source-valkey-community\">lanz\u00f3 Valkey el 28 de marzo de 2024<\/a> a partir del \u00faltimo c\u00f3digo BSD, y el <a href=\"https:\/\/redis.io\/blog\/agplv3\/\">1 de mayo de 2025<\/a> Redis 8 a\u00f1adi\u00f3 AGPLv3 como tercera opci\u00f3n, volviendo a tener una licencia aprobada por la OSI.<\/p>\n<p>Un cuidado con las comparaciones que circulan por internet: hay art\u00edculos que atribuyen a KeyDB la licencia Apache 2.0 (la licencia es BSD-3-Clause) y tablas de rendimiento sin entorno ni m\u00e9todo descritos. Compru\u00e9balo siempre en el repositorio y mide en tu hardware.<\/p>\n<h2>Cu\u00e1l elegir<\/h2>\n<ul>\n<li><strong>Proyecto nuevo: usa Valkey.<\/strong> Es BSD, tiene lanzamientos frecuentes, parches de seguridad, paquetes en las distribuciones actuales y es la alternativa recomendada por el propio autor de KeyDB. Con <code data-no-translation=\"\">io-threads<\/code> este ya aprovecha varios n\u00facleos.<\/li>\n<li><strong>\u00bfNecesita el ecosistema de Redis Ltd.<\/strong> (m\u00f3dulos integrados de Redis 8, soporte comercial)? Utilice Redis, teniendo en cuenta que la licencia es AGPLv3 o source-available.<\/li>\n<li><strong>\u00bfYa tiene KeyDB en producci\u00f3n?<\/strong> Planifique la migraci\u00f3n a Valkey. Mientras no se lleve a cabo, bloquee los scripts Lua para quien no los necesite (<code data-no-translation=\"\">ACL SETUSER &lt;usuario&gt; -@scripting<\/code>, que prob\u00e9 en 6.3.4), no exponga el puerto fuera de la red interna y trate la replicaci\u00f3n activa como susceptible a divergencias. <code data-no-translation=\"\">EXPIREMEMBER<\/code> y la replicaci\u00f3n activa no existen en Valkey, as\u00ed que revise el c\u00f3digo que utiliza esas funciones.<\/li>\n<li><strong>KeyDB en un proyecto nuevo:<\/strong> no lo recomiendo. El rendimiento que lo justificaba ha quedado atr\u00e1s, y la falta de mantenimiento pesa m\u00e1s.<\/li>\n<\/ul>\n<h2>Conclusi\u00f3n<\/h2>\n<p>KeyDB demostr\u00f3 una tesis: una cach\u00e9 compatible con Redis pod\u00eda utilizar todos los n\u00facleos, y esa presi\u00f3n ayud\u00f3 a empujar a Redis y a Valkey hacia el multihilo de E\/S. Pero una base de datos sin mantenedor, sin parche para una RCE cr\u00edtica y con replicaci\u00f3n activa que pierde escrituras tras una partici\u00f3n no debe recibir datos nuevos en 2026. Para quien necesite alta disponibilidad, el camino es Valkey, y el post <a href=\"\/es\/2026\/09\/valkey-em-cluster-primarios-replicas-failover\/\">Valkey en cl\u00faster<\/a> muestra c\u00f3mo montar tres primarios y tres r\u00e9plicas, con failover probado. Si el cach\u00e9 va a producci\u00f3n, monitor\u00edzalo de verdad, con <a href=\"\/es\/2026\/09\/monitorando-servidores-linux-com-prometheus\/\">Prometheus y Node Exporter<\/a> o con un comprobador simple como el <a href=\"\/es\/2026\/09\/go-uptime-monitoramento-self-hosted-derivado-do-gatus\/\">Go Uptime<\/a>. Y si tu aplicaci\u00f3n en Go ya usa Redis para colas, el post sobre <a href=\"\/es\/2026\/09\/asynq-filas-de-tarefas-em-go-com-redis-e-asynqmon\/\">Asynq<\/a> funciona igual con Valkey.<\/p>","protected":false},"excerpt":{"rendered":"<p>KeyDB instalado, replicado y medido en contenedores: el fork multihilo de Redis a\u00fan se ejecuta, pero est\u00e1 parado desde 2023, pierde escrituras tras una partici\u00f3n de red y no corrigi\u00f3 la CVE-2025-49844. Comparaci\u00f3n con Redis y Valkey y recomendaci\u00f3n.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,21,2,111,120],"tags":[501,500,156,499,496,497],"class_list":["post-1722","post","type-post","status-publish","format-standard","hentry","category-devops","category-infra","category-linux","category-opensource","category-servidores","tag-banco-de-dados","tag-cache","tag-docker","tag-keydb","tag-redis","tag-valkey"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1722"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1722\/revisions"}],"predecessor-version":[{"id":1727,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1722\/revisions\/1727"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}