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

Memperbarui Daftar Redis Tumpukan Layanan

Hindari Daftar:

Sayangnya daftar Redis bukanlah pilihan yang tepat dalam situasi ini. Saya memiliki masalah yang sama ketika saya mulai menggunakan Redis, mereka tampak seperti pilihan yang jelas;). Daftar redis berguna jika Anda menggunakannya sebagai set hanya-baca, atau jika Anda hanya ingin pop dan push, tetapi tidak untuk memodifikasi item di tengah daftar.

Anda dapat "memperbarui" item dalam daftar Redis jika Anda mengetahui indeks item tersebut, tetapi item tersebut harus menghapus dan masukkan kembali , dan itu harus berdasarkan indeks, yang penentuannya sangat tidak efisien. Ia melakukannya dengan mengulangi koleksi, karena tidak ada cara asli untuk melakukannya, dan ini bukan ide yang baik. Ini adalah cuplikan dari IndexOf metode RedisClientList<T> .

public int IndexOf(T item)
{
    //TODO: replace with native implementation when exists
    var i = 0;
    foreach (var existingItem in this)
    {
        if (Equals(existingItem, item)) return i;
        i++;
    }
    return -1;
}

Jadi untuk melengkapi kode Anda, itu akan menjadi:

public void UpdatePizza(Pizza pizza)
{
    using (var redisClient = new RedisClient(Host, Port))
    {
        IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
        IRedisList<Pizza> pizzas = redis.Lists["pizzas:live"];
        var toUpdate = pizzas.First(x => x.Id == pizza.Id);
        toUpdate.State = pizza.State;

        // Update by removing & inserting (don't do it!)
        var index = pizzas.IndexOf(toUpdate);
        pizzas.Remove(index);
        pizzas.Insert(index, toUpdate);
    }                   
}

Tapi ini bukan cara yang bagus untuk menanganinya seperti yang saya katakan. Ini akan mengambil daftar objek pizza lainnya kemudian mengulanginya sampai cocok dengan indeks. Dan dua operasi untuk memperbarui! :( Sebaiknya hindari daftar dalam situasi ini.

Solusi:

Saat Anda mencoba mengakses pizza dengan ID-nya, Anda dapat membuat kunci pizza unik untuk setiap objek, ini akan memungkinkan Anda mengakses pizza secara langsung. Jadi kita mungkin menggunakan:

pizzas:live:{Id}

Contoh:

Buat pizza

using (var redisClient = new RedisClient())
{
    IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
    var pizzaKey = string.Format("pizzas:live:{0}", 123);
    var pizza = new Pizza { Id = 123, Type = "Mushroom", State = "Cooking" };
    redis.SetEntry(pizzaKey, pizza);
}

Dapatkan pizza berdasarkan ID

using (var redisClient = new RedisClient())
{
    IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
    var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
    var pizza = redis.GetValue(pizzaKey);
}

Memperbarui pizza menurut Id (Cukup GET dan SET)

using (var redisClient = new RedisClient())
{
    IRedisTypedClient<Pizza> redis = redisClient.As<Pizza>();
    var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
    var pizza = redis.GetValue(pizzaKey); // Get
    pizza.State = "Delivery"; // Update
    redis.SetEntry(pizzaKey, pizza); // Save
}

Pindah ke "daftar" lain (mungkin:saat pizza berubah status)

using (var redisClient = new RedisClient())
{
    var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
    var deliveredKey = string.Format("pizzas:delivered:{0}", pizza.Id);
    redisClient.RenameKey(pizzaKey, deliveredKey);
}

Menghapus pizza

using (var redisClient = new RedisClient())
{
    var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
    redisClient.Remove(pizzaKey);
}

Buat daftar semua pizza live

using (var redisClient = new RedisClient())
{
    var livePizzaKeys = redisClient.ScanAllKeys("pizzas:live:*").ToList();
    List<Pizza> livePizzas = redisClient.GetValues<Pizza>(livePizzaKeys);
}

Saya harap ini membantu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. resque-scheduler gagal pada penghapusan pekerjaan

  2. Bagaimana cara menentukan waktu eksekusi skrip Lua di Redis?

  3. Jedis - Kapan menggunakan returnBrokenResource()

  4. Bagikan sesi dengan redis dan paspor di subdomain?

  5. Bagaimana cara menggunakan redis' `DUMP` dan `RESTORE` (offline)?