Hoe maak je een Shortlink-app met Ruby en Redis

In deze zelfstudie bouwen we een korte web-shortlink met Ruby, het webraamwerk van Sinatra en de Redis-database. Tegen het einde van deze tutorial, zal je eindigen met een doodeenvoudige, krachtige shortlink-webapp die super eenvoudig te schalen is.


Stap 1. Aan de slag

Om deze tutorial te volgen, moet je Ruby op je systeem geïnstalleerd hebben (ik gebruik 1.9.2), evenals de sinatra en redis edelstenen en Redis.

Als u Ruby nog niet op uw systeem hebt geïnstalleerd, moet u het relatief gemakkelijk kunnen installeren. Gebruikers van OS X, Debian of CentOS moeten mogelijk een nieuwere versie van Ruby compileren. Het is een vrij eenvoudig proces.

Raadpleeg hier voor meer informatie over het installeren van Ruby via RVM.

Nu moet je de benodigde Ruby Gems installeren. Edelstenen zijn een handige manier om vrijwel elke beschikbare Ruby-bibliotheek te installeren. Typ gewoon het volgende in uw terminalvenster om de vereiste edelstenen te installeren:

 gem installeer sinatra redis

We zullen ook Redis moeten installeren en compileren. Maak je geen zorgen, het is echt klein en kost slechts ongeveer 15 seconden om te compileren op mijn machine.

 wget http://redis.googlecode.com/files/redis-2.0.4.tar.gz tar zfx redis-2.0.4.tar.gz cd redis-2.0.4 make sudo make install cd? 

U kunt de Redis-server uitvoeren door te typen redis-server in je terminal, en als je zin hebt om met Redis te spelen, geef dan redis-cli een go.


Stap 2. De app bouwen

Een van de geweldige dingen over Sinatra is hoe snel en eenvoudig het kleine apps opklopt - het is bijna stom!

De code voor de shortlink-app zelf zal niet erg lang zijn, dus het moet echt gemakkelijk te begrijpen zijn. Maak je geen zorgen als je het eerst niet begrijpt, ik zal uitleggen hoe het allemaal werkt.

Maak een map voor je webapp - ik heb de mijne gebeld redis-ruby-shortlink - en plaats de volgende bestanden erin.

shortlink_app.rb

 vereisen 'sinatra' vereisen 'redis' redis = Redis.new helpers doen onder meer Rack :: Utils alias_method: h,: escape_html def random_string (length) rand (36 ** length) .to_s (36) end end get '/' do erb: index end post '/' do if params [: url] and not params [: url] .empty? @shortcode = random_string 5 redis.setnx "links: # @ shortcode", params [: url] end erb: index end get '/: shortcode' do @url = redis.get "links: # params [: shortcode ] "omleiden @url || '/' einde

Dat is het. Best simpel, eh?

In die kleine Sinatra-app hierboven heb ik een paar belangrijke dingen gedaan. In de eerste twee regels breng ik de bibliotheken binnen die we nodig hebben - sinatra en opnieuw. Op lijn 4 breng ik een verbinding tot stand met de Redis-server, luisterend op localhost. De regels hierna beginnen allemaal interessant te worden!

In Sinatra kun je helpers specificeren die elke keer worden uitgevoerd als een van jouw routes (die krijgen en post onderdelen) wordt uitgevoerd. We kunnen alles wat we nodig hebben vaak in het helpersblok plaatsen. In mijn helpers-blok heb ik gealiast h bij Rack's escape_html, en definieerde een methode om een ​​willekeurige alfanumerieke reeks van een bepaalde lengte te genereren.

De volgende zijn de routes. De eerste route is vrij eenvoudig. Wanneer een client een GET-verzoek doet aan /, het maakt gewoon de index.erb pagina (ik heb de bron hiervoor nader toegelicht.)

De volgende route is waar de goede dingen gebeuren. Ten eerste zorgen we ervoor dat de gebruiker een URL in het URL-vak heeft getypt. Als dat het geval is, genereren we een willekeurige shortcode van vijf tekens door de random_string methode die we eerder hebben gedefinieerd. Vervolgens vertellen we Redis om setnx (set als n eXists), een sleutel die onze shortcode vertegenwoordigt naar zijn URL. Redis is echt snel en eenvoudig sleutel / waarde database, of a NoSQL database. Deze databases zijn ontworpen voor erg zware zoekacties op sleutel / waarde, en omdat ze de meeste complexiteit van SQL laten vallen, kunnen ze het doen veel sneller. Het 'links:' deel van de sleutel is niet strikt vereist, maar het is een goede gewoonte om je Redis-sleutels in te delen namespaces dus als u later besluit meer informatie in dezelfde database op te slaan, hoeft u zich geen zorgen te maken over clashes. Na dat alles geven we hetzelfde weer index.erb pagina als voorheen. Merk op dat als de gebruiker niets invoert, deze route hetzelfde doet als de vorige route.

De laatste route wordt uitgevoerd wanneer een klant een shortlink bezoekt. Deze route introduceert wat a heet URL-parameter. Wanneer een klant bijvoorbeeld '/ foobar' bezoekt, is de :Korte code een deel van de route komt overeen met 'foobar'. We kunnen URL-parameters op dezelfde manier benaderen als elke andere parameter - de params hash. We zoeken de shortcode op in de Redis-database. Als er niet zo'n sleutel is als wat we proberen te openen, zal Redis terugkeren nul. De volgende regel verwijst naar de URL die we bij Redis hebben weggehaald (als deze bestaat), of verwijst naar de homepage als dit niet het geval is.

views / index.erb

index.erb is meestal saaie opmaak, hoewel het een paar regels heeft die ik graag wil vermelden. erb betekent ingesloten Ruby, en stelt ons in staat om Ruby en HTML te mixen, zoals je zou doen met PHP.

    Shortlink-app    

shortlink-app

<% if @shortcode %>
Uw verkorte URL is: "> http://my-shortlink-app.com/<%= @shortcode %>
<% end %>

Een verschil tussen erb en PHP dat je misschien al hebt opgemerkt (afgezien van de verschillende talen) is dat, waar PHP gebruikt en , erb gebruikt <% en . De enige interessante dingen over index.erb is het if-blok dat alleen het deel van de pagina toont dat de shortlink toont als het @Korte code variabele is gedefinieerd. Hierdoor kunnen we voor alles dezelfde weergave gebruiken. Een ander punt van aandacht is dat we ervoor hebben gezorgd dat HTML is ontsnapt params [: url], zodat we niet het slachtoffer worden van een XSS-aanval. Afgezien van deze punten is het in wezen een standaardwebpagina.


Stap 3. Opschalen

Een ding dat ik kort noemde in de introductie van deze handleiding is hoe gemakkelijk we kunnen schalen, dankzij Redis. Terwijl het opschalen naar meerdere SQL-databases een gecompliceerde aangelegenheid is, is het schalen van Redis eigenlijk vrij triviaal. Dit is een direct gevolg van de eenvoud van Redis. Als u wilt opschalen naar meerdere Redises, voegt u het volgende toe aan uw Redis-configuratie:

 slaveof master-redis-server.my-shortlink-app.com 6379

Als je eenmaal meerdere slaves hebt ingesteld, is het een klein beetje tweak naar de Sinatra-app hierboven om elke Sinatra-instantie verbinding te laten maken met een willekeurige Redis-server (als je in de fase bent waar je Redis moet schalen, ga ik ervan uit dat je al meerdere Sinatra-instanties hebt geïmplementeerd.;)


Conclusie

Ik hoop dat deze tutorial nuttig voor je is gebleken, of je nu je eigen shortlink-service wilt uitvoeren, of dat je gewoon interessant bent in de nieuwste geavanceerde technologieën die beschikbaar zijn voor ons webontwikkelaars. Ik heb een aantal behoorlijk leuke software behandeld in deze tutorial die ongelooflijk nuttig was, niet alleen voor mij, maar ook voor duizenden andere ontwikkelaars. Geniet van je knutselen!