Hur man bygger en Shortlink App med Ruby och Redis

I den här handledningen bygger vi en snabb webblänk med Ruby, webbsidan Sinatra och Redis-databasen. När du avslutar den här handledningen kommer du att sluta med en död enkel, högpresterande kortlänk webbapp som är super lätt att skala.


Steg 1. Komma igång

För att följa med denna handledning behöver du Ruby installerat på ditt system (jag använder 1.9.2), liksom sinatra och redis pärlor och redis.

Om du inte redan har Ruby installerat på ditt system, ska du kunna installera det relativt enkelt. OS X, Debian eller CentOS-användare kan behöva sammanställa en nyare version av Ruby. Det är en ganska enkel process.

Hänvisa här för att lära dig hur du installerar Ruby via RVM.

Nu måste du installera de nödvändiga Ruby Gemsna. Gems är ett bekvämt sätt att installera praktiskt taget alla Ruby-bibliotek tillgängliga. Skriv bara följande i ditt terminalfönster för att installera de nödvändiga pärlorna:

 pärla installera sinatra redis

Vi måste också installera och kompilera Redis. Oroa dig inte, det är väldigt liten och tar bara ungefär 15 sekunder att kompilera på min maskin.

 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 gör sudo make install cd? 

Du kan köra Redis-servern genom att skriva redis-server in i din terminal, och om du tycker om att leka med Redis, ge redis-cli sedan.


Steg 2. Bygga App

En av de fantastiska sakerna om Sinatra är hur snabbt och enkelt det gör whipping upp enkla lilla appar - det är nästan dumt!

Koden för själva programmet Shortlink kommer inte vara så lång, så det borde vara väldigt lätt att förstå. Oroa dig inte om du förstår det först, ska jag förklara hur det hela fungerar inom kort.

Gör en mapp för din webapp - jag har ringt till min redis-ruby-Short - och lägg följande filer i den.

shortlink_app.rb

 kräver 'sinatra' kräver 'redis' redis = Redis.new helpers inkluderar Rack :: Utils alias_method: h,: escape_html def random_string (längd) rand (36 ** längd) .to_s (36) änden få / gör erb: index end post '/' gör om parametrar [: url] och inte parametrar [: url] .empty? @shortcode = random_string 5 redis.setnx "länkar: # @ shortcode", params [: url] end erb: index end get '/: shortcode' gör @url = redis.get "länkar: # params [: shortcode ] "omdirigera @url || '/' slutet

Det är allt. Ganska enkelt, eh?

I den lilla Sinatra appen ovan har jag gjort några viktiga saker. I de två första raderna tar jag in de bibliotek vi behöver - sinatra och redis. På rad 4 etablerar jag en anslutning till Redis-servern, lyssnar på localhost. Linjerna efter detta är där allt börjar bli intressant!

I Sinatra kan du ange hjälpare som exekveras varje gång en av dina rutter (de där skaffa sig och posta delar) körs. Vi kan lägga allt som vi kan behöva ofta i hjälpblocket. I mina helpers block har jag aliased h till rack s escape_html, och definierade en metod för att alstra en slumpvis alfanumerisk sträng av en viss längd.

Nästa upp är rutter. Den första vägen är ganska enkel. När en kund gör en GET-förfrågan till /, det gör bara index.erb sida (jag har tagit med källan till detta längre ner.)

Nästa rutt är där de goda sakerna händer. Först kontrollerar vi att användaren faktiskt har skrivit en URL i URL-rutan. Om så är fallet genererar vi ett slumpmässigt kortnummer fem tecken långt genom att ringa random_string metod vi definierade tidigare. Sedan berättar vi Redis att setnx (Uppsättning om n exists), en nyckel som representerar vår kortnummer till dess URL. Redis är en väldigt snabb och enkel nyckel / värde databas, eller a NoSQL databas. Dessa databaser är avsedda för riktigt tunga nyckel / värdeuppslagningsoperationer, och eftersom de släpper mest av SQL-komplexiteten kan de göra det mycket snabbare. Den "länkar:" delen av nyckeln är inte absolut nödvändig, men det är bra att dela upp dina Redis-nycklar i namnrymder så om du bestämmer dig senare för att lagra mer information i samma databas, behöver du inte oroa dig för konflikter. Efter allt det gör vi detsamma index.erb sida som tidigare. Lägg märke till hur om användaren inte anger något, gör den samma sak som den tidigare rutten.

Den slutliga rutten körs när en klient besöker en kortlänk. Denna rutt introducerar det som kallas a URL-parameter. Till exempel, när en klient besöker "/ foobar", : kortkod En del av rutten matchar "foobar". Vi kan komma åt webbadressparametrar på samma sätt som alla andra parametrar - params hash. Vi letar upp kortnumret i Redis-databasen. Om det inte finns någon sådan nyckel som vad vi försöker komma åt kommer Redis att återvända noll. Nästa rad omdirigerar till antingen webbadressen vi tagit ut från Redis (om den finns), eller omdirigerar till hemsidan om inte.

visningar / index.erb

index.erb är mestadels tråkigt markup, även om det har några rader som jag skulle vilja påpeka. erb står för inbäddad Ruby, och låter oss blanda Ruby och HTML, som du skulle med PHP.

    Kortlänk App    

shortlink app

<% if @shortcode %>
Din förkortade URL är: "> http://my-shortlink-app.com/<%= @shortcode %>
<% end %>

En skillnad mellan erb och PHP som du kanske har märkt (förutom de olika språken) är det där PHP använder och , erb använder <% och . De enda intressanta sakerna om index.erb är if-blocket som bara gör den del av sidan som visar kortlänken om @shortcode variabel definieras. Detta låter oss använda samma vy för allting. En annan anmärkningsvärd är att vi har försäkrat oss om att hämta HTML params [: url], så att vi inte blir offer för en XSS-attack. Annat än de punkterna är det i grunden en standard för webbsidor.


Steg 3. Skal upp

En sak som jag kort sagt nämnde i den här handledningens introduktion är hur lätt vi kan skala, tack vare Redis. Medan skalning till flera SQL-databaser är en komplicerad affär, är skalning Redis faktiskt ganska trivial. Detta är ett direkt resultat av Redis 'enkelhet. Om du behöver skala till flera redigeringar, lägg till följande i din Redis-konfiguration:

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

När du har installerat flera slavar är det en liten liten tweak till Sinatra-appen ovan för att göra varje Sinatra-instans ansluta till en slumpmässig Redis-server (om du är på det stadium där du behöver skala Redis, antar jag att du redan måste distribuera flera Sinatra-instanser.


Slutsats

Jag hoppas att denna handledning visat sig vara användbar för dig, oavsett om du vill köra din egen kortlänkstjänst eller du är helt enkelt intressant i den senaste spetsteknologin som är tillgänglig för våra webbutvecklare. Jag har täckt en ganska snygg mjukvara i den här handledningen som varit otroligt användbar för att inte bara jag, men tusentals andra utvecklare där ute. Njut av din tinkering!