1212using  GeneXus . Utils ; 
1313using  StackExchange . Redis ; 
1414using  StackExchange . Redis . KeyspaceIsolation ; 
15+ using  GeneXus . Configuration ; 
1516
1617namespace  GeneXus . Cache 
1718{ 
@@ -24,9 +25,11 @@ public sealed class Redis : ICacheService2
2425#if NETCORE 
2526		bool  _multitenant ; 
2627		MemoryCache  _localCache ; 
27- 		private  const  double  DEFAULT_LOCAL_CACHE_FACTOR  =  0.8 ; 
28- 		private  static   readonly  TimeSpan  LOCAL_CACHE_PERSISTENT_KEY_TTL  =  TimeSpan . FromMinutes ( 5 ) ; 
29- 	
28+ 		private  const  double  DEFAULT_LOCAL_CACHE_FACTOR  =  0.2 ; 
29+ 		private  TimeSpan  MAX_LOCAL_CACHE_TTL ; 
30+ 		private  long  MAX_LOCAL_CACHE_TTL_TICKS ; 
31+ 		private  const  int  MAX_LOCAL_CACHE_TTL_DEFAULT_MIMUTES  =  5 ; 
32+ 
3033#endif
3134		ConfigurationOptions  _redisConnectionOptions ; 
3235		private  const  int  REDIS_DEFAULT_PORT  =  6379 ; 
@@ -90,6 +93,18 @@ private void InitLocalCache(GXService providerService)
9093			{ 
9194				GXLogging . Debug ( log ,  "Using Redis Hybrid mode with local memory cache." ) ; 
9295				_localCache  =  new  MemoryCache ( new  MemoryCacheOptions ( ) ) ; 
96+ 				if  ( Config . GetValueOrEnvironmentVarOf ( "MAX_LOCAL_CACHE_TTL" ,  out  string  maxCacheTtlMinutesStr )  &&  long . TryParse ( maxCacheTtlMinutesStr ,  out  long  maxCacheTtlMinutes ) ) 
97+ 				{ 
98+ 					MAX_LOCAL_CACHE_TTL  =  TimeSpan . FromMinutes ( maxCacheTtlMinutes ) ; 
99+ 					GXLogging . Debug ( log ,  $ "MAX_LOCAL_CACHE_TTL read from config: { MAX_LOCAL_CACHE_TTL } ") ; 
100+ 				} 
101+ 				else 
102+ 				{ 
103+ 					MAX_LOCAL_CACHE_TTL  =  TimeSpan . FromMinutes ( MAX_LOCAL_CACHE_TTL_DEFAULT_MIMUTES ) ; 
104+ 					GXLogging . Debug ( log ,  $ "MAX_LOCAL_CACHE_TTL using default value: { MAX_LOCAL_CACHE_TTL } ") ; 
105+ 				} 
106+ 
107+ 				MAX_LOCAL_CACHE_TTL_TICKS  =  MAX_LOCAL_CACHE_TTL . Ticks ; 
93108			} 
94109			else 
95110			{ 
@@ -419,7 +434,13 @@ private TimeSpan LocalCacheTTL(int durationMinutes)
419434		} 
420435		private  TimeSpan  LocalCacheTTL ( TimeSpan ?  ttl ) 
421436		{ 
422- 			return  ttl . HasValue  ?  TimeSpan . FromTicks ( ( long ) ( ttl . Value . Ticks  *  DEFAULT_LOCAL_CACHE_FACTOR ) )  :  LOCAL_CACHE_PERSISTENT_KEY_TTL ; 
437+ 			if  ( ttl . HasValue ) 
438+ 			{ 
439+ 				double  ttlTicks  =  ttl . Value . Ticks  *  DEFAULT_LOCAL_CACHE_FACTOR ; 
440+ 				if  ( ttlTicks  <  MAX_LOCAL_CACHE_TTL_TICKS ) 
441+ 					return  ttl . Value ; 
442+ 			} 
443+ 			return  MAX_LOCAL_CACHE_TTL ; 
423444		} 
424445#endif
425446		private  void  ClearKeyLocal ( string  key ) 
@@ -463,7 +484,7 @@ private void SetLocal<T>(string key, T value)
463484		private  void  SetPersistentLocal ( string  cacheid ,  long ?  prefix ) 
464485		{ 
465486#if NETCORE 
466- 			_localCache ? . Set ( cacheid ,  prefix ,  LocalCacheTTL ( LOCAL_CACHE_PERSISTENT_KEY_TTL ) ) ; 
487+ 			_localCache ? . Set ( cacheid ,  prefix ,  LocalCacheTTL ( MAX_LOCAL_CACHE_TTL ) ) ; 
467488#endif
468489		} 
469490		private  void  SetLocal < T > ( string  key ,  T  value ,  int  duration ) 
0 commit comments