Hvordan bygge en Shortlink App med Ruby og Redis

I denne opplæringen skal vi bygge en hurtig shortlink webapp med Ruby, Sinatra web-rammeverket og Redis-databasen. Ved avslutningen av denne opplæringen vil du ende opp med en død enkel, høy ytelse kortkoblet webapp som er super lett å skalere.


Trinn 1. Komme i gang

For å følge med denne opplæringen må du ha Ruby installert på systemet ditt (jeg bruker 1.9.2), så vel som sinatra og Redis perler og redis.

Hvis du ikke allerede har Ruby installert på systemet, bør du kunne installere det relativt enkelt. Brukerne av OS X, Debian eller CentOS må kanskje kompilere en nyere versjon av Ruby. Det er en ganske enkel prosess.

Se her for å lære om hvordan du installerer Ruby, via RVM.

Nå må du installere de nødvendige Ruby Gems. Gems er en praktisk måte å installere nesten hvilken som helst Ruby-bibliotek tilgjengelig. Skriv inn følgende i terminalvinduet for å installere de nødvendige perlene:

 perle installere sinatra redis

Vi må også installere og kompilere Redis. Ikke bekymre deg, det er veldig lite og tar bare omtrent 15 sekunder å kompilere 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 gjør sudo make install cd? 

Du kan kjøre Redis-serveren ved å skrive Redis-serveren inn i terminalen din, og hvis du har lyst til å leke med Redis, gi Redis-cli en gå.


Trinn 2. Bygg App

En av de store tingene ved Sinatra er hvor raskt og enkelt det gjør whipping opp enkle små apps - det er nesten dumt!

Koden for shortlink appen selv vil ikke være veldig lang, så det burde være veldig lett å forstå. Ikke bekymre deg hvis du ikke forstår det først, forklarer jeg hvordan alt fungerer kort.

Lag en mappe for din webapp - jeg har kalt min Redis-ruby-short - og legg inn følgende filer i den.

shortlink_app.rb

 krever 'sinatra' krever 'redis' redis = Redis.new helpers inkluderer Rack :: Utils alias_method: h,: escape_html def random_string (lengde) rand (36 ** lengde) .to_s (36) End End Get '/' erb: index end post '/' gjør hvis params [: url] og ikke params [: url] .empty? @shortcode = random_string 5 redis.setnx "linker: # @ shortcode", params [: url] end erb: index end get '/: shortcode' gjør @url = redis.get "linker: # params [: shortcode ] "omdiriger @url || '/' slutt

Det er det. Ganske enkelt, eh?

I den lille Sinatra appen ovenfor har jeg gjort noen viktige ting. I de to første linjene bringer jeg inn de bibliotekene vi trenger - sinatra og redis. På linje 4 etablerer jeg en forbindelse til Redis-serveren, lytter på localhost. Linjene etter dette er hvor alt begynner å bli interessant!

I Sinatra kan du spesifisere hjelpere som utføres hver gang en av dine ruter (de og post deler) kjøres. Vi kan sette noe som vi kanskje trenger ofte i hjelpeblokken. I mine hjelpere blokkerer, har jeg aliased h til Racks escape_html, og definerte en metode for å generere en tilfeldig alfanumerisk streng med en viss lengde.

Neste opp er ruter. Den første ruten er ganske enkel. Når en klient gjør en GET-forespørsel til /, det gjør bare index.erb side (jeg har tatt kilden til dette lenger nede.)

Den neste ruten er hvor de gode greiene skjer. Først sørger vi for at brukeren faktisk har skrevet en URL til URL-boksen. I så fall genererer vi en tilfeldig kortkode fem tegn lang ved å ringe random_string metode vi definerte før. Da forteller vi Redis å setnx (Sett hvis n exists), en nøkkel som representerer vår kortkode til nettadressen sin. Redis er veldig rask og enkel nøkkel / verdi database, eller a NoSQL database. Disse databasene er designet for virkelig tunge nøkkel / verdi oppslag operasjoner, og da de mister det meste av SQL-kompleksiteten, kan de gjøre det mye raskere. Delene av nøkkelen "koblinger:" er ikke strengt nødvendig, men det er god praksis å dele dine Redis-nøkler inn i navnerom så hvis du senere bestemmer deg for å lagre mer informasjon i samme database, trenger du ikke å bekymre deg for sammenstøt. Etter alt det gjør vi det samme index.erb side som før. Legg merke til hvordan hvis brukeren ikke oppgir noe, gjør denne ruten det samme som forrige rute.

Den endelige ruten kjøres når en klient besøker en snarvei. Denne ruten introduserer det som kalles a URL-parameter. For eksempel, når en klient besøker '/ foobar', :kort kode En del av ruten samsvarer med 'foobar'. Vi kan få tilgang til nettadresseparametre på samme måte som alle andre parametre - params hash. Vi ser opp kortnummeret i Redis-databasen. Hvis det ikke er en slik nøkkel som det vi prøver å få tilgang til, kommer Redis tilbake nil. Neste linje omdirigerer til nettadressen vi tok ut av Redis (hvis den eksisterer), eller omadresserer til hjemmesiden hvis ikke.

visninger / index.erb

index.erb er for det meste kjedelig markup, selv om det har noen linjer jeg vil gjerne påpeke. erb står for innebygd Ruby, og lar oss blande Ruby og HTML, som du ville med PHP.

    Shortlink App    

shortlink app

<% if @shortcode %>
Din forkortede URL er: "> http://my-shortlink-app.com/<%= @shortcode %>
<% end %>

En forskjell mellom erb og PHP som du kanskje allerede har lagt merke til (bortsett fra de forskjellige språkene) er det der PHP bruker og , erb bruker <% og . De eneste interessante tingene med index.erb er if-blokken som bare gjør den delen av siden som viser snarveien hvis @kort kode variabel er definert. Dette lar oss bruke samme visning for alt. Et annet poeng er at vi har sørget for at HTML rømmer params [: url], slik at vi ikke blir offer for et XSS-angrep. Annet enn de punktene, er det i hovedsak en aksjestandard nettside.


Trinn 3. Skal opp

En ting jeg kort nevnt i denne veiledningens introduksjon er hvor lett vi kan skalere, takket være Redis. Mens scaling ut til flere SQL-databaser er en komplisert affære, er scaling Redis faktisk ganske trivielt. Dette er et direkte resultat av Redis 'enkelhet. Hvis du trenger å skalere til flere Rediser, legger du til følgende i Redis-konfigurasjonen din:

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

Når du har flere slaver satt opp, er det en liten liten tweak til Sinatra-appen ovenfor for å gjøre hver Sinatra-forekomst koble til en tilfeldig Redis-server (hvis du er på scenen der du må skala Redis, skal jeg anta at du allerede har hatt å distribuere flere Sinatra-forekomster.;)


Konklusjon

Jeg håper denne opplæringen viste seg å være nyttig for deg, om du vil kjøre din egen shortlink-tjeneste, eller du er ganske enkelt interessant i de nyeste banebrytende teknologiene som er tilgjengelige for våre webutviklere. Jeg har dekket noe ganske pent programvare i denne opplæringen som har vært utrolig nyttig å ikke bare meg, men tusenvis av andre utviklere der ute. Nyt tinkering!