Ограниченный неблокирующий буфер Java для ситуации с большим числом одновременных запросов

По сути, мне нужна структура данных для хранения временных сообщений чата на стороне сервера. Должно быть:

  • ограничено: поскольку мне не нужно хранить слишком много сообщений, клиент будет отправлять запрос на получение новых сообщений каждую секунду. Я думаю, что связанный размер должен быть максимальным. количество одновременных запросов за одну секунду. Когда буфер заполнится, старые сообщения будут удалены.

  • подходит для высокопараллельного доступа: я не хочу использовать структуру данных, такую ​​​​как Collections.synchronizedXXXX, потому что во время итерации, если другой поток изменит структуру данных, например. добавляет сообщение, оно вызовет исключение, поэтому я должен заблокировать всю структуру данных, на самом деле мне все равно, может ли клиентский запрос получить самое последнее вставленное сообщение, потому что они отправят новый запрос через одну секунду, с другой стороны, операция записи никогда не должна откладываться. Классы в пакете java.util.concurrency кажутся решением, но...

  • неблокирующие: LinkedBlockingQueue, ArrayBlockingQueue они могут быть ограничены и не будут генерировать исключение во время итерации, но все они блокируют очередь. Когда очередь заполнена, я хочу добавить новый элемент в хвосты и удалить старый элемент из головы вместо того, чтобы блокировать там и ждать, пока кто-то удалит заголовок.

Итак, мой вопрос: есть ли хорошая реализация из 3-й библиотеки? Например, Google Гуава? Или, может быть, у вас есть идея получше хранить временные сообщения чата на сервере?

Большое спасибо!

8
задан cn1h 12 April 2012 в 19:57
поделиться