gpt4 book ai didi

c# - 更新服务栈 Redis 列表

转载 作者:IT王子 更新时间:2023-10-29 05:55:40 24 4
gpt4 key购买 nike

是否有更新 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 列表中的项目,但它需要删除重新插入,并且它必须是通过索引,确定是非常低效的。它通过迭代集合来做到这一点,因为没有本地方法可以做到这一点,这不是一个好主意。 This is a snippetIndexOf 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 更新披萨(简单的 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);
}

希望对您有所帮助。

关于c# - 更新服务栈 Redis 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23838181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com