@@ -815,7 +815,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
815815 public async getTablesFromDB ( ) : Promise < Array < TableDS > > {
816816 const redisClient = await this . getClient ( ) ;
817817
818- const allKeys = await redisClient . keys ( '*' ) ;
818+ const allKeys = await this . getAllKeysWithTimeout ( redisClient ) ;
819819 const prefixedTableNames = new Set < string > ( ) ;
820820 const standaloneKeys : Array < { key : string ; type : string } > = [ ] ;
821821
@@ -833,7 +833,7 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
833833 continue ;
834834 }
835835 }
836- }
836+ }
837837
838838 const tables : Array < TableDS > = [ ] ;
839839
@@ -1634,4 +1634,37 @@ export class DataAccessObjectRedis extends BasicDataAccessObject implements IDat
16341634 }
16351635 } ) ;
16361636 }
1637+
1638+ private async getAllKeysWithScan ( redisClient : RedisClientType , pattern : string = '*' ) : Promise < string [ ] > {
1639+ const allKeys : string [ ] = [ ] ;
1640+ const scanOptions = { MATCH : pattern , COUNT : 1000 } ;
1641+ let cursor = '0' ;
1642+
1643+ do {
1644+ const result = await redisClient . scan ( cursor , scanOptions ) ;
1645+ cursor = result . cursor . toString ( ) ;
1646+ allKeys . push ( ...result . keys ) ;
1647+ } while ( cursor !== '0' ) ;
1648+
1649+ return allKeys ;
1650+ }
1651+
1652+ private async getAllKeysWithTimeout (
1653+ redisClient : RedisClientType ,
1654+ timeoutMs : number = 5000 ,
1655+ ) : Promise < string [ ] > {
1656+ const keysPromise = redisClient . keys ( '*' ) ;
1657+
1658+ const timeoutPromise = new Promise < null > ( ( resolve ) => {
1659+ setTimeout ( ( ) => resolve ( null ) , timeoutMs ) ;
1660+ } ) ;
1661+
1662+ const result = await Promise . race ( [ keysPromise , timeoutPromise ] ) ;
1663+
1664+ if ( result === null ) {
1665+ return this . getAllKeysWithScan ( redisClient ) ;
1666+ }
1667+
1668+ return result ;
1669+ }
16371670}
0 commit comments