有没有正确的方法来更新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列表很有用。
如果知道项目的索引,则可以“更新” Redis列表中的项目,但是它需要 删除 并 重新插入 ,并且必须按索引进行,这确定效率非常低。它是通过迭代集合来实现的,因为没有本机的方法可以这样做,但这不是一个好主意。这是的IndexOf方法的摘要RedisClientList<T>。
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); } }
但这不是我所说的好方法。它将检索其他比萨饼对象的列表,然后遍历它们直到与索引匹配。并进行两次操作更新!:(在这种情况下,最好避免列出。
当您尝试通过ID来访问披萨时,可以为每个对象创建一个唯一的披萨密钥,这将使您可以直接访问披萨。因此,我们可以使用:
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更新比萨 (只需获取并设置)
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); }
我希望这有帮助。