@@ -11,12 +11,16 @@ import { InjectDataSource } from '@nestjs/typeorm';
1111import { Page } from '../page/page.entity' ;
1212import { Node } from '../node/node.entity' ;
1313import { Edge } from '../edge/edge.entity' ;
14+ import { Inject } from '@nestjs/common' ;
15+ import Redis from 'ioredis' ;
16+
17+ const REDIS_CLIENT_TOKEN = 'REDIS_CLIENT' ;
1418
1519@Injectable ( )
1620export class TasksService {
1721 private readonly logger = new Logger ( TasksService . name ) ;
1822 constructor (
19- private readonly redisService : RedisService ,
23+ @ Inject ( REDIS_CLIENT_TOKEN ) private readonly redisClient : Redis ,
2024 @InjectDataSource ( ) private readonly dataSource : DataSource ,
2125 ) { }
2226
@@ -25,9 +29,10 @@ export class TasksService {
2529 this . logger . log ( '스케줄러 시작' ) ;
2630 // 시작 시간
2731 const startTime = performance . now ( ) ;
28- const pageKeys = await this . redisService . getAllKeys ( 'page:*' ) ;
29- const nodeKeys = await this . redisService . getAllKeys ( 'node:*' ) ;
30- const edgeKeys = await this . redisService . getAllKeys ( 'edge:*' ) ;
32+
33+ const pageKeys = await this . redisClient . keys ( 'page:*' ) ;
34+ const nodeKeys = await this . redisClient . keys ( 'node:*' ) ;
35+ const edgeKeys = await this . redisClient . keys ( 'edge:*' ) ;
3136
3237 Promise . allSettled ( [
3338 ...pageKeys . map ( this . migratePage . bind ( this ) ) ,
@@ -51,7 +56,10 @@ export class TasksService {
5156 }
5257
5358 async migratePage ( key : string ) {
54- const redisData = ( await this . redisService . get ( key ) ) as RedisPage ;
59+ const data = await this . redisClient . hgetall ( key ) ;
60+ const redisData = Object . fromEntries (
61+ Object . entries ( data ) . map ( ( [ field , value ] ) => [ field , value ] ) ,
62+ ) as RedisPage ;
5563 // 데이터 없으면 오류
5664 if ( ! redisData ) {
5765 throw new Error ( `redis에 ${ key } 에 해당하는 데이터가 없습니다.` ) ;
@@ -71,6 +79,7 @@ export class TasksService {
7179
7280 // 트랜잭션 시작
7381 const queryRunner = this . dataSource . createQueryRunner ( ) ;
82+ const redisRunner = this . redisClient . multi ( ) ;
7483 try {
7584 await queryRunner . startTransaction ( ) ;
7685
@@ -81,20 +90,16 @@ export class TasksService {
8190 await pageRepository . update ( pageId , updateData ) ;
8291
8392 // redis에서 데이터 삭제
84- await this . redisService . delete ( key ) ;
93+ redisRunner . del ( key ) ;
8594
8695 // 트랜잭션 커밋
8796 await queryRunner . commitTransaction ( ) ;
97+ await redisRunner . exec ( ) ;
8898 } catch ( err ) {
8999 // 실패하면 postgres는 roll back하고 redis의 값을 살린다.
90100 this . logger . error ( err . stack ) ;
91101 await queryRunner . rollbackTransaction ( ) ;
92- updateData . title &&
93- ( await this . redisService . setField ( key , 'title' , updateData . title ) ) ;
94- updateData . content &&
95- ( await this . redisService . setField ( key , 'content' , JSON . parse ( content ) ) ) ;
96- updateData . emoji &&
97- ( await this . redisService . setField ( key , 'emoji' , updateData . emoji ) ) ;
102+ redisRunner . discard ( ) ;
98103
99104 // Promise.all에서 실패를 인식하기 위해 에러를 던진다.
100105 throw err ;
@@ -105,9 +110,10 @@ export class TasksService {
105110 }
106111
107112 async migrateNode ( key : string ) {
108- const redisData = ( await this . redisService . get (
109- key ,
110- ) ) as unknown as RedisNode ;
113+ const data = await this . redisClient . hgetall ( key ) ;
114+ const redisData = Object . fromEntries (
115+ Object . entries ( data ) . map ( ( [ field , value ] ) => [ field , value ] ) ,
116+ ) as RedisNode ;
111117 // 데이터 없으면 오류
112118 if ( ! redisData ) {
113119 throw new Error ( `redis에 ${ key } 에 해당하는 데이터가 없습니다.` ) ;
@@ -126,6 +132,7 @@ export class TasksService {
126132
127133 // 트랜잭션 시작
128134 const queryRunner = this . dataSource . createQueryRunner ( ) ;
135+ const redisRunner = this . redisClient . multi ( ) ;
129136 try {
130137 await queryRunner . startTransaction ( ) ;
131138
@@ -136,20 +143,16 @@ export class TasksService {
136143 await nodeRepository . update ( nodeId , updateData ) ;
137144
138145 // redis에서 데이터 삭제
139- await this . redisService . delete ( key ) ;
146+ redisRunner . del ( key ) ;
140147
141148 // 트랜잭션 커밋
142149 await queryRunner . commitTransaction ( ) ;
150+ await redisRunner . exec ( ) ;
143151 } catch ( err ) {
144152 // 실패하면 postgres는 roll back하고 redis의 값을 살린다.
145153 this . logger . error ( err . stack ) ;
146154 await queryRunner . rollbackTransaction ( ) ;
147- updateData . x &&
148- ( await this . redisService . setField ( key , 'x' , updateData . x . toString ( ) ) ) ;
149- updateData . y &&
150- ( await this . redisService . setField ( key , 'y' , updateData . y . toString ( ) ) ) ;
151- updateData . color &&
152- ( await this . redisService . setField ( key , 'color' , updateData . color ) ) ;
155+ redisRunner . discard ( ) ;
153156
154157 // Promise.all에서 실패를 인식하기 위해 에러를 던진다.
155158 throw err ;
@@ -160,16 +163,20 @@ export class TasksService {
160163 }
161164
162165 async migrateEdge ( key : string ) {
163- const redisData = ( await this . redisService . get (
164- key ,
165- ) ) as unknown as RedisEdge ;
166+ const data = await this . redisClient . hgetall ( key ) ;
167+ const redisData = Object . fromEntries (
168+ Object . entries ( data ) . map ( ( [ field , value ] ) => [ field , value ] ) ,
169+ ) as RedisEdge ;
170+
166171 // 데이터 없으면 오류
167172 if ( ! redisData ) {
168173 throw new Error ( `redis에 ${ key } 에 해당하는 데이터가 없습니다.` ) ;
169174 }
170175
171176 // 트랜잭션 시작
172177 const queryRunner = this . dataSource . createQueryRunner ( ) ;
178+ const redisRunner = this . redisClient . multi ( ) ;
179+
173180 try {
174181 await queryRunner . startTransaction ( ) ;
175182
@@ -194,34 +201,28 @@ export class TasksService {
194201 } ) ;
195202 }
196203
197- if ( redisData . type === 'delete' ) {
198- const edge = await edgeRepository . findOne ( {
199- where : { fromNode, toNode } ,
200- } ) ;
204+ // if (redisData.type === 'delete') {
205+ // const edge = await edgeRepository.findOne({
206+ // where: { fromNode, toNode },
207+ // });
208+ // console.log(`edge 정보 `);
209+ // console.log(edge);
210+ // console.log(`edge content : ${edge}`);
201211
202- await edgeRepository . delete ( { id : edge . id } ) ;
203- }
212+ // await edgeRepository.delete({ id: edge.id });
213+ // }
204214
205215 // redis에서 데이터 삭제
206- await this . redisService . delete ( key ) ;
216+ redisRunner . del ( key ) ;
207217
208218 // 트랜잭션 커밋
209219 await queryRunner . commitTransaction ( ) ;
220+ await redisRunner . exec ( ) ;
210221 } catch ( err ) {
211222 // 실패하면 postgres는 roll back하고 redis의 값을 살린다.
212223 this . logger . error ( err . stack ) ;
213224 await queryRunner . rollbackTransaction ( ) ;
214- await this . redisService . setField (
215- key ,
216- 'fromNode' ,
217- redisData . fromNode . toString ( ) ,
218- ) ;
219- await this . redisService . setField (
220- key ,
221- 'toNode' ,
222- redisData . toNode . toString ( ) ,
223- ) ;
224- await this . redisService . setField ( key , 'type' , redisData . type ) ;
225+ redisRunner . discard ( ) ;
225226
226227 // Promise.all에서 실패를 인식하기 위해 에러를 던진다.
227228 throw err ;
0 commit comments