sql >> Database >  >> NoSQL >> Redis

Redis-transacties

Deze pagina biedt voorbeelden van het maken van atomaire Redis-transacties met de C# Redis-client van ServiceStackRedis Service Stack

Aangepaste atomaire bewerkingen maken in Redis #

Een van de belangrijkste kenmerken van Redis is de mogelijkheid om aangepaste atomaire operaties te bouwen. Dit wordt bereikt door gebruik te maken van de MULTI/EXEC/DISCARD-bewerkingen van Redis.

De C# Redis Client van ServiceStack maakt het gemakkelijk om Redis-transacties te gebruiken door een sterk getypeerde IRedisTransaction (voor strings) en IRedisTypedTransaction (voor POCO-types) API's met gemaksmethoden waarmee u elke IRedisClient-bewerking binnen één transactie kunt combineren.

Het maken van een transactie wordt gedaan door IRedisClient.CreateTransaction() . aan te roepen . Van daaruit 'in de wachtrij' alle bewerkingen waarvan u deel wilt uitmaken van de transactie met behulp van een van de IRedisTransaction.QueueCommand() overbelastingen. Daarna kunt u alle bewerkingen uitvoeren door IRedisTransaction.Commit() . aan te roepen die het 'EXEC'-commando naar de Redis-server stuurt en alle Queued-commando's uitvoert en hun callbacks verwerkt.

Als u de Commit() . niet aanroept voor het einde van het gebruiksblok, Dispose() methode roept automatisch Rollback() . op die het 'DISCARD'-commando verzendt om de huidige transactie te verwijderen en de Redis-clientverbinding terug te zetten naar de vorige staat.

Redis-transactievoorbeelden #

Hieronder ziet u een eenvoudig voorbeeld dat laat zien hoe u Redis-bewerkingen in de wachtrij kunt zetten met en zonder terugbellen.

int callbackResult;
using (var trans = redis.CreateTransaction())
{
  trans.QueueCommand(r => r.Increment("key"));  
  trans.QueueCommand(r => r.Increment("key"), i => callbackResult = i);  

  trans.Commit();
}
//The value of "key" is incremented twice. The latest value of which is also stored in 'callbackResult'.

Andere veelvoorkomende voorbeelden #

De volledige broncode en andere veelvoorkomende voorbeelden zijn te vinden op de pagina met algemene transactietests.

[Test]
public void Can_Set_and_Expire_key_in_atomic_transaction()
{
    var oneSec = TimeSpan.FromSeconds(1);

    Assert.That(Redis.GetString("key"), Is.Null);
    using (var trans = Redis.CreateTransaction())                  //Calls 'MULTI'
    {
        trans.QueueCommand(r => r.SetString("key", "a"));      //Queues 'SET key a'
        trans.QueueCommand(r => r.ExpireKeyIn("key", oneSec)); //Queues 'EXPIRE key 1'

        trans.Commit();                                        //Calls 'EXEC'

    }                                                              //Calls 'DISCARD' if 'EXEC' wasn't called

    Assert.That(Redis.GetString("key"), Is.EqualTo("a"));
    Thread.Sleep(TimeSpan.FromSeconds(2));
    Assert.That(Redis.GetString("key"), Is.Null);
}

[Test]
public void Can_Pop_priority_message_from_SortedSet_and_Add_to_workq_in_atomic_transaction()
{
    var messages = new List<string> { "message4", "message3", "message2" };

    Redis.AddToList("workq", "message1");

    var priority = 1;
    messages.ForEach(x => Redis.AddToSortedSet("prioritymsgs", x, priority++));

    var highestPriorityMessage = Redis.PopFromSortedSetItemWithHighestScore("prioritymsgs");

    using (var trans = Redis.CreateTransaction())
    {
        trans.QueueCommand(r => r.RemoveFromSortedSet("prioritymsgs", highestPriorityMessage));
        trans.QueueCommand(r => r.AddToList("workq", highestPriorityMessage));	

        trans.Commit();											
    }

    Assert.That(Redis.GetAllFromList("workq"), 
        Is.EquivalentTo(new List<string> { "message1", "message2" }));
    Assert.That(Redis.GetAllFromSortedSet("prioritymsgs"), 
        Is.EquivalentTo(new List<string> { "message3", "message4" }));
}

Alles-in-een voorbeeld #

Deze en andere voorbeelden zijn te vinden in de testsuite RedisTransactionTests.cs.

Hier is een alles-in-één-voorbeeld dat verschillende Redis-bewerkingen combineert binnen een enkele transactie:

[Test]
public void Supports_different_operation_types_in_same_transaction()
{
    var incrementResults = new List<int>();
    var collectionCounts = new List<int>();
    var containsItem = false;

    Assert.That(Redis.GetString(Key), Is.Null);
    using (var trans = Redis.CreateTransaction())
    {
        trans.QueueCommand(r => r.Increment(Key), intResult => incrementResults.Add(intResult));
        trans.QueueCommand(r => r.AddToList(ListKey, "listitem1"));
        trans.QueueCommand(r => r.AddToList(ListKey, "listitem2"));
        trans.QueueCommand(r => r.AddToSet(SetKey, "setitem"));
        trans.QueueCommand(r => r.SetContainsValue(SetKey, "setitem"), b => containsItem = b);
        trans.QueueCommand(r => r.AddToSortedSet(SortedSetKey, "sortedsetitem1"));
        trans.QueueCommand(r => r.AddToSortedSet(SortedSetKey, "sortedsetitem2"));
        trans.QueueCommand(r => r.AddToSortedSet(SortedSetKey, "sortedsetitem3"));
        trans.QueueCommand(r => r.GetListCount(ListKey), intResult => collectionCounts.Add(intResult));
        trans.QueueCommand(r => r.GetSetCount(SetKey), intResult => collectionCounts.Add(intResult));
        trans.QueueCommand(r => r.GetSortedSetCount(SortedSetKey), intResult => collectionCounts.Add(intResult));
        trans.QueueCommand(r => r.Increment(Key), intResult => incrementResults.Add(intResult));

        trans.Commit();
    }

    Assert.That(containsItem, Is.True);
    Assert.That(Redis.GetString(Key), Is.EqualTo("2"));
    Assert.That(incrementResults, Is.EquivalentTo(new List<int> { 1, 2 }));
    Assert.That(collectionCounts, Is.EquivalentTo(new List<int> { 2, 1, 3 }));
    Assert.That(Redis.GetAllFromList(ListKey), Is.EquivalentTo(new List<string> { "listitem1", "listitem2" }));
    Assert.That(Redis.GetAllFromSet(SetKey), Is.EquivalentTo(new List<string> { "setitem" }));
    Assert.That(Redis.GetAllFromSortedSet(SortedSetKey), Is.EquivalentTo(new List<string> { "sortedsetitem1", "sortedsetitem2", "sortedsetitem3" }));
}

  1. Query's met mangoest en dadels

  2. Mongoose/node.js hoe te vinden, vullen, dingen doen, 'ontvolken' en bijwerken

  3. Zoek op id met mgo

  4. MongoDB-geheugengebruik bijhouden