Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redis C#-在事务中使用增量值_C#_Redis_Stackexchange.redis - Fatal编程技术网

Redis C#-在事务中使用增量值

Redis C#-在事务中使用增量值,c#,redis,stackexchange.redis,C#,Redis,Stackexchange.redis,我正在尝试使用Redis INCR和递增的值作为C#的散列中的字段,使用StackExchange.Redis。 这一点与我需要的类似,但在节点中 下面是我需要的东西 ITransaction transaction=m_connection.GetDatabase() .CreateTransaction(); Task incrementTask=Transaction.StringIncrementAsync(sequenceNumberRedisKey); if(等待Transactio

我正在尝试使用Redis INCR和递增的值作为C#的散列中的字段,使用StackExchange.Redis。 这一点与我需要的类似,但在节点中

下面是我需要的东西

ITransaction transaction=m_connection.GetDatabase()
.CreateTransaction();
Task incrementTask=Transaction.StringIncrementAsync(sequenceNumberRedisKey);
if(等待Transaction.ExecuteAsync())
{
long sequenceNumber=等待递增任务;
wait transaction.HashSetAsync(responseRedisKey,sequenceNumber,response);
}
请注意,
sequenceNumber
是我打算在事务中执行的第一个操作的结果

代码似乎是在我执行任何操作之前执行和提交事务

  • 这是在一个事务中执行多个操作的方式吗
  • 这是我在操作2(HashSetAsync)中使用操作1(StringIncrementAsync)的结果的方式吗
  • 如果HashSetAsync返回false,如何回滚序列号增量
  • 为什么没有明确的提交

  • redis MULTI/EXEC单元有一个基本功能,这意味着您无法在操作过程中获得结果。因此,有两种常见的方法来满足您的要求:

  • 使用Lua(
    ScriptEvaluate[Async]
    );Lua脚本从头到尾在服务器上执行,效率高,并且避免了与往返时间(延迟或带宽)或来自其他连接的竞争相关的所有问题
  • 使用一个乐观循环读取当前值,然后在SE Redis中创建一个事务,该事务添加了一个约束,即您刚才读取的值是相同的,并在事务内部执行副作用;库将协调必要的WATCH etc机制,使其具有鲁棒性,但如果约束条件无效(即库返回
    false
    ),则需要从头开始重新执行所有操作
  • 坦率地说,这些天我总是引导人们选择第一种选择;如果服务器端Lua脚本不可用,那么选项2只是“吸引人”(我使用的术语非常错误)

    我不在电脑前,但我猜脚本看起来会像:

    localid=redis.call(“incr”,键[1])
    调用(“hset”,键[2],tostring(id),ARGV[1])
    返回id
    
    这里的最佳做法是什么?有没有一个库可以在.NET核心应用程序中用于将C#写入Lua?我把剧本放在哪里。我可以把它像存储过程一样写入Redis吗/你能给我指一些吗documentatiion@JinsPeter上面显示的方法应该做到这一点;该库处理所有
    脚本加载
    etc语义,因此不会每次发送整个正文。如果您自己处理加载(由于卸载问题,不建议这样做):库会检测您是否发出SHA哈希,并做出相应的反应。以下是redis文档:-您只需将脚本和键/值传递给ScriptEvaluate@JinsPeter是的,这看起来确实有点不完整,以至于可能会误导;实际情况是:如果脚本字符串是SHA,它直接使用EVALSHA;否则,库会跟踪它所知道的脚本-如果它认为没有加载脚本,库(如果可以,但并不总是)会自动发布脚本加载;一旦确认,它将使用EVALSHA-直到那时:EVAL。它还检测到EVALSHA中指示已卸载的错误,并重新发布脚本加载等@JinsPeter或更简单地说:库使其“正常工作”: