GET key
WATCH key
MULTI
SET key new_val
EXEC
我主要担心的是,由于watch
使用乐观锁定,当我将有多个进程(比键数多得多,键数只有4个)试图更新值时,事务失败率将非常高。
这是正确的吗?有没有办法防止这种情况发生?
除非您在应用程序中使用get key
的回复执行某些操作,否则不清楚为什么这里需要事务。因此,我将假设您使用的是有意义的值,否则,您可以删除事务语义,只需调用set键new_val
。
乐观锁定主要用于资源争用少的情况。由于您描述的用例显然与此相反,因此可能会导致高失败率。这并不是说Redis和你的应用程序不能工作,但它确实意味着有可能浪费大量的精力。
我建议您考虑在可能的情况下使用Redis的服务器端Lua脚本。它们是块的、原子的,让您以编程方式读取和有意义地操作Redis中的数据。有关详细信息,请参阅eval
命令。
问题内容: 我在RedisOnGo + node_redis上使用NodeJS + Express + Redis作为客户端。我期望很多并发,因此尝试测试WATCH。此示例将不包含Express,仅包含必要的内容。 预期的结果 :在exec回调中得到N个错误,最后得到“ inc”变量= 10-N。 意外的结果 :exec回调中出现0个错误,但最终得到“ inc”变量= 1。 观看不适用于我的代码。
我正在使用Jedis,我想创建一个包含多个独立事务(multi/exec块)的管道。 从我到目前为止看到的情况来看,似乎只有将整个管道切换成原子事务才是可能的。 我希望返回一个。 我怀疑在一个事务中使用整个流水线要比在一个流水线中使用多个较小的事务块花费更多。 谢谢!
问题内容: 在清理这个答案时,我对MySQL和s和存储过程有了一些了解,但感到震惊的是,尽管and 触发器可以修改数据,但它们似乎不会导致插入/更新失败(即验证)。在这种特殊情况下,我可以通过处理数据以导致主键重复的方式来使其工作,这在这种特殊情况下是有道理的,但在一般意义上不一定有意义。 这种功能在MySQL中可行吗?在其他RDBMS中(可悲的是,我的经验仅限于MySQL)?也许是样式语法? 问
我理解Lua脚本与watch/multi/exec相比相对较新。那么现在有没有理由使用watch/multi/exec呢?
我已经成功地在一个redis实例中使用multi和exec功能在redis中实现了(并测试了)事务操作。但是,在集群安装程序中运行的相同代码出错,出现以下异常消息。我使用spring-data-redis-1.8.1.release和jedis-2.9.0。 当前在集群模式下的spring data redis中是否支持事务(multi、exec)?如果是的话,我错过了什么?如果没有,是否有任何解
问题内容: 我正在使用Web服务的相同电子邮件地址对用户注册进行负载测试,并且同时连接的前10个用户将始终注册。 我正在使用WATCH和MULTI,但这似乎没有任何作用。 我正在调用save()来保存用户。 输出几乎总是: 我是在做错什么,还是redis无法处理那么多的并发。这也是Common的定义: 问题答案: 是!经过一整夜的休息之后,解决方案终于在淋浴时解决了。 问题是我为整个应用程序使用了