Base Donnees Cle-Valeur
Presentation
Objectif principal : Un mini Redis en C. Une base de donnees cle-valeur en memoire avec persistance sur disque. Commandes GET, SET, DEL, KEYS. Accessible via un protocole texte simple sur TCP.
Technologies utilisees : C avec une hash table pour le stockage en memoire. Sockets pour le serveur. Fichier append-only pour la persistance (chaque operation est loguee).
Fonctionnalites cles : GET/SET/DEL en O(1) grace a la hash table, expiration des cles (TTL), persistance AOF, multi-clients simultanes avec select().
Livrables attendus : Un serveur qui ecoute sur un port, un client CLI pour envoyer des commandes. Donnees persistees entre les redemarrages.
Calendrier previsionnel : Deux semaines. La hash table ca va, mais la gestion des connexions multiples avec select() c'etait nouveau pour moi.
Parties prenantes & criteres de succes : Projet perso pour comprendre comment marchent les bases NoSQL. Redis me fascine, je voulais en faire un mini clone.
Le Defi
La hash table avec gestion des collisions et le resize automatique. Quand la table est trop pleine, faut l'agrandir et tout re-hasher. Ca doit etre fait sans bloquer les autres operations trop longtemps.
La Solution
Chaining pour les collisions (liste chainee par bucket). Pour le resize, je fais un resize incremental : je cree la nouvelle table et je migre quelques entrees a chaque operation jusqu'a ce que tout soit migre. Ca evite les grosses pauses.
Architecture Technique
Module hashtable.c avec les operations de base. Module server.c avec la boucle select() et le parsing des commandes. Module aof.c pour ecrire les operations dans le fichier et les rejouer au demarrage. Structure Entry avec cle, valeur, et timestamp d'expiration.
Points Cles
- Hash table avec resize incremental
- TTL pour expiration des cles
- Persistance AOF
Apercu
Resultats & Apprentissages
Ca marche bien pour des cas simples. J'ai benchmark a 10000 ops/sec sur ma machine, pas mal pour du C fait maison. J'ai compris les hash tables en profondeur et comment les bases cle-valeur fonctionnent.
Evolutions Futures
Ajouter d'autres types de donnees (listes, sets). Replication master-slave. Clustering pour la scalabilite. Peut-etre un protocole compatible avec les clients Redis existants.