summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-10-08 07:51:10 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-10-08 07:51:10 +0900
commit7cd9a90f2677681bc697148db41a8270baf6346d (patch)
tree9588721819fae78b77c2322dcfa927700fe29e56 /packages/backend/src
parentfix of 8c684d5391 (diff)
downloadmisskey-7cd9a90f2677681bc697148db41a8270baf6346d.tar.gz
misskey-7cd9a90f2677681bc697148db41a8270baf6346d.tar.bz2
misskey-7cd9a90f2677681bc697148db41a8270baf6346d.zip
perf(backend): use HyperLogLog instead of Set to improve hashtag chart performance
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/core/HashtagService.ts9
1 files changed, 4 insertions, 5 deletions
diff --git a/packages/backend/src/core/HashtagService.ts b/packages/backend/src/core/HashtagService.ts
index 1a06767da8..ddff28359a 100644
--- a/packages/backend/src/core/HashtagService.ts
+++ b/packages/backend/src/core/HashtagService.ts
@@ -174,16 +174,15 @@ export class HashtagService {
const redisPipeline = this.redisClient.pipeline();
- // TODO: これらの Set は Bloom Filter を使うようにしても良さそう
-
// チャート用
- redisPipeline.sadd(`hashtagUsers:${hashtag}:${window}`, userId);
+ redisPipeline.pfadd(`hashtagUsers:${hashtag}:${window}`, userId);
redisPipeline.expire(`hashtagUsers:${hashtag}:${window}`,
60 * 60 * 24 * 3, // 3日間
'NX', // "NX -- Set expiry only when the key has no expiry" = 有効期限がないときだけ設定
);
// ユニークカウント用
+ // TODO: Bloom Filter を使うようにしても良さそう
redisPipeline.sadd(`hashtagUsers:${hashtag}`, userId);
redisPipeline.expire(`hashtagUsers:${hashtag}`,
60 * 60, // 1時間
@@ -202,7 +201,7 @@ export class HashtagService {
for (let i = 0; i < range; i++) {
const window = `${now.getUTCFullYear()}${(now.getUTCMonth() + 1).toString().padStart(2, '0')}${now.getUTCDate().toString().padStart(2, '0')}${now.getUTCHours().toString().padStart(2, '0')}${now.getUTCMinutes().toString().padStart(2, '0')}`;
- redisPipeline.scard(`hashtagUsers:${hashtag}:${window}`);
+ redisPipeline.pfcount(`hashtagUsers:${hashtag}:${window}`);
now.setMinutes(now.getMinutes() - (i * 10), 0, 0);
}
@@ -223,7 +222,7 @@ export class HashtagService {
for (let i = 0; i < range; i++) {
const window = `${now.getUTCFullYear()}${(now.getUTCMonth() + 1).toString().padStart(2, '0')}${now.getUTCDate().toString().padStart(2, '0')}${now.getUTCHours().toString().padStart(2, '0')}${now.getUTCMinutes().toString().padStart(2, '0')}`;
for (const hashtag of hashtags) {
- redisPipeline.scard(`hashtagUsers:${hashtag}:${window}`);
+ redisPipeline.pfcount(`hashtagUsers:${hashtag}:${window}`);
}
now.setMinutes(now.getMinutes() - (i * 10), 0, 0);
}