From 0d370a85823fea007eb0416763d0ec26bd85956e Mon Sep 17 00:00:00 2001 From: wendryo sales Date: Wed, 23 Aug 2023 01:53:58 -0300 Subject: [PATCH] feat: fix caching, and adjust indexes mongo --- docker-compose.yml | 8 +-- package-lock.json | 99 ++++++++++++++++++++++++++++++++++++ package.json | 2 + src/app.module.ts | 9 +++- src/pessoa/pessoa.schema.ts | 7 +++ src/pessoa/pessoa.service.ts | 30 +++++++---- 6 files changed, 139 insertions(+), 16 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index f6c4584..3a14e22 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: resources: limits: cpus: '0.37' - memory: '0.7GB' + memory: '0.4GB' api02: build: ./ @@ -27,7 +27,7 @@ services: resources: limits: cpus: '0.37' - memory: '0.7GB' + memory: '0.4GB' nginx: image: nginx:latest @@ -48,7 +48,7 @@ services: image: mongo:latest hostname: db environment: - - MONGO_INITDB_DATABASE=elysia + - MONGO_INITDB_DATABASE=nestjs - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root command: mongod --quiet --logpath /dev/null @@ -70,7 +70,7 @@ services: resources: limits: cpus: '0.05' - memory: '0.15GB' + memory: '0.75GB' networks: default: diff --git a/package-lock.json b/package-lock.json index 9b94398..577d8b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,9 +17,11 @@ "@nestjs/platform-express": "^10.0.0", "bull": "^4.11.3", "cache-manager": "^5.2.3", + "cache-manager-redis-yet": "^4.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "mongoose": "^7.4.4", + "redis": "^4.6.7", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, @@ -1869,6 +1871,64 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", + "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", + "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3160,6 +3220,24 @@ "lru-cache": "^9.1.2" } }, + "node_modules/cache-manager-redis-yet": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/cache-manager-redis-yet/-/cache-manager-redis-yet-4.1.2.tgz", + "integrity": "sha512-pM2K1ZlOv8gQpE1Z5mcDrfLj5CsNKVRiYua/SZ12j7LEDgfDeFVntI6JSgIw0siFSR/9P/FpG30scI3frHwibA==", + "dependencies": { + "@redis/bloom": "^1.2.0", + "@redis/client": "^1.5.8", + "@redis/graph": "^1.1.0", + "@redis/json": "^1.0.4", + "@redis/search": "^1.1.3", + "@redis/time-series": "^1.0.4", + "cache-manager": "^5.2.2", + "redis": "^4.6.7" + }, + "engines": { + "node": ">= 16.17.0" + } + }, "node_modules/cache-manager/node_modules/lru-cache": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", @@ -4745,6 +4823,14 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7331,6 +7417,19 @@ "node": ">= 0.10" } }, + "node_modules/redis": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", + "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.8", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.3", + "@redis/time-series": "1.0.4" + } + }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", diff --git a/package.json b/package.json index f05eb26..c0cfb08 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,11 @@ "@nestjs/platform-express": "^10.0.0", "bull": "^4.11.3", "cache-manager": "^5.2.3", + "cache-manager-redis-yet": "^4.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "mongoose": "^7.4.4", + "redis": "^4.6.7", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, diff --git a/src/app.module.ts b/src/app.module.ts index 6e24b05..f8b023f 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,6 +2,8 @@ import { Module } from '@nestjs/common'; import { PessoaModule } from './pessoa/pessoa.module'; import { BullModule } from '@nestjs/bull'; import { CacheModule } from '@nestjs/cache-manager'; +import { redisStore } from 'cache-manager-redis-yet'; +import { RedisClientOptions } from 'redis'; @Module({ imports: [ @@ -12,7 +14,12 @@ import { CacheModule } from '@nestjs/cache-manager'; port: 6379, }, }), - CacheModule.register({ + CacheModule.register({ + store: redisStore, + socket: { + host: 'redis', + port: 6379, + }, isGlobal: true, }), ], diff --git a/src/pessoa/pessoa.schema.ts b/src/pessoa/pessoa.schema.ts index ff7cfec..51d0cb8 100644 --- a/src/pessoa/pessoa.schema.ts +++ b/src/pessoa/pessoa.schema.ts @@ -15,3 +15,10 @@ PessoaSchema.set('toJSON', { delete ret._id; }, }); + +PessoaSchema.index({ nome: 'text', apelido: 'text', stack: 'text' }); +PessoaSchema.index({ + nome: 'ascending', + apelido: 'ascending', + stack: 'ascending', +}); diff --git a/src/pessoa/pessoa.service.ts b/src/pessoa/pessoa.service.ts index a438945..d82f0fb 100644 --- a/src/pessoa/pessoa.service.ts +++ b/src/pessoa/pessoa.service.ts @@ -26,35 +26,43 @@ export class PessoaService { throw new UnprocessableEntityException('Apelido já existe'); } - await this.cacheManager.set(body.apelido, '1'); + await this.cacheManager.set(body.apelido, '1', 0); + await this.cacheManager.set(body.id, JSON.stringify(body), 0); await this.pessoaQueue.add('createPerson', body); return; } - getPersons(t: string) { - return this.pessoaModel + async getPersons(t: string) { + const cached = await this.cacheManager.get(t); + if (cached) { + await this.cacheManager.del(t); + return JSON.parse(cached as string); + } + const persons = await this.pessoaModel .find({ $or: [ { nome: { $regex: t, $options: 'i' } }, { apelido: { $regex: t, $options: 'i' } }, - { stack: { $regex: t, $options: 'i' } }, + { stack: t }, ], }) .limit(50) .exec(); + await this.cacheManager.set(t, JSON.stringify(persons), 0); + return persons; } async getPerson(id: string) { - // const cached = await this.cacheManager.get(id); - // if (!cached) { - // throw new NotFoundException(); - // } - // return JSON.parse(cached); - // - const person = await this.pessoaModel.findById(id).exec(); + const cached = await this.cacheManager.get(id); + if (cached) { + await this.cacheManager.del(id); + return JSON.parse(cached as string); + } + const person = await this.pessoaModel.findOne({ _id: id }).exec(); if (!person) { throw new NotFoundException(); } + await this.cacheManager.set(id, JSON.stringify(person)); return person; }