[英]Updating Service Stack Redis List
有沒有正確的方法來更新IRedisList? 使用下面的示例代碼,我可以修改它以刪除列表,更新比薩餅並重新添加列表,但這感覺不對。 命令行文檔很漂亮,但這是一個比我更大的項目,我不完全確定從哪里開始尋找。
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;
//??How to save
}
}
不幸的是,在這種情況下,Redis列表並不是一個好的選擇 。 當我開始使用Redis時,我遇到了同樣的問題, 它們似乎是明顯的選擇;)。 如果您將它們用作只讀集,或者只是想要彈出和推送,而不是用於修改列表中間的項目,則Redis列表非常有用。
如果您知道項目的索引,則可以“更新”Redis列表中的項目,但它需要刪除並重新插入 ,並且必須通過索引來確定非常低效。 它通過迭代集合來實現,因為沒有本地方法可以做到這一點,這不是一個好主意。 這是 RedisClientList<T>
的IndexOf
方法的片段 。
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);
}
通過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);
}
通過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);
}
我希望這有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.