Comments 60
Вот вы обмолвились, что для этих целей подошел бы nosql. Но как же проблема с автоинкрементами? Ведь тут все на красивом id завязано. Хотел в последнем проекте использовать монго, но в связи с невозможностью грамотно генерировать иды, необходимые в приложении, пришлось отказаться
+2
В Redis можно организовать.
+4
Есть два варианта. Первый — не брать за основу айди. Использовать, например, хеш от микровремени или еще чего-то
Второй вариант — в той же Монго хранить поле «lastId», которое вручную инкрементировать
Но на самом деле я не особый сторонник моды NoSQL и вполне радуюсь старенькой MySQL
Второй вариант — в той же Монго хранить поле «lastId», которое вручную инкрементировать
Но на самом деле я не особый сторонник моды NoSQL и вполне радуюсь старенькой MySQL
+2
1 — сделал парсер на ноде, все валит в один момент.
2 — тот же монго достаточно скоро потребует шариться, а безопасность атомарных операций там никто не гарантирует
В голове вертятся только гибриды
2 — тот же монго достаточно скоро потребует шариться, а безопасность атомарных операций там никто не гарантирует
В голове вертятся только гибриды
+2
Автоинкремент в монго можно сделать так: links.freecr.ru/!bvc
Но можно еще подумать над сокращением ObjectId, которое выглядит так:
47cc67093475061e3d95369d
Но как его сокращать, оставляя уникальным — я хз. Мне в проекте это требовалось и я не допёр, но вместо этого я использовал собственную реализацию автоинкремента в монго.
Но можно еще подумать над сокращением ObjectId, которое выглядит так:
47cc67093475061e3d95369d
Но как его сокращать, оставляя уникальным — я хз. Мне в проекте это требовалось и я не допёр, но вместо этого я использовал собственную реализацию автоинкремента в монго.
0
Используем Redis и Keyspace в обоих случаях атомарный инкремент присутствует.
+2
Можно, смотрите: links.freecr.ru/!bvc
0
Спасибо, очень полезно. Смотрю на такие вещи после питон+твистед очень положительно.
0
свои коллбэки обьявляя с err, можно в случае ошибок вложенного вызова просто вызывать callback с полученным err.
Использовать throw некорректно в асинхронной модели.
Использовать throw некорректно в асинхронной модели.
+2
подробнее тут — habrahabr.ru/blogs/javascript/102717/ и habrahabr.ru/blogs/javascript/102722/
0
А в такого рода сервисах нужно же проверять, если ли уже такой URL в базе? А то как-то…
habrahabr.ru
links.freecr.ru/!et
habrahabr.ru
links.freecr.ru/!er
habrahabr.ru
links.freecr.ru/!eq
habrahabr.ru
links.freecr.ru/!eo
habrahabr.ru
links.freecr.ru/!et
habrahabr.ru
links.freecr.ru/!er
habrahabr.ru
links.freecr.ru/!eq
habrahabr.ru
links.freecr.ru/!eo
+4
Ну, тут зависит от политики сервиса. Если проверять наличие, то это поиск в хранилище, что увеличивает время создания ссылки и уменьшает размер хранилища. А если не проверять, то ссылка создается быстро, но увеличивается хранилище ссылок.
Популярные укорачиватели такой проверки не делают.
Популярные укорачиватели такой проверки не делают.
+1
0
пардрон, браузер тупит:
goo.gl, сабмитил 5 раз, результат habrahabr.ru/new/ -> goo.gl/QcLw
tinyurl.com, сабмитил 5 раз, результат habrahabr.ru/new/ -> tinyurl.com/4sbk7u
byst.ro, сабмитил 5 раз, результат habrahabr.ru/new/ -> byst.ro/3bwh
Уверен, что если еще проверить — большинство будет отдавать один урл… его проще 1 раз закешировать, чем каждый раз писать в базу.
goo.gl, сабмитил 5 раз, результат habrahabr.ru/new/ -> goo.gl/QcLw
tinyurl.com, сабмитил 5 раз, результат habrahabr.ru/new/ -> tinyurl.com/4sbk7u
byst.ro, сабмитил 5 раз, результат habrahabr.ru/new/ -> byst.ro/3bwh
Уверен, что если еще проверить — большинство будет отдавать один урл… его проще 1 раз закешировать, чем каждый раз писать в базу.
+1
Да, действительно :-/
Я задавался этим вопросом несколько месяцев назад и политика создания урла была другая. Клянусь (с) =)
Я задавался этим вопросом несколько месяцев назад и политика создания урла была другая. Клянусь (с) =)
+2
Немного не понял, а проверки на валидность url не предусмотрено?
+2
Прикольно получается когда пустую форму отпрвляешь.
+6
Я вот недавно тоже сел за ковыряние ноды, и, не поверите, тоже в голову пришло сделать сокращалку урлов :)
Вот мой вариант: sudn.tk. Исходники покажу по запросу, выкладывать их стыдно.
Там проверки тоже примитивные… yandex.ru и yandex.ru/ посчитает за разные урлы.
Да, делал на ExpressJS, в качестве хранилища редис, шаблонизатор ejs.
Вот мой вариант: sudn.tk. Исходники покажу по запросу, выкладывать их стыдно.
Там проверки тоже примитивные… yandex.ru и yandex.ru/ посчитает за разные урлы.
Да, делал на ExpressJS, в качестве хранилища редис, шаблонизатор ejs.
+2
Урлы лучше парсить с помощью соответствующего метода и сравнивать полученные объекты (либо их хеши).
0
UFO just landed and posted this here
Думаю что если сервис будет популярен, то будут частые обращения и любой ФС тут станет нехорошо.
Представьте себе 1к обращений в единицу времени. Это надо прочитать 1000 файлов, получается. Параллельно.
А параллельное чтение большого количества файлов — это либо дорого, либо практически нереально.
Да и наверное память и цпц нынче дешевле дискового пространства.
Я конечно могу ошибаться, ибо не сильно много понимаю в ФС и файловых операциях :)
А кстати да — как можно читать кучу файлов параллельно? Ну то есть тут, как я понимаю всё упирается в скорость чтения головки с хдд и в «раскиданность» файлов по ФС?
Представьте себе 1к обращений в единицу времени. Это надо прочитать 1000 файлов, получается. Параллельно.
А параллельное чтение большого количества файлов — это либо дорого, либо практически нереально.
Да и наверное память и цпц нынче дешевле дискового пространства.
Я конечно могу ошибаться, ибо не сильно много понимаю в ФС и файловых операциях :)
А кстати да — как можно читать кучу файлов параллельно? Ну то есть тут, как я понимаю всё упирается в скорость чтения головки с хдд и в «раскиданность» файлов по ФС?
+2
При достаточном количестве памяти ОС Linux будет держать кеш файлов в ОП и обращения будут сверх быстрыми. Есть только один подводный камень — fileatime, то есть последнее обращение к файлу. Но при монтировании файловых систем можно поставить noatime и избавиться от этого.
Как дело обстоит в Windows и для NTFS, не знаю.
Как дело обстоит в Windows и для NTFS, не знаю.
0
а зачем? по-моему бред и вот почему: сегодня я использую фс, завтра, когда потребности проекта возрастут, буду писать велосипед того, как бы это все красиво заоптимизировать, а послезавтра, когда захочется переехать в облако пойму, что где-то в проектировании системы был прокол. почему бы сразу не использовать бд, которая как раз для этого и создана? не обязательно реляционную, для такого проекта сгодится простенькая key-value бд вроде редис. а чтобы начать работать с ней, нужно меньше времени, чем потом бороться с граблями файловой системы. скажите я не прав?
+1
смысл? если я захочу расширить приложение — я смогу это с легкостью сделать. работа с базой тоже будет безумно быстрой в этом приложении.
тем более, я уже сказал, что можно было бы использовать НоуСКЛ, но целью было именно научится работать с MySQL
тем более, я уже сказал, что можно было бы использовать НоуСКЛ, но целью было именно научится работать с MySQL
0
Забавно использовать для серверной части MooTools, а для клиентской — jQuery.
Хотя классы там удобные — это факт, а как с этим в jQuery, я не знаю. И как у jq с node.js
Хотя классы там удобные — это факт, а как с этим в jQuery, я не знаю. И как у jq с node.js
+1
jQuery прекрасно работает в приложениях node.js с использованием jsdom.
+1
Бага: если отправить пустое поле, то вот такой ответ я получаю:
habreffect.ru/files/3dd/fd035b90a/scr19.png
habreffect.ru/files/3dd/fd035b90a/scr19.png
+1
Спасибо за статью, красивый код и доступное описание.
Небольшое дополнения: String.sqlEscape можно было не реализовывать, ведь есть conn.escapeSync(). Потери производительности будут минимальны, но зато точно не забудете заэкранировать что-нибудь, а вы явно забыли \n, \r и т.д. Впрочем, для INSERT уже можно использовать prepared statements.
Небольшое дополнения: String.sqlEscape можно было не реализовывать, ведь есть conn.escapeSync(). Потери производительности будут минимальны, но зато точно не забудете заэкранировать что-нибудь, а вы явно забыли \n, \r и т.д. Впрочем, для INSERT уже можно использовать prepared statements.
+3
поприветствуем автора
спасибо,
ждем подробных мануалов, что и как использовать)
mysql-libmysqlclient
)спасибо,
conn.escapeSync()
— это то, что нужно. ждем подробных мануалов, что и как использовать)
+4
Да, похоже прежде всего нужно допилить Dox для генерации постраничной документации, а то в едином списке в api.html трудно ориентироваться.
Поддерживать документацию вручную для одного разработчика довольно хлопотное занятие. Но пример с INSERT и экранированием в срочном порядке добавлю в examples.js, моё упущение.
Поддерживать документацию вручную для одного разработчика довольно хлопотное занятие. Но пример с INSERT и экранированием в срочном порядке добавлю в examples.js, моё упущение.
+2
Было сокращено более 15000 ссылок.
+1
в хроме не работает
0
Сервис развиваетсья? прносит прибыль?
0
if (err) throw err;
А что будет, если таки произойдет ошибка? Не упадет ли весь сервер?
Может правильнее дальше передавать:
if (err) fn(err);
?0
Sign up to leave a comment.
node.js сокращатель ссылок