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