sql >> Databasteknik >  >> NoSQL >> Redis

Cachar JSON-objekt på serversidan

Du kan använda memcached, men igen skulle alla träffa din databasserver. I ditt fall säger du att frågeresultaten är typ av ihållande så det kan vara mer meningsfullt att cachelagra JSON-svaren från din webbtjänst.

Detta kan göras med en omvänd proxy med inbyggd cache. Jag antar att ett exempel kan hjälpa dig mest hur vi gör det med Jetty (Java) och NGINX:

I vår installation har vi en Jetty (Java)-instans som serverar ett API för våra mobila klienter. API:et lyssnar på localhost:8080/api och returnerar JSON-resultat hämtade från några frågor på en lokal Mysql-databas.

Vid det här laget skulle vi kunna leverera API direkt till våra kunder, men här kommer den omvända proxyn:

Framför API:et sitter en NGINX-webbserver och lyssnar från 0.0.0.0:80/ (överallt, port 80) När en mobilklient ansluter till 0.0.0.0:80/api försöker den inbyggda Reverse Proxyn hämta den exakta frågesträngen från det är cache. Om detta misslyckas, hämtar det det från localhost:8080/api, lägger det i sin cache och serverar det nya värdet som finns i cachen.

Fördelar:

  • Du kan använda andra NGINX-godsaker:automatisk GZIP-komprimering av de cachade JSON-filerna
  • SSL-slutpunktsavslutning vid NGINX.
  • NGINX-arbetare kan gynna dig när du har mycket fler anslutningar, alla som begär data från cachen.
  • Du kan konsolidera dina tjänstslutpunkter

Tänk på cache-invalidering:

Du måste tänka på cache-invalidering. Du kan säga till NGINX att hålla kvar sin cache, säg, i en vecka för alla HTTP 200-förfrågningar för localhost:8080/api, eller 1 minut för alla andra HTTP-statuskoder. Men om det kommer en tid, då du vill uppdatera API:et på mindre än en vecka, är cachen ogiltig, så du måste ta bort den på något sätt eller sänka cachetiden till en timme eller dag (så att de flesta kommer att träffa cache).

Så här gör vi:Vi valde att ta bort cachen när den är smutsig. Vi har ett annat JOBB som körs på servern och lyssnar på en Update-API-händelse utlöses via Puppet. JOBBET kommer att ta hand om att rensa NGINX-cachen åt oss.

En annan idé skulle vara att lägga till funktionen för att rensa cache i din webbtjänst. Anledningen till att vi bestämde oss för den här lösningen är:Webbtjänsten måste veta att den körs bakom en omvänd proxy, vilket bryter åtskillnaden mellan problem. Men jag skulle säga att det beror på vad du planerar.

En annan sak, som skulle göra din webbtjänst mer rätt skulle vara att visa korrekta ETAG- och cache-expires-rubriker med varje JSON-fil. Återigen, vi gjorde inte det eftersom vi har en stor uppdateringshändelse istället för små för varje fil.

Sidanteckningar:

  • Du behöver inte använda NGINX, men det är väldigt enkelt att konfigurera
  • NGINX och Apache har SSL-stöd
  • Det finns också den berömda Reverse Proxy (https://www.varnish-cache.org), men såvitt jag vet fungerar den inte SSL (ännu?)

Så, om du skulle använda Varnish framför din Web Service + SSL, skulle du använda en konfiguration som:NGINX -> Varnish -> Web Service.

Referenser:- NGINX-server:http://nginx.com- Varnish Reverse Proxy:https://www.varnish-cache.org- Puppet IT Automation:https://puppetlabs.com- NGINX omvänd proxyhandledning:http:/ /www.cyberciti.biz/faq/howto-linux-unix-setup-nginx-ssl-proxy/ http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html




  1. hitta id för senaste underdokument infogat i mongoose

  2. Hur skickar socket.io meddelanden över flera servrar?

  3. Redis-anslutning till 127.0.0.1:6379 misslyckades - anslut ECONNREFUSED

  4. är det möjligt att anropa lua-funktioner definierade i andra lua-skript i redis?