From 6b6168606bc86430f6b7821c9d5f1c80d0425ebf Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 29 Aug 2018 16:26:25 +0200 Subject: Bufferize videos views in redis --- server/lib/redis.ts | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 86 insertions(+), 2 deletions(-) (limited to 'server/lib/redis.ts') diff --git a/server/lib/redis.ts b/server/lib/redis.ts index 941f7d557..0b4b41e4e 100644 --- a/server/lib/redis.ts +++ b/server/lib/redis.ts @@ -60,11 +60,11 @@ class Redis { return this.getValue(this.generateResetPasswordKey(userId)) } - setView (ip: string, videoUUID: string) { + setIPVideoView (ip: string, videoUUID: string) { return this.setValue(this.buildViewKey(ip, videoUUID), '1', VIDEO_VIEW_LIFETIME) } - async isViewExists (ip: string, videoUUID: string) { + async isVideoIPViewExists (ip: string, videoUUID: string) { return this.exists(this.buildViewKey(ip, videoUUID)) } @@ -85,6 +85,52 @@ class Redis { return this.setObject(this.buildCachedRouteKey(req), cached, lifetime) } + 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}` + } + generateResetPasswordKey (userId: number) { return 'reset-password-' + userId } @@ -107,6 +153,34 @@ class Redis { }) } + private getSet (key: string) { + return new Promise((res, rej) => { + this.client.smembers(this.prefix + key, (err, value) => { + if (err) return rej(err) + + return res(value) + }) + }) + } + + private addToSet (key: string, value: string) { + return new Promise((res, rej) => { + this.client.sadd(this.prefix + key, value, err => err ? rej(err) : res()) + }) + } + + private deleteFromSet (key: string, value: string) { + return new Promise((res, rej) => { + this.client.srem(this.prefix + key, value, err => err ? rej(err) : res()) + }) + } + + private deleteKey (key: string) { + return new Promise((res, rej) => { + this.client.del(this.prefix + key, err => err ? rej(err) : res()) + }) + } + private setValue (key: string, value: string, expirationMilliseconds: number) { return new Promise((res, rej) => { this.client.set(this.prefix + key, value, 'PX', expirationMilliseconds, (err, ok) => { @@ -145,6 +219,16 @@ class Redis { }) } + private increment (key: string) { + return new Promise((res, rej) => { + this.client.incr(this.prefix + key, (err, value) => { + if (err) return rej(err) + + return res(value) + }) + }) + } + private exists (key: string) { return new Promise((res, rej) => { this.client.exists(this.prefix + key, (err, existsNumber) => { -- cgit v1.2.3