введение
Я считаю, что вы будете получать много текстовых сообщений в своей жизни, особенно во время недавнего мероприятия Double Eleven, и эти текстовые сообщения имеют две характеристики. Во-первых, это почти все текстовые сообщения со спамом, которые здесь можно игнорировать. две особенностиСсылка коротка, например:
Мы знаем, что некоторые текстовые сообщения имеют ограничение на количество символов, и нецелесообразно напрямую ставить ссылку с различными параметрами, а также то, что мы не хотим выставлять параметры. Преимущества заключаются не более чем в следующем:
- Слишком длинные ссылки легко ограничиваются по длине
- Короткие ссылки выглядят просто, длинные — легко.
- Безопасно, не хочу раскрывать параметры
- Конечно, это может быть унифицированное преобразование ссылок, а также такие операции, как подсчет кликов.
那背后的原理是什么呢? Как?让你实现这样的系统,你会怎么设计呢? 【来自于某鹅场面试官】
Принцип коротких ссылок
Логика отображения короткой ссылки
Самая важная точка знаний здесь — перенаправление, сначала просмотрите его.http
Код состояния:
Классификация | значение |
---|---|
1** | Сервер получает запрос и требует от запрашивающей стороны продолжить операцию. |
2** | Success, операция успешно получена и обработана |
3** | Перенаправление, дальнейшие действия, необходимые для выполнения запроса |
4** | Ошибка клиента, запрос содержит синтаксическую ошибку или запрос не может быть выполнен |
5** | Ошибка сервера, сервер обнаружил ошибку при обработке запроса |
Тогда коды состояния, начинающиеся с 3, относятся к перенаправлениям:
- 300: несколько вариантов, могут существовать в нескольких местах.
- 301: Постоянная переадресация, браузер кэширует и автоматически перенаправляет на новый адрес.
- 302: Временное перенаправление, клиент продолжит использовать старый URL.
- 303: Посмотреть другие адреса, похожие на 301.
- 304: Не изменено. Запрошенный ресурс не был изменен, и ресурс не будет возвращен, когда сервер вернет этот код состояния.
- 305: для доступа к ресурсу требуется прокси
- 306: Устаревший код состояния
- 307: Временное перенаправление, перенаправление с запросом Get
Весь процесс прыжка:
- 1. Пользователь переходит по короткой ссылке и запрос доходит до сервера
- 2. Сервер заменяет короткую ссылку на длинную, а затем возвращает браузеру код состояния перенаправления 301/302.
- 301 постоянное перенаправление приведет к тому, что браузер кеширует адрес перенаправления, а система коротких ссылок будет неправильно подсчитывать количество посещений.
- Временное перенаправление 302 может решить проблему неточного времени, но каждый раз, когда оно будет преобразовано в систему коротких ссылок, нагрузка на сервер будет возрастать.
- 3. Браузер получает код состояния перенаправления и адрес, к которому действительно нужно получить доступ, и перенаправляет на настоящую длинную ссылку.
Как видно из рисунка ниже, ссылка действительно302
Редирект на новый адрес, в возвращаемом заголовке есть полеLocation
адрес для перенаправления:
Как создаются короткие ссылки?
глобальный сигнальщик
Наверняка первое, о чем мы думаем, это сжатие, как сжатие файла, после сжатия распаковать и восстановить на исходную ссылку, перенаправить на исходную ссылку, но, к сожалению, это не работает, видели ли вы какое-либо сжатие Есть ли способ напрямую сжать такое длинное число до такого короткого? На самом деле невозможно. Это какHuffman
Дерево может сжимать только строки с большим количеством повторяющихся символов с высокой эффективностью, как и ссылки, параметров может быть много, и бывают разные нестандартные ситуации, поэтому алгоритм прямого сжатия нереален.
Тотhttps://dx.10086.cn/tzHLFw
иhttps://gd.10086.cn/gmccapp/webpage/payPhonemoney/index.html?channel=
Какая разница между ними? Передний путь не меняется, меняется задний, т.е.tzHLFw
иgmccapp/webpage/payPhonemoney/index.html?channel=
преобразование между.
На самом деле это очень просто, то есть часть данных в базе данных,id
Соответствует длинной ссылке (эквивалентно глобальному отправителю, глобальному уникальному идентификатору):
id | url |
---|---|
1 | Guangdong 10086. Can/GMC wipe PP/Web… |
Здесь используется распределенный глобальный уникальный идентификатор, о котором мы упоминали ранее.id
В качестве параметра, похоже, тоже работает:https://dx.10086.cn/1
, при посещении этой ссылки перейдите к базе данных, чтобы запросить реальный URL-адрес, а затем перенаправьте.
ЕдинственныйID
Очень просто, используйте атомарные классыAtomicLong
Можно, но распределённый не получится, его можно использовать простоredis
, либо база инкрементируется, либо можно рассмотретьZookeeper
какой-то тип.
стратегия преобразования идентификатора
Но прямое использование инкрементных чисел имеет два недостатка:
- Когда число большое, оно все еще очень длинное
- Увеличение числа, небезопасно, слишком регулярно
Очевидно, что ссылки, которые мы обычно видим, представляют собой не цифры, а обычно прописные и строчные буквы плюс цифры. Чтобы сократить длину ссылки, мы должны положитьid
преобразованы, такие как наша короткая ссылкаa-z
,A-Z
,0-9
состав, эквивалентный62
основные числа, будетid
преобразовать в62
Базовые номера:
public class ShortUrl {
private static final String BASE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String toBase62(long num) {
StringBuilder result = new StringBuilder();
do {
int i = (int) (num % 62);
result.append(BASE.charAt(i));
num /= 62;
} while (num > 0);
return result.reverse().toString();
}
public static long toBase10(String str) {
long result = 0;
for (int i = 0; i < str.length(); i++) {
result = result * 62 + BASE.indexOf(str.charAt(i));
}
return result;
}
public static void main(String[] args) {
// tzHLFw
System.out.println(toBase10("tzHLFw"));
System.out.println(toBase62(27095455234L));
}
}
id
изменять62
немногоkey
илиkey
превратиться вid
Реализовано, но расчет все равно занимает много времени, лучше добавить поле и сохранить его, чтобы база данных стала:
id | key | url |
---|---|---|
27095455234 | tzHLFw | Guangdong 10086. Can/GMC wipe PP/Web… |
Но все же легко догадаться, чтоid
иkey
Если его пройти и получить к нему доступ, это все еще очень небезопасно.Если вы беспокоитесь, вы можете случайным образом перетасовать последовательность символов короткой ссылки или добавить несколько случайно сгенерированных символов в соответствующую позицию, например, в первый1,4,5
Биты являются случайными символами, а другие позиции остаются неизменными.Пока мы сохраняем соответствующее отношение к базе данных при расчете, мы можем подключитьkey
найти соответствующийurl
. (Стоит отметить, чтоkey
Должен быть глобально уникальным и должен быть перегенерирован в случае конфликта)
Как правило, короткие ссылки имеют срок действия, поэтому мы также должны добавить соответствующие поля в базу данных, при доступе мы сначала определяем, истек ли срок их действия, и если они истекают, то они не будут перенаправлены.
соображения производительности
Если выставлено много коротких ссылок и в базе данных много данных, вы можете рассмотреть возможность использования оптимизации кеша в это время.При генерации запишите кеш кстати, а затем при чтении просто используйте кеш, потому что обычно короткие ссылки и длинные ссылки Отношения не будут изменены, и даже если они будут изменены, это очень низкая частота.
Если системаid
Что мне делать, когда я иссякну? Эта вероятность очень мала, если это все-таки случится, то можно повторно использовать старые просроченныеid
Нет.
Что, если кто-то лихорадочно попросит какую-то короткую ссылку, которой не существует? По сути, это проникновение в кеш, проникновение в кеш относится к,Данные, которых нет ни в кеше, ни в базе данных, запрашивается в большом количестве, например, номер заказа не может быть-1
, но пользователь запросил большое количество номеров заказов-1
Поскольку данных не существует, в кеше не будет данных, и все запросы будут напрямую проникать в базу данных. Если его эксплуатируют злоумышленники и лихорадочно запрашивают несуществующие данные, это приведет к чрезмерной нагрузке на базу данных и даже к ее краху.
В этом случае вы обычно можете использовать фильтр Блума для фильтрации несуществующих запросов данных, но здесь мыid
Изначально он инкрементный и упорядоченный.На самом деле наш диапазон общеизвестен,по которому проще судить.Избытка не должно быть,или при приходе запроса не проблема положить в кеш пустой объект.
【Об авторе】:
Цинь Хуай, публичный аккаунт [продуктовый магазин Циньхуай】Автор, дорога технологий не в одно время, горы высоки, а реки длинны, даже если она медленная, она продолжается и продолжается. Личное направление письма:Java源码解析
,JDBC
,Mybatis
,Spring
,redis
,分布式
,剑指Offer
,LeetCode
Подождите, каждую статью пишите внимательно, я не люблю заголовки, не люблю прибамбасы, и большинство из них пишут серию статей, не гарантирую, что пишу полностью правильно, но гарантирую, что то, что я пишу, практиковалось или искалось для информации. За упущения или ошибки, пожалуйста, поправьте меня.