Quoi NoSQL existe-t-il des solutions pour .NET ?
Réponses
Trop de publicités?Vous devriez également envisager d'utiliser Redis . Il s'agit d'une base de données NoSQL avancée qui prend en charge de riches structures de données côté serveur telles que les listes, les ensembles, les ensembles triés et les hachages. Elle fonctionne en mémoire mais prend en charge un mode de persistance "instantané" ainsi qu'un journal de fichier "Append only" pour l'intégrité entre les instantanés.
Redis est très rapide
C'est également l'une des bases de données NoSQL les plus rapides qui existent : 110000 SETs/seconde, 81000 GETs/seconde dans une boîte Linux d'entrée de gamme. Vérifiez les points de référence .
En voulant rester fidèle à Redis, j'ai développé un client C# Redis très rapide avec un fort accent sur la performance. Exécution des propres benchmarks de Raven DB la configuration par défaut du serveur redis est 16.9x plus rapide que le Raven DB. Lorsqu'il est ajusté pour utiliser la appendfsync always
(bien que non recommandé), il est toujours 11,75x plus rapide .
@marcgravell a mis au point un système très rapide Client Redis asynchrone C# utilisé pour gérer les Stack Overflows et la mise en cache distribuée des autres sites Stack Exchange.
Simple et élégant
Comme la plupart des magasins de données NoSQL, Redis est sans schéma, ce qui vous permet de l'utiliser directement sans avoir à définir de schémas au préalable, ce qui représente un gain de productivité important. La beauté de Redis, c'est qu'il s'agit d'accéder aux classes de collections génériques de .NET auxquelles vous êtes habitué en C#. Il y a donc très peu de projection à faire, car son API est déjà très proche des listes et des structures de données en mémoire que votre programme utilise déjà.
C'est cette élégance d'offrir des structures de données informatiques fondamentales qui distingue Redis, lui permettant d'être extrêmement polyvalent tout en ne supportant qu'un ensemble limité d'opérations. Par exemple, Redis a été couramment utilisé comme cache distribué, file d'attente de messages, courtier IPC entre les langages/processus, Pub/Sub, push/event-based comms, distributed-locking, CQRS Event Source, Unique Id generator, etc. Même si vous ne l'utilisez pas comme magasin de données principal, sa vitesse et sa simplicité vous donnent accès à une boîte à outils polyvalente qui peut répondre à une multitude de cas d'utilisation.
Client Redis complet
Il existe un certain nombre de Clients Redis C#/.NET disponible, et sur NuGet . L'exemple ci-dessous utilise mon Le client C# open source de ServiceStack .
Toute la documentation et les didacticiels pour le client Redis C# de ServiceStack sont disponibles à l'adresse suivante : http://www.servicestack.net/docs/redis-client/redis-client
Le client offre une interface riche fournissant des enveloppes pour les mappages génériques IList, IDictionary et ICollection de .NET vers les riches structures de données côté serveur de Redis. Pour un aperçu rapide de ses fonctionnalités Consultez la carte des images de l'API .
Un bon tutoriel montrant comment développer une application réelle se trouve à l'adresse suivante : http://www.servicestack.net/docs/redis-client/designing-nosql-database
Voir le code source de Redis StackOverflow pour un autre exemple d'une application du monde réel construite entièrement avec Redis.
Exemple de code montrant une application CRUD complète :
public class Todo
{
public long Id { get; set; }
public string Content { get; set; }
public int Order { get; set; }
public bool Done { get; set; }
}
//Thread-safe client factory
var redisManager = new PooledRedisClientManager("localhost:6379");
redisManager.ExecAs<Todo>(redisTodos => {
var todo = new Todo {
Id = redisTodos.GetNextSequence(),
Content = "Learn Redis",
Order = 1,
};
redisTodos.Store(todo);
Todo savedTodo = redisTodos.GetById(todo.Id);
savedTodo.Done = true;
redisTodos.Store(savedTodo);
redisTodos.DeleteById(savedTodo.Id);
var allTodos = redisTodos.GetAll();
Assert.That(allTodos.Count, Is.EqualTo(0));
});
Pour jouer avec cet exemple en direct, voir le site de ServiceStack L'application TODO de Backbone équipé d'un C# Redis back-end .
Fonctionne dans toutes les langues et sur toutes les plateformes
En raison de sa simplicité, il dispose de liaisons linguistiques pour presque toutes les langues utilisées aujourd'hui : http://redis.io/clients
C'est encore plus laconique dans les langages dynamiques, voici comment il est facile de créer un fichier hébergement de serveur web non bloquant, compteurs nommés dans node.js/CoffeeScript :
app.get '/counters/:id', (request, response) ->
id = request.params.id
redis.incr id, (err, val) ->
response.send "#{id}: #{val}", 'Content-Type': 'text/plain', 201
L'un des avantages de NoSQL est que vous pouvez se mélanger avec des développeurs de différents horizons linguistiques qui se réunissent pour trouver la meilleure façon de tirer parti de Redis pour répondre à nos besoins.
Largement utilisé par les plus grandes entreprises
En raison de sa simplicité, de sa stabilité et de sa rapidité, il est utilisé par de nombreuses grandes entreprises y compris :
- StackOverflow
- GitHub
- Blizzard
- Flickr
- Digg
Télécharger Redis pour Windows
J'ai fourni instructions de montage et des téléchargements pour les deux méthodes les plus populaires d'exécution de Redis sur Windows : https://github.com/mythz/redis-Windows qui montre comment faire :
- Utilisez Vagrant pour exécuter la dernière version stable de Redis à l'intérieur d'une VirtualBox VM .
- Téléchargez et exécutez Portage natif de Redis par Microsoft
Vous n'indiquez pas quelles sont vos exigences (c'est-à-dire qu'il doit fonctionner sous Windows), alors je vais vous donner les deux solutions que j'ai utilisées avec succès.
MongoDB est une base de données de documents qui possède des binaires préconstruits pour Windows 32bit et 64bit. C'est toujours agréable à voir.
L'accès du client peut se faire avec ce conducteur . Ce n'est pas un client officiel de l'équipe MongoDB elle-même, mais je l'ai utilisé. Et dans mon utilisation, il a pris en charge ce dont j'avais besoin. Il y a quelques Trucs LINQ dans le répertoire mais je ne l'ai pas essayé.
// from the wiki
using MongoDB.Driver;
Mongo db = new Mongo();
db.Connect(); //Connect to localhost on the default port.
Document query = new Document();
query["field1"] = 10;
Document result = db["tests"]["reads"].FindOne(query);
db.Disconnect();
J'ai pu faire fonctionner le client et le serveur sous Windows sans aucun problème.
CouchDB est également une option. Il existe quelques clients natifs .NET, mais tout CouchDB se fait par REST. Ainsi, HttpWebRequest/Response vous sera utile ici. A billet de blog de Rinat Abdullin montre comment certaines des pièces s'assemblent. Il y a aussi CouchBrowse . Je n'ai jamais utilisé de client natif. GET/PUT/POST ont très bien fonctionné pour moi.
J'ai réussi à faire fonctionner CouchDB sous Windows (il est écrit en Erlang), mais mes tests de performance ont montré que Linux était plus rapide. Je pense que c'est peut-être dû à la façon dont Erlang est implémenté ? Je n'en sais rien. Mais il fonctionne à la fois sur Windows et Linux. Et j'ai été capable d'appeler l'instance Linux depuis Windows facilement (c'est juste REST).
Je n'ai jamais essayé le suivant, mais j'ai un ami qui est un committer sur le Projet HBase . Et il pense que le Interface de Thrift avec HBase devrait être utilisable à partir de .NET (puisque Économie d'argent générera du C#). Le point important ici est le fait que Hadoop/HBase sont davantage axés sur les environnements *nix. Mais il n'y a aucune raison pour que vous ne puissiez pas exécuter HBase sur un cluster Linux et vous y connecter à partir de .NET sur Windows pour la production. Pour le développement, vous pouvez exécuter HBase sur Windows en utilisant Cygwin. Un bon ensemble d'instructions sur la façon de faire ceci est aquí .
Il en existe d'autres (Valdemort, Cassandra, etc.) mais je n'ai pas de réelle expérience avec eux et je ne prétendrai pas dire comment ils s'intègrent à C#/.NET. Le plus important est de savoir à quoi ressemble leur API. Si elle possède une interface Thrift, REST, etc. vous devriez pouvoir vous y connecter sans problème. Il se peut que vous ne puissiez pas exécuter le service NoSQL sur le système d'exploitation Windows aussi efficacement que sur Linux, mais ce n'est peut-être pas un gros problème.
EDIT Changé qu'il existe des clients CouchDB natifs. Je ne suis pas familier avec eux car j'utilise toujours le HTTP brut et mes propres petites classes d'encapsulation.
Ayende est en train d'en écrire un en .net, il s'appelle RavenDB .
Consultez son dépôt Git :
http://github.com/ravendb/ravendb
... et ses articles de blog à ce sujet :
http://ayende.com/blog/tags/raven
EDITAR:
Maintenant, c'est fini. Vous pouvez le consulter à l'adresse suivante http://ravendb.net/ .
RavenDB d'Ayende est un backend et un client NOSQL basé sur .NET (spécifiquement une base de données de documents). La source est librement disponible. Les performances sont comparables à celles de MongoDB (les derniers tests ont montré une vitesse d'environ 6000 insertions par seconde). L'indexation est faite d'une manière très intelligente en utilisant LINQ. Interface Rest, Web UI. Très très intelligent en fait.
RavenDB peut fonctionner comme un service, dans IIS ou via une console (exe). Nécessite .NET 4 pour le côté serveur.
Le client peut être .NET 3.5, en fait le client fonctionnera en Mono je crois.
http://groups.google.com/group/ravendb/web - toute la documentation qu'il y a
Editar : Je suis allé à l'événement de lancement, des fonctionnalités étonnantes ajoutées et beaucoup plus à venir. Tout le monde a été époustouflé par Raven, donc à vérifier.
J'ai utilisé brightstardb pour le dernier projet sur lequel j'ai travaillé. Il s'agit d'une application native .NET NoSql avec un Entity Framework complet (ce qui a permis de mettre en place une application en quelques minutes dès le premier téléchargement). J'ai d'abord essayé ravendb, mais bien qu'il soit assez simple à installer, toutes les configurations de mapreduce et d'indexation m'ont pris trop de temps pour que je puisse les comprendre, et elles étaient lentes et maladroites lorsque je voulais naviguer dans les relations entre les "choses" dans les deux sens. Le développement avec brightstardb a été génial, il est vraiment similaire à code first entity framework mais sans la douleur de la mise en place d'une base de données et je peux faire des tas de changements à mon modèle de données sans la douleur que j'ai dû traverser avec SQL.
Cela vaut vraiment la peine de jeter un coup d'œil ! http://brightstardb.com/