Эта система очередей спроектирована так, чтобы быть огромной
Эта система очередей спроектирована так, чтобы быть огромной

Вроде сначала, а потом читай, Java продвинута более чем наполовину.

Привет всем, я брат Нэн.

Я видел в Интернете последний вопрос интервью одного завода: Как спроектировать систему массового обслуживания?

Что касается вопроса системного проектирования, то всем еще стоит задуматься. Возможно, этот вопрос не о должности архитектора, а о ваших способностях к бизнес-проектированию. Если мы будем использовать только API программного обеспечения с открытым исходным кодом, кажется, что наша конкурентоспособность может быть выше. Научившись проектировать вещи, создавать вещи и использовать продукты, которые мы разрабатываем для других, внезапно повысится наша конкурентоспособность.

15-летний ученик средней школы открыл исходный код AI универсальный магазин B/C конечное решениеchatnio,Продукт был приобретен в прошлом месяце за несколько миллионов. Об этом стоит задуматься,Креативность и дизайнерские возможности программы будут становиться все более важными в будущем.

1.1 Структура данных

Одной из характеристик организации очередей является то, что один элемент ставится в очередь за другим элементом, образуя очередь в форме полосы. И структура List, и структура LinkedList могут удовлетворить бизнес-потребности организации очередей, но если это вопрос алгоритма, мы должны учитывать факторы производительности.

Не все стоят в очереди честно. На самом деле ситуаций может быть много. Например, если кто-то отменяет номер, элементы, принадлежащие этому человеку, будут удалены из очереди в особых случаях, если кто-то перейдет в очередь, элементы; позади позиции вставки будут удалены. Все придется отодвинуть назад. В сочетании с этой ситуацией было бы более целесообразно использовать структуру связанного списка LinkedList. По сравнению со списком преимущество LinkedList в производительности заключается в том, что он более эффективен при добавлении и удалении.

Но то, что мы здесь делаем, — это бизнес-система. Также возможно использовать структуру LinkedList, но ее сложно принимать изменения и поддерживать, и людям, которые возьмут на себя программу, будет трудно понять ее позже. Как мы все знаем, в реальной разработке мы чаще используем List вместо LinkedList.

Я предпочитаю размещать структуру данных List в Redis, которая имеет следующие преимущества.

(1) Разделить хранилище данных и приложения. Поместите его в память приложения. Если программа выйдет из строя, все данные очереди будут потеряны.

(2) Лучшая производительность. По сравнению с хранилищем базы данных Redis имеет более высокую производительность при обработке данных. В сочетании с функцией уничтожения очереди по завершении она может даже не сохраняться в базе данных. Записи очередей могут быть добавлены в базу данных.

Просто используйте команды Redis для имитации обработки очередей структуры списка.

Язык кода:shell
копировать
# Очередь (поместить пользователя в очередь) ID добавлен в конец очереди)
127.0.0.1:6379> RPUSH queue:large user1
127.0.0.1:6379> RPUSH queue:large user2

# Dequeue (удалить из очереди первый элемент очереди)
127.0.0.1:6379> LPOP queue:large

# Отступить (удалить указанного пользователя из очереди) ID)
127.0.0.1:6379> LREM queue:large 1 user2

# переход в очередь (замена пользователя ID Вставьте в указанную позицию, полагая, что в user1 вставлено раньше user3)
127.0.0.1:6379> LINSERT queue:large BEFORE user1 user3

1.2 Бизнес-функции

Позвольте мне сначала показать вам систему очередей шеф-повара Фэя, которую использовал брат Нан. Она ставит в очередь в общедоступной учетной записи.

Мы можем видеть текущий прогресс в очереди.

В то же время каждый раз, когда проходит 10-й день, общедоступная учетная запись будет отправлять push-уведомление; если пройдет 10-й день, общедоступная учетная запись WeChat будет уведомлять пользователя о ходе очереди в режиме реального времени каждый раз, когда проходит 1-й день. Наконец, очень удобно уведомлять пользователей каждый раз, когда проходит первый день, что успокаивает их беспокойство по поводу очередей.

Подводя итог, разберемся с функциональными моментами. Хотя вышеописанное кажется простым представлением и уведомлением, за ним может быть реализовано множество функций.

1.3 Бэкэнд

(1) Начинается очередь

Администратор серверной части создает действие организации очереди, а серверная часть создает структуру данных типа списка в Redis, создавая три очереди для большой таблицы, средней таблицы и маленькой таблицы и не устанавливая срок действия.

Язык кода:java
копировать
// Создать интерфейс очередей
@Service
public class QueueManagementServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    // queueType — тип таблицы
    public void createQueue(String queueType) {
        String queueKey = "queue:" + queueType;
        redisTemplate.delete(queueKey); // Удалите очередь и убедитесь, что очередь повторно инициализирована.
    }
}

(2) Работа в очереди

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

Язык кода:java
копировать
// Операции с очередями
@Service
public class QueueManagementServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * Удалить из очереди первого пользователя в очереди
     */
    public void dequeueNextUser(String queueType) {
        String queueKey = "queue:" + queueType;
        String userId = redisTemplate.opsForList().leftPop(queueKey);
    }
}

1.4 Клиент

(1) Нажмите, чтобы поставить в очередь

Пользователь нажимает «Очередь», чтобы добавить идентификатор пользователя в очередь Redis.

Язык кода:java
копировать
// Пользовательская очередь
@Service
public class QueueServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void enterQueue(String queueType, String userId) {
        String queueKey = "queue:" + queueType;
        redisTemplate.opsForList().rightPush(queueKey, userId);
        log.info("Пользователь " + userId + " Уже присоединился " + queueType + " очередь");
    }
}

(2) Ход очереди

Пользователи могут просматривать общее количество людей в трех очередях.,Запросите количество очередей непосредственно из трех очередей Redis. Эту страницу не нужно обновлять в режиме реального времени.,Конечно, вы можете использовать WebSocket для обновления в реальном времени или длительного опроса.,Но с последнимУведомление пользователяФункция,Это не реализовано и не повлияет на взаимодействие с пользователем.

Персональный прогресс пользователя в очереди рассчитывается путем расчета количества элементов в очереди пользователя.

Язык кода:java
копировать
// Ход очереди запросов
@Service
public class QueueServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public long getUserPositionInQueue(String queueType, String userId) {
        String queueKey = "queue:" + queueType;
        List<String> queue = redisTemplate.opsForList().range(queueKey, 0, -1);
        if (queue != null) {
            return queue.indexOf(userId);
        }
        return -1;
    }
}

(3) Уведомление пользователя

Когда клиент заканчивает есть, администратор серверной части нажимает на следующий номер. На этом этапе последующая серверная логика должна включать уведомления пользователей.

Удалите из трех очередей элементы, текущий прогресс пользователя которых кратен 10, и официальный аккаунт WeChat уведомит пользователя, за какой таблицей он сейчас находится в очереди.

Из трех очередей берутся 10 лучших элементов, а официальный аккаунт WeChat уведомляет пользователя о текущем прогрессе.

Язык кода:java
копировать
// Уведомление пользователя
@Service
public class NotificationServiceImpl {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

 private void notifyUsers(String queueType) {
        String queueKey = "queue:" + queueType;
        // Получить всех пользователей в текущей очереди
        List<String> queueList = jedis.lrange(queueKey, 0, -1);

        // Уведомлять пользователей с рейтингом, кратным 10
        for (int i = 0; i < queueList.size(); i++) {
            if ((i + 1) % 10 == 0) {
                String userId = queueList.get(i);
                sendNotification(userId, «Ваш прогресс в очереди — это " + (i + 1) + " Пожалуйста, будьте готовы! ");
            }
        }

        // Уведомить первых 10 пользователей
        int notifyLimit = Math.min(10, queueList.size()); // Избегайте ошибок, когда очередь меньше 10
        for (int i = 0; i < notifyLimit; i++) {
            String userId = queueList.get(i);
            sendNotification(userId, «Ты уже впереди 10 Садись, готовься обедать! ");
        }
    }
}

Эту логику следует вынести на передний планБэкэндиз Операции с очередями。

1.5 Проблемы существуют

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

Для структуры Redis List нам нужно запросить рейтинг определенного элемента. В худшем случае нам нужно обойти всю очередь. Временная сложность равна O (n), а функция запроса прогресса ранжирования пользователя — это. часто используется.

Для описанной выше ситуации мы можем выбрать другую структуру данных Redis: Zset. Тип упорядоченного набора Zset может определять ранг элемента по временной сложности O(lgn), просто используйте команду ZRANK.

Язык кода:shell
копировать
# Команда zadd добавляет элементы
127.0.0.1:6379> zadd 100run:ranking 13 mike
(integer) 1
127.0.0.1:6379> zadd 100run:ranking 12 jake
(integer) 1
127.0.0.1:6379> zadd 100run:ranking 16 tom
(integer) 1
Язык кода:shell
копировать
# Команда zrank для просмотра рейтингов
127.0.0.1:6379> zrank 100run:ranking jake
(integer) 0
127.0.0.1:6379> zrank 100run:ranking tom
(integer) 2
Язык кода:shell
копировать
# zscore определяет, существует ли элемент
127.0.0.1:6379> zscore 100run:ranking jake
"12"

Я Брат Нэн, Нэн - это Нэн. Мне нравятся ваши лайки, лайки и лайки на Get.

Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose