Почему это нужно делать?
Когда запрос на получение короткого URL поступает в приложение, для более быстрого и точного перенаправления пользователя по целевому URL, предпочтительнее получать целевой URL непосредственно из Redis, а не выполнять поиск в базе данных.
Есть ли у этого подхода недостатки?
Теоретически, если сервер, на котором расположен Redis, имеет достаточно большой объём памяти, можно хранить до 100 000 ключей. Однако, при ограниченных аппаратных условиях, необходимо контролировать количество ключей в Redis (основная причина — опасения, что машина не справится с нагрузкой, при этом производительность самого Redis не вызывает проблем). Расширение этой функции планируется реализовать в будущих версиях и разрешить управление конфигурацией.
На всякий случай
Для обеспечения расширяемости, добавлена дополнительная оболочка service, позволяющая при необходимости проводить пользовательские расширения в бизнес-логике, например, заменить поиск ключа запросом к базе данных и т. д.
Код, связанный с процессом создания коротких ссылок, находится в файле core/short_url.go:
func GenerateShortLink(initialLink string) (string, error) {
if utils.EmptyString(initialLink) {
return "", fmt.Errorf("empty string")
}
urlHash, err := utils.Sha256Of(initialLink)
if err != nil {
return "", err
}
str := utils.Base58Encode(urlHash)
return str[:8], nil
}
Интервал очистки журналов доступа: 1 минута
В файле main.go:
// Очистка журналов доступа в Redis с интервалом времени
const AccessLogCleanInterval = 1 * time.Minute
func startTicker() error {
ticker := time.NewTicker(AccessLogCleanInterval)
for range ticker.C {
log.Println("[StoreAccessLog] Start.")
if err := service.StoreAccessLogs(); err != nil {
log.Printf("Error while trying to store access_log %s", err)
}
log.Println("[StoreAccessLog] Finish.")
}
return nil
}
Обработка списка 25 самых популярных URL за день с интервалом: 5 минут
В файле main.go:
// Интервал вычисления списка Top25
Top25CalcInterval = 5 * time.Minute
func startTicker2() error {
top25Ticker := time.NewTicker(Top25CalcInterval)
for range top25Ticker.C {
log.Println("[Top25Urls Ticker] Start.")
if err := storage.CallProcedureStatsTop25(); err != nil {
log.Printf("Error while trying to calculate Top25Urls %s", err)
}
log.Println("[Top25Urls Ticker] Finish.")
}
return nil
}
Обработка нескольких статистических данных на приборной панели с интервалом: 5 минут
В файле main.go:
// Интервалы вычисления других статистических данных на приборной панели
StatsSumCalcInterval = 5 * time.Minute
func startTicker4() error {
statsSumTicker := time.NewTicker(StatsSumCalcInterval)
for range statsSumTicker.C {
log.Println("[StatsSum Ticker] Start.")
if err := storage.CallProcedureStatsSum(); err != nil {
log.Printf("Error while trying to calculate StatsSum %s", err)
}
log.Println("[StatsSum Ticker] Finish.")
}
return nil
}
Полная статистика посещений с интервалом: 30 минут
В файле main.go:
// Интервал анализа полной статистики посещений
StatsIpSumCalcInterval = 30 * time.Minute
func startTicker3() error {
statsIpSumTicker := time.NewTicker(StatsIpSumCalcInterval)
for range statsIpSumTicker.C {
log.Println("[StatsIpSum Ticker] Start.")
if err := storage.CallProcedureStatsIPSum(); err != nil {
log.Printf("Error while trying to calculate StatsIpSum %s", err)
}
log.Println("[StatsIpSum Ticker] Finish.")
}
return nil
}
Лицензия
ohUrlShortener выпущен под лицензией Mulan PSL v2.
Copyright (c) [2023] [巴拉迪维]
[ohUrlShortener] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
Соглашение о лицензии участника
При первом отправке запроса на вытягивание (Pull Request), пожалуйста, чётко укажите в содержании запроса «Я добровольно принимаю и подписываю Соглашение о лицензии ohUrlShortener Contributor License Agreement» и прикрепите ссылку на этот договор к запросу.
Благодарности
Искренняя благодарность следующим открытым исходным кодам, фреймворкам и другим ресурсам (включая, но не ограничиваясь):
Ссылки
ohUrlShortener: выпущена версия 2.0 системы коротких URL с поддержкой «способа открытия».
ohUrlShortener: выпущена версия 1.9 системы коротких URL, использующая Redis. Кластер 集群支持
Выпущена версия ohUrlShortener 1.8 системы коротких ссылок, решены проблемы с API.
Выпущена версия ohUrlShortener 1.7 системы коротких ссылок с обновлением безопасности.
Выпущена версия ohUrlShortener 1.6 системы коротких ссылок с улучшенными статистическими функциями.
Выпущена версия ohUrlShortener 1.5 системы коротких ссылок с расширенными функциями управления.
Официально выпущена версия ohUrlShortener 1.4 системы коротких ссылок.
Выпущена версия ohUrlShortener 1.3 системы коротких ссылок с поддержкой экспорта журналов доступа.
Официально выпущен ohUrlShortener 1.2 системы коротких ссылок.
Выпущен ohUrlShortener версии 1.0 — сервис коротких ссылок.
Информация о программном обеспечении: https://www.oschina.net/p/ohurlshortener.
Gitlink: https://www.gitlink.org.cn/baladiwei/ohurlshortener.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )