+ addVideoView (videoId: number) {
+ const keyIncr = this.generateVideoViewKey(videoId)
+ const keySet = this.generateVideosViewKey()
+
+ return Promise.all([
+ this.addToSet(keySet, videoId.toString()),
+ this.increment(keyIncr)
+ ])
+ }
+
+ async getVideoViews (videoId: number, hour: number) {
+ const key = this.generateVideoViewKey(videoId, hour)
+
+ const valueString = await this.getValue(key)
+ return parseInt(valueString, 10)
+ }
+
+ async getVideosIdViewed (hour: number) {
+ const key = this.generateVideosViewKey(hour)
+
+ const stringIds = await this.getSet(key)
+ return stringIds.map(s => parseInt(s, 10))
+ }
+
+ deleteVideoViews (videoId: number, hour: number) {
+ const keySet = this.generateVideosViewKey(hour)
+ const keyIncr = this.generateVideoViewKey(videoId, hour)
+
+ return Promise.all([
+ this.deleteFromSet(keySet, videoId.toString()),
+ this.deleteKey(keyIncr)
+ ])
+ }
+
+ generateVideosViewKey (hour?: number) {
+ if (!hour) hour = new Date().getHours()
+
+ return `videos-view-h${hour}`
+ }
+
+ generateVideoViewKey (videoId: number, hour?: number) {
+ if (!hour) hour = new Date().getHours()
+
+ return `video-view-${videoId}-h${hour}`
+ }
+