0

如何在键/值存储之上实现 incr/decr?

我正在使用不支持 incr 和 decr 的键值存储,但这就是我要创建它的原因。我使用了 Redis 和 Memcached incr 和 decr,所以正如一些答案中提到的那样,这是我希望 incr 和 decr 如何表现的完美示例,所以感谢那些提到这一点的人。

4

5 回答 5

1

Memcache内置了这个功能

编辑:看起来你不会在不更新源的情况下获得原子更新,因为似乎没有锁定功能。如果有(这并不漂亮),您可以锁定该值,获取它,在您的应用程序中递增它,放入它,然后解锁它。虽然次优。

于 2010-03-11T13:50:13.627 回答
1

拥有一个incr()功能的关键在于它是商店内部的。您不必将数据拉出然后再将其推回。

您正在做的事情听起来像是您想在代码中添加一些逻辑,将数据拉出,递增并将其推回......虽然这不是很难(我想我刚刚描述了你会怎么做它),它确实在某种程度上打败了这一点。

要获得好处,您需要更改密钥库的来源。可能很容易。

但是很多缓存已经有了这个。如果你真的需要这个来提高速度,也许你应该找到一个支持它的替代商店,比如 memcached。

于 2010-03-11T13:51:49.337 回答
1

如果您希望自动增加或减少int与例如 type 的键关联的值string,并且如果您在必须对其中任何一个执行原子操作之前知道所有键,请使用Dictionary<string, int[]>并预先填充字典每个键值的单项数组。然后就可以通过像Threading.Interlocked.Increment(MyDict[keyString][0]);. 如果您需要能够处理事先不知道的键,您可能需要使用 aConcurrentDictionary而不是Dictionary,但是如果两个线程尝试同时为同一个键创建字典条目,则需要小心。

于 2012-12-12T20:13:01.213 回答
1

似乎没有 compareAndSet 那么你就不走运了。但这将有助于从另一个角度考虑问题。例如,如果您正在实现一个原子计数器来显示一个问题的赞成票数,那么一种方法是为每个问题设置一个“表格”,并为每个赞成票加上 +1,为每个反对票加上 -1。然后要“获取”,您将对“表”求和。为此,我假设“表”很便宜,并且您不在乎“获取”需要多长时间来计算,您只提到了 incr/decr。

于 2010-03-12T15:37:17.993 回答
0

由于递增和递减是“可交换”的简单加减运算,因此您需要实现的是一个 PN 计数器。它是一种 CRDT(可交换复制数据类型)。网络上和 Github 上都有各种关于如何在 Riak 上实现此功能的示例。

于 2013-02-18T10:11:28.900 回答