Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions nodejs/average.js
Original file line number Diff line number Diff line change
@@ -1,46 +1,47 @@
import constants from './constants.js'
import { Database } from 'sqlite'
import Redis from 'ioredis'
import constants from './constants.js';
import { Database } from 'sqlite';
import { createClient } from 'redis';

const db = new Database(constants.sqlite_database)
const redis = new Redis(constants.redis)
const db = new Database(constants.sqlite_database);
const client = createClient({ url: constants.redis });

const tavg_average_sql = `SELECT AVG(tavg)
FROM weather_measurements
WHERE date
BETWEEN (?) AND (?)`
BETWEEN (?) AND (?)`;

/* Returns average of recorded daily temperature from the database. */
const getAverage = async (location, startDate, endDate) => {
/* Dynamically generate the cache key */
const cacheKey = `weather:${location}:${startDate}:${endDate}:average`

client.on('error', (error) => {
throw new Error(error);
});
await client.connect();
/* Check Redis for cached entry first */
let cacheEntry = await redis.get(cacheKey)
let cacheEntry = await client.get(cacheKey)

/* If Redis returns a cache hit, */
if (cacheEntry) {
cacheEntry = JSON.parse(cacheEntry)
cacheEntry = JSON.parse(cacheEntry);

/* return the entry */
return { ...cacheEntry, source : 'cache'}
return { ...cacheEntry, source: 'cache' };
}

/* If Redis returns a cache miss, fetch the entry from the database */
await db.open()
const dbEntry = await db.get(tavg_average_sql, [startDate, endDate])
await db.open();
const dbEntry = await db.get(tavg_average_sql, [startDate, endDate]);

/* Add the entry we pulled from the database to the cache */
redis.set(cacheKey, JSON.stringify(dbEntry), 'EX', 60 * 60 * 24)
client.set(cacheKey, JSON.stringify(dbEntry), { EX: 60 * 60 * 24 });

/* Return the database entry */
return { ...dbEntry, source : 'database'}
return { ...dbEntry, source: 'database' };
}

const t0 = new Date().getTime()
const average = await getAverage('Iceland', '2010-01-01', '2020-11-01')
const t1 = new Date().getTime()
average.responseTime = `${t1-t0}ms`
average.responseTime = `${t1 - t0}ms`
console.log(average)
redis.quit()
process.exit()
client.quit();
7 changes: 2 additions & 5 deletions nodejs/constants.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import sqlite3 from 'sqlite3'

export default {
'redis' : {
'port': process.env.REDIS_PORT || 6379,
'host': process.env.REDIS_HOST || '127.0.0.1'
},
'redis' : `redis://localhost:6379`,
'sqlite_database': process.env.SQLITE_DB || {
filename: 'db/weather.db',
driver: sqlite3.Database
},
'weather_csv': process.env.WEATHER_CSV || './db/weather.csv'
}
}
Loading