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

时间:2010-03-11 13:44:30

标签: key-value

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

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

5 个答案:

答案 0 :(得分:1)

Memcache具有此功能built in

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

答案 1 :(得分:1)

拥有incr()功能的意义在于它全部都在商店内部。您不必将数据拉出并将其推回。

你正在做的事情听起来像你想在你的代码中加入一些逻辑来提取数据,增加数据并将其推回......虽然它不是很难(我想我刚刚描述了你如何“这样做”,它确实有点失败。

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

但很多缓存已经有了这个。如果你真的需要这个速度,也许你应该找到一个像memcached这样的备用商店来支持它。

答案 2 :(得分:1)

看起来好像没有compareAndSet那么你运气不好。但它将有助于从另一个角度考虑问题。例如,如果您正在实现一个显示问题的upvotes数量的原子计数器,那么一种方法是每个问题都有一个“表”,每个upvote为+1,每个downvote为-1。然后“得到”你会把“表”加起来。为了实现这个目的,我假设“表格”价格便宜而且你不关心“获取”计算需要多长时间,你只提到了incr / decr。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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