2
\$\begingroup\$

I built an auction site with a dynamic caching layer after I seeing how expensive a dbaas is. The site is now done, but like any site that grows, my caching solution grew too. The cache currently caches every page on the site so I made sure everything gets invalidated appropriately, but the amount of stuff I'm invalidating has grown. More specifically when I'm creating a new auction. I know I'm using Azure so I can scale things from the portal to handle load, but I wanted to make sure my design will work. When someone creates an auction listing, I have to invalidate a bunch of stuff like in code below. Does anyone see a problem with what I'm doing or should I be good?

I'm using redis-delete-wildcard for the delwild keyword

var Post = require('../models/post');
let emails;
var startTime;
const redis = require('redis');
var redisConnection = require("../connections/server");
require('redis-delete-wildcard')(redis); //pass in redis so prototype can be extended
const checkAuth = require('../middleware/check-auth');
module.exports = function (context, req) {
 checkAuth(context, req);
 const tempAuctionKey = `temp-auction-data-${req.body.creator}`;
 redisConnection.client.get(tempAuctionKey, function (err, result) {
 let blacklistGroup;
 let email;
 if (err) {
 console.log(err);
 }
 let output = JSON.parse(result);
 email = output.documents.email;
 emails = output.emails;
 if (err) {
 context.res = {
 status: 500,
 body: {
 message: "FAILED TO GET TEMP AUCTION DATA FROM CACHE!",
 error: err
 },
 headers: {
 "Access-Control-Allow-Credentials": "true",
 "Access-Control-Allow-Origin": "*",
 "Access-Control-Allow-Methods": "POST, OPTIONS",
 "Access-Control-Allow-Headers": "Content-Type, Set-Cookie",
 "Access-Control-Max-Age": "86400",
 "Vary": "Accept-Encoding, Origin",
 "Content-Type": "application/json"
 }
 };
 context.done();
 }
 var fiveDaysAfterAuction = new Date(req.body.auctionEndDateTime * 1000);
 startTime = new Date(req.body.startTime);
 startTime.setSeconds(0);
 fiveDaysAfterAuction.setHours(120);
 console.log("req.body.auctionImages");
 console.log(req.body.images);
 let images = req.body.images;
 console.log("req.body.auctionImagesTimeStamp");
 console.log(req.body.auctionImagesTimeStamp);
 const post = new Post({
 title: req.body.title,
 creator: req.body.creator
 //and more...
 });
 post.save().then(result => {
 const totalListingsKey = `dashboardTotal-${req.body.creator}`;
 const sellerDashboardKey = `dashboard-${req.body.creator}-*`;
 const bioKey = `my-bio-${req.body.sellerName}-*`;
 const mainListingsCountKey = `main-listing-count`;
 const buyNowTotalKey = `buy-total`;
 //clears seller bio page which has active auctions listed
 redisConnection.client.delwild(bioKey, function (error, numberDeletedKeys) {
 console.log("Deleted Seller Bio Page for Seller");
 console.log(numberDeletedKeys);
 });
 if (req.body.auctionType === "publicAuction") {
 //clears all the auction pages
 redisConnection.client.delwild('main-listings-no-filter-page=*', function (error, numberDeletedKeys) {
 console.log("Deletes all auction pages");
 console.log(numberDeletedKeys);
 });
 //clears the buy it now page if new auction is a buy it now listing
 if (req.body.buyItNow) {
 const buyNowKey = `buy-now-page-*`;
 redisConnection.client.delwild(buyNowKey, function (error, numberDeletedKeys) {
 console.log("deleted buynowkeys");
 console.log(numberDeletedKeys);
 });
 //clears buy it now page total count for pagination
 redisConnection.client.del(buyNowTotalKey, function (err, response) {
 if (response == 1) {
 console.log("Deleted Buy Now total count")
 } else {
 console.log("Cannot delete buy now total")
 }
 })
 }
 //clears main page total count for pagination
 redisConnection.client.del(mainListingsCountKey, function (err, response) {
 if (response == 1) {
 console.log("Deleted Listings Count Successfully!")
 } else {
 console.log("Cannot delete")
 }
 })
 }
 //clears seller dashboard listings
 redisConnection.client.delwild(sellerDashboardKey, function (error, numberDeletedKeys) {
 console.log("numberDeletedKeys");
 console.log(numberDeletedKeys);
 });
 //clears seller dashboard page count for pagination
 redisConnection.client.del(totalListingsKey, function (err, response) {
 if (response == 1) {
 console.log("Deleted SellerDashboard Listings Count Successfully!")
 } else {
 console.log("Cannot delete")
 }
 })
 redisConnection.client.expire(tempAuctionKey, 5);
 context.res = {
 status: 201,
 body: {
 message: "Auction listing created successfully!",
 postId: result._id
 },
 headers: {
 "Access-Control-Allow-Credentials": "true",
 "Access-Control-Allow-Origin": "*",
 "Access-Control-Allow-Methods": "POST, OPTIONS",
 "Access-Control-Allow-Headers": "Content-Type, Set-Cookie",
 "Access-Control-Max-Age": "86400",
 "Vary": "Accept-Encoding, Origin",
 "Content-Type": "application/json"
 }
 };
 context.done();
 }).catch((err) => {
 context.res = {
 status: 500,
 body: {
 message: "Auction Creation Failed",
 error: err
 },
 headers: {
 "Access-Control-Allow-Credentials": "true",
 "Access-Control-Allow-Origin": "*",
 "Access-Control-Allow-Methods": "POST, OPTIONS",
 "Access-Control-Allow-Headers": "Content-Type, Set-Cookie",
 "Access-Control-Max-Age": "86400",
 "Vary": "Accept-Encoding, Origin",
 "Content-Type": "application/json"
 }
 };
 context.done();
 });
 });
};
asked Sep 11, 2020 at 14:14
\$\endgroup\$

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.