Как реализовать incr / decr поверх хранилища ключей / значений? - PullRequest
0 голосов
/ 11 марта 2010

Как я могу реализовать incr / decr поверх хранилища ключей / значений?

Я использую хранилище значений ключей, которое не поддерживает incr и decr, поэтому я хочу создать это. Я использовал Redis и Memcached incr и decr, поэтому, как упоминалось в некоторых ответах, это прекрасный пример того, как я хочу, чтобы incr и decr вели себя, так что спасибо тем, кто упомянул это.

Ответы [ 5 ]

1 голос
/ 13 декабря 2012

Если вы хотите атомарно увеличить или уменьшить значение int, связанное с ключом, например, введите string, и, если вы заранее знаете все ключи о необходимости выполнения атомарных операций с любым из них, используйте Dictionary<string, int[]> и предварительно заполните словарь массивом из одного элемента для каждого значения ключа. Тогда будет возможно выполнять атомарные операции (например, приращение) над элементами с помощью кода, подобного Threading.Interlocked.Increment(MyDict[keyString][0]);. Если вам нужно иметь дело с ключами, которые не известны заранее, вам может потребоваться использовать ConcurrentDictionary вместо Dictionary, но вам следует быть осторожным, если два потока пытаются одновременно создать словарные записи для одного и того же ключ.

1 голос
/ 11 марта 2010

Смысл наличия функции incr() в том, что все это внутри магазина. Вам не нужно извлекать данные и вставлять их обратно.

То, что вы делаете, звучит так, как будто вы хотите вставить некоторую логику в ваш код, который вытягивает данные, увеличивает их и возвращает обратно ... Хотя это не очень сложно (я думаю, что я только что описал, как вы Я бы сделал это), это несколько побеждает точку.

Чтобы получить выгоду, вам нужно изменить источник вашего хранилища ключей. Может быть легко.

Но у многих кешей это уже есть. Если вам это действительно нужно для скорости, возможно, вам стоит найти альтернативный магазин, такой как memcached, который его поддерживает.

1 голос
/ 12 марта 2010

вроде как без сравнения и набора, тогда вам не повезло. Но это поможет рассмотреть проблему с другой стороны. Например, если вы внедрили атомарный счетчик, который показывает количество голосов за вопрос, то одним из способов было бы иметь «таблицу» на вопрос и поставить +1 для каждого повышения и -1 для каждого понижения. Затем, чтобы «получить», вы должны сложить «таблицу». Чтобы это работало, я предполагаю, что «таблицы» недороги, и вам все равно, сколько времени займет «get» для вычисления, вы упомянули только incr / decr.

1 голос
/ 11 марта 2010

Memcache имеет эту функцию встроенный

edit: похоже, что вы не получите элементарное обновление без обновления источника, так как там нет функции блокировки. Если есть (и это не красиво), вы можете заблокировать значение, получить его, увеличить его в своем приложении, поместить и разблокировать. Хотя неоптимальный.

0 голосов
/ 18 февраля 2013

Поскольку увеличение и уменьшение являются простыми операциями сложения и вычитания, которые являются «коммутативными», вам необходимо реализовать PN-счетчик. Это CRDT (коммутативный тип реплицируемых данных). Различные примеры того, как реализовать это на Riak, доступны в Интернете и на Github.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...