Snabbare Redis

Du som följer denna blogg sedan en tid tillbaka vet kanske att jag har en liten förkärlek till Redis som är en key-value storage mjukvara. Jag har tidigare genomfört prestandatester som visat på att Redis är sjukt snabbt för både läsning och skrivning, eller som de själva beskriver:

Redis is pretty fast!, 110000 SETs/second, 81000 GETs/second in an entry level Linux box. Check the benchmarks.

Och eftersom jag använder Redis i mer eller mindre alla mina nya projekt så testade jag huruvida det är möjligt att få upp hastigheten ytterligare, och det visade sig vara möjligt. Enligt följande så kan du minska minnesförbrukning och få upp hastigheten mellan 20-90%.

Först och främst så bör du installera Redis 2.2 RC1 som bl.a. stödjer Unix sockets vilket gör att du inte behöver ta en extra omväg över TCP/IP-stacken.

Sedan så måste du se till att det klientbibliotek du använder mot Redis stödjer Unix sockets, py-redis gör det med en patch (se längst ner) samt så stödjer phpredis Unix-sockets. Ändra även i redis.conf genom att lägga till följande:

unixsocket /ebs/redis.sock

Vilket pekar ut sökvägen till den socket som skall användas för kommunikation, konfigureras även när du ansluter i ditt klientbibliote på följande sätt när det gäller PHP (phpredis):

if(!$redis->connect('/ebs/redis.sock'))
     die("Can't connect to redis socket\n");

Och för Python:

r = redis.Redis(host='/ebs/redis.sock', port=0, db=0)

Om du vill vara ännu våghalsig så kan du ställa in hur ofta Redis skall skriva till disken och där har jag bortkommenterat så att skrivningar ej görs allt för ofta. Detta leder dock till att du kan förlora information:

#save 900 1
#save 300 10
save 60 10000
rdbcompression no

Uppdatering: Ett annat sätt att få upp prestandan är att använda pipelines vilket gör att kommandon  ej exekveras direkt och väntar på att din pipe skall exekveras istället. Montera även filsystemet med noatime vilket kan snabba upp diskskrivningar.

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *