LINUX.ORG.RU

Как лучше всего смержить листы строк на яве( List<String>).

 ,


0

2

Есть список строк, один пользователь берет его из базы, добавляет строку, второй берет убирает, задача : смержить листы и записать в базу лист включающий добавленную первым строку и не включающий убранную вторым. Пользователи убирают/добавляют только свои строки, т.е. не может быть чтобы одновременно один добавлял а второй то же удалял.

★★

Открываешь транзакцию, делаешь всё, что тебе надо, коммитишь. База сама всё «смерджит».

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

База сама всё «смерджит»

Это мемкеш. Мне кажется ничего там мержится не будет само. Есть 1 ключ и 1 одно значение. Второй пользователь просто перепишет изменения первого своей версией. Поэтому нужен мерж.

mio ★★
() автор топика
Ответ на: комментарий от Boy_from_Jungle

ListUtils.sum из apache.commons.collections вроде делает то что надо.

mio ★★
() автор топика
Ответ на: комментарий от mio

Обязательно так делать?

И вопрос по задаче: как добавляемый и удаляемы элементы связаны во времени? Они из команды вместе приходят? Или нужно собрать в одну транзакцию все команды за период?

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от mio

Тогда нужно делать список действий и просто применять его к базе при коммите (например insert «abc», delete «def»). Т.е. пользователь запросил список строк, мы его взяли из мемкеша и отдали пользователю. Пользователь выделил две строки для удаления, добавил третью и нажал «сабмит», контролер его действия распарсил, составил список действий [delete «vasya», delete «petya», insert «vova»] и послал в базу. А в базе уже синхронизированно применяются присылаемые изменения на хранящийся список.

Конфликты тут никак не разрулятся, просто применятся последние изменения, но ты вроде пишешь, что не должно быть.

Legioner ★★★★★
()
Ответ на: комментарий от vertexua

Да просто этот список строк мне надо периодически просматривать, поэтому мне показалось что удобней хранить все в одном месте а не в объектах пользователей и пробегаться каждый раз по всем пользователям и собирать воедино. В объектах пользователей у меня хранятся более меннее постоянные данные связанные с пользователем.

mio ★★
() автор топика
Ответ на: комментарий от mio

Может optimistic locking соорудить? Естественно если конфликты не часто. Или сделать один writer, которые принимает команды пачками. Это за вас может сделать какой-то встроенный кеш

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

А вот нефиг писать в кэш на запись. Кэшируй только при чтении. И да, все равно рассинхронизации будут, но импакт меньше. Можно поиграть с ttl.

dizza ★★★★★
()
Ответ на: комментарий от dizza

Да, на запись нужно только инвалидировать.

dizza ★★★★★
()
Ответ на: комментарий от zz

Я так понимаю, что элементы в списке удаляются, добавляются по ключу, а не по индексу. Сортированного хеша в редисе нет. Можно соорудить из sortedset и hashtable.

dizza ★★★★★
()
Ответ на: комментарий от mio

Это мемкеш.

Я не экстрасенс, но некоторые реализации мемкеша позволяют записать значение если оно было вычитано и не изменено кем-то другим. В ином же случае - ексепшн. Как вариант в цикле пытаться вычитать и записать пока операция не пройдет успешно.

Вот ссылка на доку для GAE:

https://developers.google.com/appengine/docs/java/memcache/overview#Safely_Ha...

anonymous_
()
Ответ на: комментарий от dizza

В шапке List<String>, на хеши я не подписывался :)

zz ★★★★
()
Ответ на: комментарий от dizza

Походу это тока gae и умеет.

CAS умеет и стоковый memcached.

anonymous
()

Смержить листы?

сплитом, только хардкор

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.