Skip to content

Commit ede7eb7

Browse files
committed
feat: redis service에 lock 적용
1 parent a9adb32 commit ede7eb7

File tree

4 files changed

+32
-10
lines changed

4 files changed

+32
-10
lines changed

apps/backend/src/page/page.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export class PageService {
6464

6565
async deletePage(id: number): Promise<void> {
6666
// 락을 획득할 때까지 기다린다.
67-
const lock = await this.redisLock.acquire([id.toString()], 1000);
67+
const lock = await this.redisLock.acquire([`user:${id.toString()}`], 1000);
6868
try {
6969
// 페이지를 삭제한다.
7070
const deleteResult = await this.pageRepository.delete(id);
@@ -81,7 +81,7 @@ export class PageService {
8181

8282
async updatePage(id: number, dto: UpdatePageDto): Promise<Page> {
8383
// 락을 획득할 때까지 기다린다.
84-
const lock = await this.redisLock.acquire(['user:' + id.toString()], 1000);
84+
const lock = await this.redisLock.acquire([`user:${id.toString()}`], 1000);
8585
try {
8686
// 갱신할 페이지를 조회한다.
8787
// 페이지를 조회한다.

apps/backend/src/red-lock/red-lock.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { Module } from '@nestjs/common';
1+
import { Module, forwardRef } from '@nestjs/common';
22
import Redis from 'ioredis';
33
import Redlock from 'redlock';
44
import { RedisModule } from '../redis/redis.module';
55
const RED_LOCK_TOKEN = 'RED_LOCK';
66
const REDIS_CLIENT_TOKEN = 'REDIS_CLIENT';
77

88
@Module({
9-
imports: [RedisModule],
9+
imports: [forwardRef(()=>RedisModule)],
1010
providers: [
1111
{
1212
provide: RED_LOCK_TOKEN,

apps/backend/src/redis/redis.module.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
import { Module } from '@nestjs/common';
1+
import { Module, forwardRef } from '@nestjs/common';
22
import { ConfigModule, ConfigService } from '@nestjs/config';
33
import { RedisService } from './redis.service';
44
import Redis from 'ioredis';
5+
import { RedLockModule } from '../red-lock/red-lock.module';
56

67
// 의존성 주입할 때 redis client를 식별할 토큰
78
const REDIS_CLIENT_TOKEN = 'REDIS_CLIENT';
89

910
@Module({
10-
imports: [ConfigModule], // ConfigModule 추가
11+
imports: [ConfigModule, forwardRef(() => RedLockModule)], // ConfigModule 추가
1112
providers: [
1213
RedisService,
1314
{

apps/backend/src/redis/redis.service.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { Injectable } from '@nestjs/common';
22
import { Inject } from '@nestjs/common';
33
import Redis from 'ioredis';
4+
import Redlock from 'redlock';
45
const REDIS_CLIENT_TOKEN = 'REDIS_CLIENT';
6+
const RED_LOCK_TOKEN = 'RED_LOCK';
57

68
type RedisPage = {
79
title?: string;
8-
content?: string
10+
content?: string;
911
};
1012
@Injectable()
1113
export class RedisService {
1214
// private readonly redisClient: Redis;
1315

1416
constructor(
1517
@Inject(REDIS_CLIENT_TOKEN) private readonly redisClient: Redis,
18+
@Inject(RED_LOCK_TOKEN) private readonly redisLock: Redlock,
1619
) {}
1720

1821
async getAllKeys(pattern) {
@@ -31,14 +34,32 @@ export class RedisService {
3134
}
3235

3336
async set(key: string, value: object) {
34-
return await this.redisClient.hset(key, Object.entries(value));
37+
// 락을 획득할 때까지 기다린다.
38+
const lock = await this.redisLock.acquire([`user:${key}`], 1000);
39+
try {
40+
await this.redisClient.hset(key, Object.entries(value));
41+
} finally {
42+
lock.release();
43+
}
3544
}
3645

3746
async setField(key: string, field: string, value: string) {
38-
return await this.redisClient.hset(key, field, value);
47+
// 락을 획득할 때까지 기다린다.
48+
const lock = await this.redisLock.acquire([`user:${key}`], 1000);
49+
try {
50+
return await this.redisClient.hset(key, field, value);
51+
} finally {
52+
lock.release();
53+
}
3954
}
4055

4156
async delete(key: string) {
42-
return await this.redisClient.del(key);
57+
// 락을 획득할 때까지 기다린다.
58+
const lock = await this.redisLock.acquire([`user:${key}`], 1000);
59+
try {
60+
return await this.redisClient.del(key);
61+
} finally {
62+
lock.release();
63+
}
4364
}
4465
}

0 commit comments

Comments
 (0)