Interactive analytics dashboards serve several purposes. They allow you to share data and provide you with all those vital information to make game-changing decisions at a faster pace. Building a real-time dynamic dashboard using a traditional relational database might require a complex set of queries. By using a NoSQL database like Redis, you can build a powerful interactive and dynamic dashboard with a small number of Redis commands.
Redis is an open source, in-memory, key-value data store most commonly used as a primary database, cache, message broker, and queue. Redis cache delivers sub-millisecond response times, enabling fast and powerful real-time applications in industries such as gaming, fintech, ad-tech, social media, healthcare, and IoT. This tutorial shows a basic analytics dashboard app writen in NodeJS (JavaScript) that uses the Redis Bitmap data type.
First we will be setting up some environment variables.
Go to /server folder (cd ./server) and then execute the following command:
You may need to preface the docker command with sudo
. If you don't want to use sudo, create a Unix group called docker and add users to it. When the Docker daemon starts, it creates a Unix socket accessible by members of the docker group.
Once the Redis database is up and running, you can connect to it using the redis-cli
command.
Go to /client folder (cd ./client) and then:
The event data is stored in various keys and various data types.
For each of time spans:
and for each of scopes:
and for each of data types (types):
Is generated key like:
where values in [] are optional.
For each generated key like: rab:set:*, data is stored like: SADD {key} {userId} Example:
For each generated key like rab:bitmap:*, data is stored like: SETBIT {key} {userId} 1. Example:
December:Â BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12
 X week of December: BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12/{X}
 Example:
Example:
Example:
December:
Example:
BITCOUNT rab:bitmap:source:{source}:timeSpan:2015-12/{X}
Example:
BITCOUNT rab:bitmap:action:visit:{page}:timeSpan:2015-12-01
 to BITCOUNT rab:bitmap:action:visit:{page}:timeSpan:2015-12-31
GET rab:count:action:buy:timeSpan:2015-12
 GET rab:count:action:buy:timeSpan:2015-12/{X}
 Example:December: GET rab:count:action:addToCart:timeSpan:2015-12
 X week of December: GET rab:count:action:addToCart:timeSpan:2015-12/{X}
 Example:
December:Â GET rab:count:action:buy:page:{productPage}:timeSpan:2015-12
 Example:
X week of December:Â GET rab:count:action:buy:page:{productPage}:timeSpan:2015-12/{X}
 Example:
Example:
git clone https://github.com/redis-developer/basic-analytics-dashboard-redis-bitmaps-nodejs
cp .env.example .env
npm install
docker network create global
docker-compose up -d --build
npm run dev
cp .env.example .env
npm install
npm run serve
rab:{type}[:custom:{customName}][:user:{userId}][:source:{source}][:action:{action}][:page:{page}]:timeSpan:{timeSpan}
INCR rab:count:action:addToCart:timeSpan:2015-12/3
SADD rab:set:action:addToCart:timeSpan:2015-12/3 8
SETBIT rab:bitmap:action:addToCart:timeSpan:2015-12/3 8 1
BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12/3
December: BITCOUNT rab:bitmap:action:visit:page:{page}:timeSpan:2015-12
BITCOUNT rab:bitmap:action:visit:page:homepage:timeSpan:2015-12
BITCOUNT rab:bitmap:action:visit:page:{page}:timeSpan:2015-12/{X}
BITCOUNT rab:bitmap:action:visit:page:product1:timeSpan:2015-12/2
BITCOUNT rab:bitmap:source:{source}:timeSpan:2015-12
BITCOUNT rab:bitmap:source:referral:timeSpan:2015-12
BITCOUNT rab:bitmap:source:google:timeSpan:2015-12/1
BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-29 => BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-30 => BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-31
GET rab:count:action:buy:timeSpan:2015-12/1
GET rab:count:action:addToCart:timeSpan:2015-12/1
GET rab:count:action:buy:page:product3:timeSpan:2015-12
GET rab:count:action:buy:page:product1:timeSpan:2015-12/2
SMEMBERS rab:set:action:buy:page:{productPage}:timeSpan:2015-12
SMEMBERS rab:set:action:buy:page:product2:timeSpan:2015-12
SINTER rab:set:action:buy:page:product1:timeSpan:anytime rab:set:action:buy:page:product2:timeSpan:anytime