Вроде сначала, а потом читай, Java продвинута более чем наполовину.
Привет всем, я брат Нэн.
Я видел в Интернете последний вопрос интервью одного завода: Как спроектировать систему массового обслуживания?
Что касается вопроса системного проектирования, то всем еще стоит задуматься. Возможно, этот вопрос не о должности архитектора, а о ваших способностях к бизнес-проектированию. Если мы будем использовать только API программного обеспечения с открытым исходным кодом, кажется, что наша конкурентоспособность может быть выше. Научившись проектировать вещи, создавать вещи и использовать продукты, которые мы разрабатываем для других, внезапно повысится наша конкурентоспособность.
15-летний ученик средней школы открыл исходный код AI универсальный магазин B/C конечное решениеchatnio,Продукт был приобретен в прошлом месяце за несколько миллионов. Об этом стоит задуматься,Креативность и дизайнерские возможности программы будут становиться все более важными в будущем.
Одной из характеристик организации очередей является то, что один элемент ставится в очередь за другим элементом, образуя очередь в форме полосы. И структура List, и структура LinkedList могут удовлетворить бизнес-потребности организации очередей, но если это вопрос алгоритма, мы должны учитывать факторы производительности.
Не все стоят в очереди честно. На самом деле ситуаций может быть много. Например, если кто-то отменяет номер, элементы, принадлежащие этому человеку, будут удалены из очереди в особых случаях, если кто-то перейдет в очередь, элементы; позади позиции вставки будут удалены. Все придется отодвинуть назад. В сочетании с этой ситуацией было бы более целесообразно использовать структуру связанного списка LinkedList. По сравнению со списком преимущество LinkedList в производительности заключается в том, что он более эффективен при добавлении и удалении.
Но то, что мы здесь делаем, — это бизнес-система. Также возможно использовать структуру LinkedList, но ее сложно принимать изменения и поддерживать, и людям, которые возьмут на себя программу, будет трудно понять ее позже. Как мы все знаем, в реальной разработке мы чаще используем List вместо LinkedList.
Я предпочитаю размещать структуру данных List в Redis, которая имеет следующие преимущества.
(1) Разделить хранилище данных и приложения. Поместите его в память приложения. Если программа выйдет из строя, все данные очереди будут потеряны.
(2) Лучшая производительность. По сравнению с хранилищем базы данных Redis имеет более высокую производительность при обработке данных. В сочетании с функцией уничтожения очереди по завершении она может даже не сохраняться в базе данных. Записи очередей могут быть добавлены в базу данных.
Просто используйте команды Redis для имитации обработки очередей структуры списка.
# Очередь (поместить пользователя в очередь) 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
Позвольте мне сначала показать вам систему очередей шеф-повара Фэя, которую использовал брат Нан. Она ставит в очередь в общедоступной учетной записи.
Мы можем видеть текущий прогресс в очереди.
В то же время каждый раз, когда проходит 10-й день, общедоступная учетная запись будет отправлять push-уведомление; если пройдет 10-й день, общедоступная учетная запись WeChat будет уведомлять пользователя о ходе очереди в режиме реального времени каждый раз, когда проходит 1-й день. Наконец, очень удобно уведомлять пользователей каждый раз, когда проходит первый день, что успокаивает их беспокойство по поводу очередей.
Подводя итог, разберемся с функциональными моментами. Хотя вышеописанное кажется простым представлением и уведомлением, за ним может быть реализовано множество функций.
(1) Начинается очередь
Администратор серверной части создает действие организации очереди, а серверная часть создает структуру данных типа списка в Redis, создавая три очереди для большой таблицы, средней таблицы и маленькой таблицы и не устанавливая срок действия.
// Создать интерфейс очередей
@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.
// Операции с очередями
@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) Нажмите, чтобы поставить в очередь
Пользователь нажимает «Очередь», чтобы добавить идентификатор пользователя в очередь Redis.
// Пользовательская очередь
@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 для обновления в реальном времени или длительного опроса.,Но с последнимУведомление пользователяФункция,Это не реализовано и не повлияет на взаимодействие с пользователем.
Персональный прогресс пользователя в очереди рассчитывается путем расчета количества элементов в очереди пользователя.
// Ход очереди запросов
@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 уведомляет пользователя о текущем прогрессе.
// Уведомление пользователя
@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 Садись, готовься обедать! ");
}
}
}
Эту логику следует вынести на передний планБэкэндиз Операции с очередями。
В описанной выше деловой ситуации на самом деле в очереди не будет слишком много людей, и она, как правило, будет относительно стабильной. Но если количество людей в каждой очереди резко увеличится, можно предвидеть, что возникнут проблемы.
Для структуры Redis List нам нужно запросить рейтинг определенного элемента. В худшем случае нам нужно обойти всю очередь. Временная сложность равна O (n), а функция запроса прогресса ранжирования пользователя — это. часто используется.
Для описанной выше ситуации мы можем выбрать другую структуру данных Redis: Zset. Тип упорядоченного набора Zset может определять ранг элемента по временной сложности O(lgn), просто используйте команду ZRANK.
# Команда 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
# Команда zrank для просмотра рейтингов
127.0.0.1:6379> zrank 100run:ranking jake
(integer) 0
127.0.0.1:6379> zrank 100run:ranking tom
(integer) 2
# zscore определяет, существует ли элемент
127.0.0.1:6379> zscore 100run:ranking jake
"12"
Я Брат Нэн, Нэн - это Нэн. Мне нравятся ваши лайки, лайки и лайки на Get.
Творить непросто, поэтому вы можете ставить лайки, собирать и подписываться, чтобы поддержать его. Ваша поддержка — самая большая мотивация для моего творчества.❤️