如何在键/值存储之上实现 incr/decr?
我正在使用不支持 incr 和 decr 的键值存储,但这就是我要创建它的原因。我使用了 Redis 和 Memcached incr 和 decr,所以正如一些答案中提到的那样,这是我希望 incr 和 decr 如何表现的完美示例,所以感谢那些提到这一点的人。
如何在键/值存储之上实现 incr/decr?
我正在使用不支持 incr 和 decr 的键值存储,但这就是我要创建它的原因。我使用了 Redis 和 Memcached incr 和 decr,所以正如一些答案中提到的那样,这是我希望 incr 和 decr 如何表现的完美示例,所以感谢那些提到这一点的人。
拥有一个incr()
功能的关键在于它是商店内部的。您不必将数据拉出然后再将其推回。
您正在做的事情听起来像是您想在代码中添加一些逻辑,将数据拉出,递增并将其推回......虽然这不是很难(我想我刚刚描述了你会怎么做它),它确实在某种程度上打败了这一点。
要获得好处,您需要更改密钥库的来源。可能很容易。
但是很多缓存已经有了这个。如果你真的需要这个来提高速度,也许你应该找到一个支持它的替代商店,比如 memcached。
如果您希望自动增加或减少int
与例如 type 的键关联的值string
,并且如果您在必须对其中任何一个执行原子操作之前知道所有键,请使用Dictionary<string, int[]>
并预先填充字典每个键值的单项数组。然后就可以通过像Threading.Interlocked.Increment(MyDict[keyString][0]);
. 如果您需要能够处理事先不知道的键,您可能需要使用 aConcurrentDictionary
而不是Dictionary
,但是如果两个线程尝试同时为同一个键创建字典条目,则需要小心。
似乎没有 compareAndSet 那么你就不走运了。但这将有助于从另一个角度考虑问题。例如,如果您正在实现一个原子计数器来显示一个问题的赞成票数,那么一种方法是为每个问题设置一个“表格”,并为每个赞成票加上 +1,为每个反对票加上 -1。然后要“获取”,您将对“表”求和。为此,我假设“表”很便宜,并且您不在乎“获取”需要多长时间来计算,您只提到了 incr/decr。
由于递增和递减是“可交换”的简单加减运算,因此您需要实现的是一个 PN 计数器。它是一种 CRDT(可交换复制数据类型)。网络上和 Github 上都有各种关于如何在 Riak 上实现此功能的示例。