有没有正确的方法来更新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>
。
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);
}
我希望这有帮助。
我正试图用服务栈实现Swagger。我已经用nuget安装了带有swagger的服务栈。当前的DLL版本大多报告为3.9.56.0。 我正在努力遵循…https://github.com/ServiceStack/ServiceStack.UseCases/tree/master/SwaggerHelloWorld提供的例子 这个指令看起来相当简单... 在我通过nuget安装后(按照文档说明),
数字键盘字母组合问题[M]
问题内容: 现在,Stack Overflow使用redis,它们是否以相同的方式处理缓存失效?即散列到查询字符串+名称的身份列表(我想这个名称是某种用途或对象类型的名称)。 也许他们然后直接通过id(从一堆数据库索引中绕过,而是使用效率更高的聚集索引)直接从缓存中检索缺少的单个项。那会很聪明(杰夫提到的补液?)。 现在,我正在努力寻找一种简洁地解决所有问题的方法。在我自己进行初次切割之前,是否有
问题内容: 在使用以下方式部署此撰写文件的堆栈时: 生成的服务名称将为 myapp_service-name 我希望它由 my-custom-service-name 命名和引用 __ 问题答案: 对于服务之间的通信,如果两个服务都在同一网络中,则可以使用在撰写文件中定义的serviceName(在您的情况下,您的服务名称为service-name)。 完成后,堆栈名称将显示在每个服务之前。这样做
我正在为我的考试做复习,我遇到了这个问题,我需要在执行以下代码后找到Q1的内容。 数据 普塞多密码 这是我的解决方案 > 如果数字不是0,则将数字推送到堆栈,使堆栈现在变为0 否则,弹出堆栈的前两个元素,因此现在堆栈变为 3.循环堆栈!清空,弹出堆栈并在Q1中排队。所以现在堆栈为空,队列变为空 33是队列中的第一个,5是队列中的最后一个。 我仔细核对了提供的答案,发现我的答案不同 提供的答案 我不
问题内容: 一旦PriorityQueue中对象的优先级发生更改,Java是否有一种简便的方法来重新评估堆?我在中找不到任何迹象,但是必须有某种方法可以做到这一点,对吗?我当前正在删除对象,然后重新添加它,但这显然比在堆上运行更新要慢。 问题答案: 您可能需要自己实现这样的堆。您需要对项目在堆中的位置有一些处理,并需要有一些方法可以在优先级发生变化时向上或向下推项目。 几年前,我在学校工作中写了这