सूचियों से बचें:
दुर्भाग्य से Redis सूचियाँ वास्तव में एक अच्छा विकल्प नहीं हैं इस दशा में। मेरे पास एक ही समस्या थी जब मैंने रेडिस का उपयोग करना शुरू किया, वे स्पष्ट पसंद की तरह लगते हैं;)। रेडिस सूचियाँ तब उपयोगी होती हैं जब आप उन्हें केवल पढ़ने के लिए सेट के रूप में उपयोग कर रहे हों, या यदि आप केवल पॉप और पुश करना चाहते हैं, लेकिन सूची के बीच में किसी आइटम को संशोधित करने के लिए नहीं।
यदि आप आइटम की अनुक्रमणिका जानते हैं, तो आप Redis सूची में आइटम "अपडेट" कर सकते हैं, लेकिन इसके लिए निकालने की आवश्यकता होती है और फिर से डालें , और यह सूचकांक द्वारा होना चाहिए, जो निर्धारित करना बेहद अक्षम है। यह संग्रह को पुनरावृत्त करके ऐसा करता है, क्योंकि ऐसा करने का कोई मूल तरीका नहीं है, और यह एक अच्छा विचार नहीं है। यह IndexOf
. का एक स्निपेट है 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;
}
तो अपना कोड पूरा करने के लिए, यह होगा:
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);
}
}
लेकिन जैसा कि मैंने कहा है, इसे संभालने का यह एक अच्छा तरीका नहीं है। यह अन्य पिज़्ज़ा वस्तुओं की सूची को पुनः प्राप्त करेगा, फिर उन पर पुनरावृति करेगा जब तक कि यह सूचकांक से मेल नहीं खाता। और अद्यतन करने के लिए दो ऑपरेशन! :( इस स्थिति में सूचियों से बचने के लिए सर्वश्रेष्ठ।
समाधान:
चूंकि आप पिज्जा को उसकी आईडी से एक्सेस करने का प्रयास कर रहे हैं तो आप प्रत्येक ऑब्जेक्ट के लिए एक अद्वितीय पिज्जा कुंजी बना सकते हैं, इससे आप सीधे पिज्जा तक पहुंच सकते हैं। तो हम उपयोग कर सकते हैं:
pizzas:live:{Id}
उदाहरण:
पिज्जा बनाएं
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);
}
आईडी के अनुसार पिज़्ज़ा प्राप्त करें
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);
}
Id के अनुसार पिज़्ज़ा अपडेट करें (सिर्फ एक GET और 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
}
किसी अन्य "सूची" पर जाएं (हो सकता है:जब पिज़्ज़ा की स्थिति बदल जाए)
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);
}
पिज्जा हटाएं
using (var redisClient = new RedisClient())
{
var pizzaKey = string.Format("pizzas:live:{0}", pizza.Id);
redisClient.Remove(pizzaKey);
}
सभी लाइव पिज़्ज़ा की सूची बनाएं
using (var redisClient = new RedisClient())
{
var livePizzaKeys = redisClient.ScanAllKeys("pizzas:live:*").ToList();
List<Pizza> livePizzas = redisClient.GetValues<Pizza>(livePizzaKeys);
}
मुझे आशा है कि यह मदद करता है।