Come creare un'app Shortlink con Ruby e Redis

In questo tutorial, costruiremo una rapida app Web shortlink con Ruby, il framework web Sinatra e il database Redis. Con la conclusione di questo tutorial, ti ritroverai con una webapp deadlink semplice, ad alte prestazioni e super facile da scalare.


Passaggio 1. Per iniziare

Per seguire questo tutorial, avrai bisogno di Ruby installato sul tuo sistema (sto usando 1.9.2), così come il Sinatra e Redis gemme e Redis.

Se non hai già installato Ruby sul tuo sistema, dovresti essere in grado di installarlo con relativa facilità. Gli utenti di OS X, Debian o CentOS potrebbero aver bisogno di compilare una versione più recente di Ruby. È un processo piuttosto semplice.

Fare riferimento qui per informazioni su come installare Ruby, tramite RVM.

Ora dovrai installare le Ruby Gems richieste. Le gemme sono un modo conveniente per installare virtualmente qualsiasi libreria Ruby disponibile. Basta digitare quanto segue nella finestra del terminale per installare le gemme richieste:

 gemma installare sinatra redis

Dovremo anche installare e compilare Redis. Non preoccuparti, è veramente piccolo e richiede solo 15 secondi per essere compilato sulla mia macchina.

 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? 

È possibile eseguire il server Redis digitando Redis server nel tuo terminale, e se hai voglia di giocare con Redis, dai Redis-cli un via.


Passaggio 2. Creazione dell'app

Una delle grandi cose di Sinatra è la sua velocità e facilità nel montare semplici piccole app: è quasi una sciocchezza!

Il codice per l'app dello shortlink non sarà molto lungo, quindi dovrebbe essere veramente facile da capire. Non ti preoccupare se non lo capisci all'inizio, ti spiegherò come funziona tutto a breve.

Crea una cartella per la tua webapp: l'ho chiamata mia Redis-ruby-shortlink - e metti i seguenti file in esso.

shortlink_app.rb

 richiedono 'sinatra' richiedono redis 'redis' = Redis.nuovi helper includono 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] e non params [: url] .empty? @shortcode = random_string 5 redis.setnx "link: # @ shortcode", params [: url] end erb: index end get "/: shortcode" do @url = redis.get "links: # params [: shortcode ] "redirect @url || '/' fine

Questo è tutto. Abbastanza semplice, eh?

In quella piccola app di Sinatra sopra, ho fatto alcune cose chiave. Nelle prime due righe, sto portando le librerie di cui abbiamo bisogno - Sinatra e redis. Alla riga 4, stabilisco una connessione al server Redis, ascoltando su localhost. Le linee dopo questo è dove tutto inizia a diventare interessante!

In Sinatra, puoi specificare aiutanti che vengono eseguiti ogni volta che uno dei tuoi itinerari (quelli ottenere e inviare parti) viene eseguito. Possiamo mettere tutto ciò di cui potremmo aver bisogno spesso nel blocco degli helper. Nel mio blocco di aiutanti, ho aliasato h a Rack's escape_html, e definito un metodo per generare una stringa alfanumerica casuale di una certa lunghezza.

Il prossimo sono i itinerari. La prima via è piuttosto semplice. Ogni volta che un cliente fa una richiesta GET a /, rende solo il index.erb pagina (ho incluso la fonte per questo più in basso.)

Il prossimo percorso è dove avvengono le cose buone. Innanzitutto, ci assicuriamo che l'utente abbia effettivamente inserito un URL nella casella dell'URL. Se è così, generiamo uno shortcode casuale di cinque caratteri chiamando il random_string metodo che abbiamo definito prima. Quindi, diciamo a Redis di setnx (Impostato Se n eXists), una chiave che rappresenta il nostro shortcode al suo URL. Redis è davvero veloce e semplice database di chiavi / valori, o a NoSQL Banca dati. Questi database sono progettati per operazioni di ricerca chiave / valore molto pesanti e, dato che eliminano la maggior parte della complessità di SQL, possono farlo tanto Più veloce. Il "link:" parte della chiave non è strettamente richiesto, ma è buona pratica dividere le tue chiavi Redis in spazi dei nomi quindi se decidi in seguito di memorizzare più informazioni nello stesso database, non ti devi preoccupare degli scontri. Dopo tutto ciò, rendiamo lo stesso index.erb pagina come prima. Notare come se l'utente non immette nulla, questa rotta fa la stessa cosa della rotta precedente.

Il percorso finale viene eseguito quando un client visita uno shortlink. Questa rotta introduce ciò che viene chiamato a Parametro URL. Ad esempio, quando un cliente visita "/ foobar", il :codice corto parte del percorso corrisponde a 'foobar'. Possiamo accedere ai parametri URL allo stesso modo di qualsiasi altro parametro: il params hash. Cerchiamo lo shortcode nel database Redis. Se non c'è una chiave come quella che stiamo cercando di accedere, Redis tornerà zero. La riga successiva reindirizza all'URL estratto da Redis (se esiste) o reindirizza alla home page se non lo è.

views / index.erb

index.erb è per lo più noioso markup, anche se ho alcune righe che vorrei sottolineare. erb sta per Ruby incorporato, e ci consente di mixare Ruby e HTML, come faresti con PHP.

    App Shortlink    

scorciatoia app

<% if @shortcode %>
L'URL abbreviato è: "> http://my-shortlink-app.com/<%= @shortcode %>
<% end %>

Una differenza tra erb e PHP che potresti aver già notato (a parte le diverse lingue) è quella, dove PHP usa e , erb usa <% e . L'unica cosa interessante su index.erb è il blocco if che rende solo la parte della pagina che mostra il collegamento breve se il @codice corto la variabile è definita. Questo ci permette di usare la stessa vista per tutto. Un altro punto di nota è che abbiamo fatto in modo di evitare l'HTML params [: url], in modo che non cadiamo vittime di un attacco XSS. Oltre a questi punti, è essenzialmente una pagina web standard di serie.


Passaggio 3. Ridimensionamento

Una cosa che ho brevemente menzionato nell'introduzione di questo tutorial è la facilità con cui possiamo scalare, grazie a Redis. Mentre il ridimensionamento su più database SQL è un problema complicato, ridimensionare Redis è in realtà piuttosto banale. Questo è un risultato diretto della semplicità di Redis. Se è necessario ridimensionare a più Redises, aggiungere quanto segue alla configurazione Redis:

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

Dopo aver configurato più slave, è sufficiente un piccolo ritocco per l'app Sinatra in alto per rendere ogni istanza di Sinatra collegata a un server Redis casuale (se ti trovi nella fase in cui devi ridimensionare Redis, assumerò che hai già dovuto distribuire più istanze di Sinatra.;)


Conclusione

Spero che questo tutorial si sia rivelato utile per te, sia che tu voglia gestire il tuo servizio shortlink, o che tu sia semplicemente interessante con le ultime tecnologie all'avanguardia che sono disponibili per noi sviluppatori web. In questo tutorial ho trattato alcuni software piuttosto accurati che sono stati incredibilmente utili non solo per me, ma anche per migliaia di altri sviluppatori. Goditi il ​​tuo armeggiare!