Научите вас, как сократить функцию URL

Node.js

В этой статье кратко рассказывается, как выполнить функцию сокращения URL.

Node.js + MySQL + Redis Версия исходного кода Адрес:github

Демонстрационный адрес:www.ecool.fun/shortLink

На прочтение статьи уходит около 8 минут.

Что такое короткая ссылка

Короткая ссылка, с точки зрения непрофессионала, предназначена для преобразования длинного URL-адреса в короткую строку URL-адреса с помощью программного расчета и других методов.

Вы часто можете увидеть короткие ссылки из Weibo или различные маркетинговые текстовые сообщения, как правило, в видеt.cn/xxxxxxПосле нажатия вы можете перейти на соответствующую страницу.

В первые дни короткие ссылки широко использовались на веб-сайтах для загрузки изображений.Сократив количество слов в URL-ссылке, цель сокращения строки кода была достигнута. Пользователям удобнее ссылаться на URL-адрес и вписывать его в код, экономя место на символе. Обычно используется при использовании классификации изображений в интернет-магазинах. Из-за ограничений по количеству символов короткие ссылки используются для достижения целей внешних изображений цепочки. С момента популярности Weibo с ограниченным количеством символов в Weibo короткие ссылки также преобладали. на веб-сайтах Weibo. Сократите количество слов и предоставьте блогерам возможность публиковать больше текста.

Преобразование длинных ссылок в короткие обычно делается для удобства запоминания или распространения.

функция, которую необходимо выполнить

Из приведенного выше введения мы можем сделать вывод, что сокращение URL-адреса необходимо для выполнения следующих двух функциональных пунктов:

  • Сократите длинные URL-адреса до коротких ссылок
  • Нажмите, чтобы создать короткую ссылку, обычно вы можете перейти на исходную страницу с длинным URL-адресом.

Весь процесс дизайна

На самом деле принцип работы вышеуказанных функциональных очков очень прост, кратко охарактеризуем:

  • Пользователь вводит длинный URL-адрес, а сервер получает и обрабатывает его, генерирует короткий код на основе содержимого длинного URL-адреса и сохраняет отношение сопоставления. Затем короткая ссылка склеивается по короткому коду и возвращается пользователю;
  • Пользователь щелкает короткую ссылку, и сервер находит соответствующий длинный URL-адрес в соответствии с коротким кодом в короткой ссылке и переходит на соответствующую страницу по адресу 302.

Пункт знаний: зачем использовать прыжок 302 вместо прыжка 301?

301 — это постоянный редирект, 302 — временный редирект. После создания короткого адреса он не изменится, поэтому использование 301 соответствует семантике http. Но если используются 301, Google, Baidu и другие поисковые системы, реальный адрес будет отображаться непосредственно при поиске, тогда мы не сможем подсчитать количество кликов по короткому адресу, а также не сможем собрать пользовательские файлы cookie, User Agent и другие. Он может быть использован для проведения большого количества интересного анализа больших данных, а также является основным источником прибыли для поставщиков услуг коротких URL-адресов.

Цитата из ответа Чжиху-Вулина,Оригинальная ссылка

Весь процесс разработан, как показано ниже:

短网址全流程

Как видите, я использовалMySQLа такжеRedisдля хранения сопоставления между длинными URL-адресами и короткими кодами.

использоватьMySQLЯ думаю, все могут понять, но зачем использоватьRedisНу, разве не хорошо использовать базу данных напрямую?

Это в основном для того, чтобы принять во внимание генерацию коротких ссылок, трафик будет относительно большим после доставки, использоватьRedisПосле кэширования это может эффективно снизить нагрузку на базу данных.

Как сгенерировать шорткод

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

Короткие коды обычно создаются[a - z, A - Z, 0 - 9]Эти 62 буквы или цифры составляются, и длина короткого кода также может быть настроена, но обычно она не превышает 8 цифр. Наиболее часто используются 6-битные, уже существует 56,8 млрд комбинаций 6-битных коротких кодов: (26+26+10)^6 = 56800235584, что удовлетворяет большинству сценариев использования.

Наиболее популярные способы генерации шорткодов:自增id,摘要算法,普通随机数.

  • идентификатор автоматического увеличения

Этот метод является методом без коллизий.Принцип заключается в том, что каждый раз, когда добавляется короткий код, 1 добавляется к идентификатору короткого кода, добавленного в последний раз, а затем десятичное значение идентификатора преобразуется в 62-значное значение идентификатора. , Строка.

Как правило, для завершения используется самоувеличивающийся идентификатор в таблице данных: каждый раз, когда запрашивается максимальное значение самоувеличивающегося идентификатора в таблице данных, соответствующее значение самоувеличивающегося идентификатора длинного URL-адреса, который нужно вставить, равно max. +1, а max+1 преобразуется в 62. Короткий код можно получить в шестнадцатеричном виде.

Однако идентификатор короткого кода увеличивается с длины одной цифры.Длина короткого кода не является фиксированной, но ее можно обработать, увеличив идентификатор от указанного числа, чтобы гарантировать, что все короткие коды имеют одинаковую длину. В то же время сгенерированные короткие коды в порядке, и могут быть проблемы с безопасностью.Сгенерированный идентификатор короткого кода можно комбинировать с другими ключевыми словами, такими как длинные URL-адреса, для выполнения операции md5 для создания окончательного короткого кода.

Конкретная реализация преобразования из десятичной в 62:

function string10to62(number) {
    const chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';
    const charsArr = chars.split('');
    const radix = chars.length;
    let qutient = +number;
    let arr = [];
    do{
        let mod = qutient % radix;
        qutient = (qutient - mod) / radix;
        arr.unshift(charsArr[mod]);
    }while(qutient);
    return arr.join('');
}
  • Алгоритм дайджеста

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

Идея алгоритма:

1. Передайте длинный URL черезmd5Операция по созданию 32-символьной шестнадцатеричной строки, разделенной на 4 сегмента, каждый сегмент из 8 символов;

2. Для циклической обработки этих четырех сегментов возьмите 8 байт, обработайте их как шестнадцатеричную строку и выполните операцию И с 0x3ffffffff (30-бит 1), то есть игнорируйте обработку более 30 бит;

3, 30, который разделен на 6 сегментов, каждое пятизначное число в качестве индекса для получения определенной строки символов алфавита последовательно выполняется для получения 6.

4. В целомmd5Строка может состоять из 4 6-битных строк, и любая из них может использоваться в качестве URL-адреса короткой ссылки для этого длинного URL-адреса.

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

  • обычное случайное число

Метод состоит в том, чтобы случайным образом выбрать комбинацию 6-значных коротких кодов из 62 строк, а затем перейти к базе данных, чтобы проверить, существует ли уже короткий код. Если он уже существует, продолжайте зацикливать этот метод, чтобы снова получить короткий код, в противном случае вернитесь напрямую.

Этот метод наиболее прост в реализации, но из-заMath.round()Случайные числа, сгенерированные методом, являются псевдослучайными числами, и вероятность столкновения не мала. В случае большого объема данных он может повторяться много раз для генерации неконфликтующего короткого кода.

Реализация:

// 获取唯一的Link
async getShortLink() {
    const shortLink = this.generateShortLink();

    // 查询数据库中是否存在该链接,如果存在,就直接返回
    const searchResult = await this.searchByLinkInMySQL(shortLink);

    if (searchResult && searchResult.length > 0) {
    // 如果shortLink已经存在,就遍历重新生成
        return this.getShortLink();
    }
    return shortLink;

}

// 生成随机的Link
generateShortLink() {
    let str = '';
    const arr = [
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    ];

    for (let i = 0; i < 6; i++) {
        const pos = Math.round(Math.random() * (arr.length - 1));
        str += arr[pos];
    }
    return str;
}

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

коммерческое время

Наконец, приглашаем всех отметить нашБлог фронтенд-команды Renrendai, все статьи также будут обновляться синхронно сЗнай колонкуа такжеСчет наггетс, мы еженедельно делимся несколькими высококачественными техническими статьями о внешнем интерфейсе.

Справочная статья