Skip to content

Accelerating Redis Get Set Operations

Hüseyin Tuğrul BÜYÜKIŞIK edited this page Sep 29, 2021 · 2 revisions
"use strict"

// backing-store
const Redis = require("ioredis");
const redis = new Redis(); 

// LRU cache
let Lru = require("./lrucache.js").Lru;
let num_cache_elements = 1500;
let element_life_time_miliseconds = 1000;

let cache = new Lru(num_cache_elements, async function(key,callback){
	redis.get(key, function (err, result) {
		callback(result);
	});
}, element_life_time_miliseconds, async function(key,value,callback){
	redis.set(key,value, function (err, result) {
		callback();
	});
});

const N_repeat = 20;
const N_bench = 20000;
const N_concurrency = 100;
const N_dataset = 1000;

function randomKey(){ return Math.floor(Math.random()*N_dataset); }

// without LRU caching
async function benchWithout(callback){

	for(let i=0;i<N_bench;i+=N_concurrency){
		let ctr = 0;
		let w8 = new Promise((success,fail)=>{
			for(let j=0;j<N_concurrency;j++)
			{
				redis.set(randomKey(),i, function (err, result) {
					redis.get(randomKey(), function (err, result) {
						ctr++;
						if(ctr == N_concurrency)
						{
							success(1);
						}	
					});
				});
			}
		});
		let result = await w8;

	}
	callback();
}

// with LRU caching
async function benchWith(callback){
	for(let i=0;i<N_bench;i+=N_concurrency){
		let ctr = 0;
		let w8 = new Promise((success,fail)=>{
			for(let j=0;j<N_concurrency;j++)
			{
				cache.set(randomKey(),i, function (result) {
					cache.get(randomKey(), function (result) {
						ctr++;
						if(ctr == N_concurrency)
						{
							success(1);
						}	
					});
				});
			}
		});
		let result = await w8;

	}
	callback();
}

let ctr = 0;
function restartWithoutLRU(callback){
	let t = Date.now();
	benchWithout(function(){
		console.log("without LRU: "+(Date.now() - t)+" milliseconds");
		ctr++;
		if(ctr != N_repeat)
		{
			restartWithoutLRU(callback);
		}
		else
		{
			ctr=0;
			callback();
		}
	});
}

function restartWithLRU(){
	let t = Date.now();
	benchWith(function(){
		console.log("with LRU: "+(Date.now() - t)+" milliseconds");
		ctr++;
		if(ctr != N_repeat)
		{
			restartWithLRU();
		}
		
	});
}


restartWithoutLRU(restartWithLRU);

Cache size / dataset size = 0.5:

without LRU: 1274 milliseconds
without LRU: 1081 milliseconds
without LRU: 1054 milliseconds
without LRU: 1014 milliseconds
without LRU: 1023 milliseconds
without LRU: 1017 milliseconds
without LRU: 1009 milliseconds
without LRU: 1030 milliseconds
without LRU: 1019 milliseconds
without LRU: 1015 milliseconds
without LRU: 1030 milliseconds
without LRU: 1009 milliseconds
without LRU: 1056 milliseconds
without LRU: 1073 milliseconds
without LRU: 1098 milliseconds
without LRU: 1135 milliseconds
without LRU: 1068 milliseconds
without LRU: 1066 milliseconds
without LRU: 1081 milliseconds
without LRU: 1069 milliseconds
with LRU: 734 milliseconds
with LRU: 653 milliseconds
with LRU: 621 milliseconds
with LRU: 605 milliseconds
with LRU: 613 milliseconds
with LRU: 612 milliseconds
with LRU: 601 milliseconds
with LRU: 593 milliseconds
with LRU: 587 milliseconds
with LRU: 603 milliseconds
with LRU: 595 milliseconds
with LRU: 600 milliseconds
with LRU: 601 milliseconds
with LRU: 593 milliseconds
with LRU: 600 milliseconds
with LRU: 596 milliseconds
with LRU: 585 milliseconds
with LRU: 622 milliseconds
with LRU: 592 milliseconds
with LRU: 605 milliseconds

Cache size / dataset size = 0.8:

with LRU: 539 milliseconds
with LRU: 449 milliseconds
with LRU: 446 milliseconds
with LRU: 443 milliseconds
with LRU: 443 milliseconds
with LRU: 441 milliseconds
with LRU: 438 milliseconds
with LRU: 449 milliseconds
with LRU: 442 milliseconds
with LRU: 439 milliseconds
with LRU: 440 milliseconds
with LRU: 441 milliseconds
with LRU: 439 milliseconds
with LRU: 446 milliseconds
with LRU: 432 milliseconds
with LRU: 429 milliseconds
with LRU: 442 milliseconds
with LRU: 433 milliseconds
with LRU: 442 milliseconds
with LRU: 430 milliseconds

Cache size / dataset size = 0.99:

with LRU: 447 milliseconds
with LRU: 345 milliseconds
with LRU: 347 milliseconds
with LRU: 334 milliseconds
with LRU: 339 milliseconds
with LRU: 334 milliseconds
with LRU: 331 milliseconds
with LRU: 332 milliseconds
with LRU: 340 milliseconds
with LRU: 329 milliseconds
with LRU: 326 milliseconds
with LRU: 326 milliseconds
with LRU: 325 milliseconds
with LRU: 338 milliseconds
with LRU: 320 milliseconds
with LRU: 329 milliseconds
with LRU: 330 milliseconds
with LRU: 313 milliseconds
with LRU: 334 milliseconds
with LRU: 336 milliseconds

Cache size / dataset size = 1.5:

with LRU: 383 milliseconds
with LRU: 30 milliseconds
with LRU: 30 milliseconds
with LRU: 32 milliseconds
with LRU: 30 milliseconds
with LRU: 32 milliseconds
with LRU: 30 milliseconds
with LRU: 29 milliseconds
with LRU: 30 milliseconds
with LRU: 29 milliseconds
with LRU: 30 milliseconds
with LRU: 30 milliseconds
with LRU: 30 milliseconds
with LRU: 31 milliseconds
with LRU: 29 milliseconds
with LRU: 30 milliseconds
with LRU: 29 milliseconds
with LRU: 30 milliseconds
with LRU: 30 milliseconds
with LRU: 29 milliseconds

Clone this wiki locally