Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Transaksi Redis

Halaman ini memberikan contoh tentang cara membuat transaksi Atom Redis dengan C# Redis Client ServiceStackRedis ServiceStackRedis

Cara membuat operasi atom khusus di Redis #

Salah satu fitur utama Redis adalah kemampuan untuk membangun operasi atom khusus. Ini dicapai dengan memanfaatkan operasi MULTI/EXEC/DISCARD Redis.

Klien C# Redis ServiceStack memudahkan penggunaan transaksi Redis dengan menyediakan IRedisTransaction (untuk string) dan API IRedisTypedTransaction (untuk tipe POCO) yang diketik dengan kuat dengan metode praktis untuk memungkinkan Anda menggabungkan operasi IRedisClient apa pun dalam satu transaksi.

Membuat transaksi dilakukan dengan memanggil IRedisClient.CreateTransaction() . Dari sana Anda 'Antri' semua operasi yang Anda inginkan untuk menjadi bagian dari transaksi dengan menggunakan salah satu IRedisTransaction.QueueCommand() kelebihan beban. Setelah itu Anda dapat menjalankan semua operasi dengan memanggil IRedisTransaction.Commit() yang akan mengirimkan perintah 'EXEC' ke server Redis yang mengeksekusi semua perintah Antrian dan memproses panggilan baliknya.

Jika Anda tidak memanggil Commit() sebelum akhir blok using, Dispose() metode akan secara otomatis memanggil Rollback() yang akan mengirim perintah 'DISCARD' untuk menghapus transaksi saat ini dan mengatur ulang koneksi klien Redis kembali ke keadaan sebelumnya.

Contoh Transaksi Redis #

Di bawah ini adalah contoh sederhana yang menunjukkan cara mengantrekan operasi Redis dengan dan tanpa callback.

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'.

Contoh umum lainnya #

Kode sumber lengkap dan contoh umum lainnya dapat ditemukan di halaman pengujian transaksi umum.

[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" }));
}

Contoh lengkap #

Ini dan contoh lainnya dapat ditemukan dengan melihat rangkaian pengujian RedisTransactionTests.cs.

Berikut adalah contoh lengkap yang menggabungkan berbagai operasi Redis dalam satu transaksi:

[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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. pemendekan UUID

  2. Skor unik untuk papan peringkat redis

  3. Redis tidak dimulai sebagai layanan windows di Windows7

  4. Komunikasi antara dua wadah Docker di macOS 10.12

  5. Tidak dapat menghubungkan Redis Cluster di Elasticache ke PHP menggunakan perpustakaan phpredis