1 module hunt.framework.provider.CacheServiceProvider;
2 
3 import hunt.framework.provider.ServiceProvider;
4 import hunt.framework.config.ApplicationConfig;
5 
6 import hunt.cache.CacheFactory;
7 import hunt.cache.Cache;
8 import hunt.cache.CacheOptions;
9 import hunt.cache.Defined;
10 import hunt.logging.ConsoleLogger;
11 import hunt.redis.RedisPoolConfig;
12 
13 import hunt.framework.Init;
14 
15 import poodinis;
16 
17 /**
18  * 
19  */
20 class CacheServiceProvider : ServiceProvider {
21 
22     override void register() {
23         container.register!(Cache)(() {
24             ApplicationConfig config = container.resolve!ApplicationConfig();
25             ApplicationConfig.CacheConf cacheConf = config.cache;
26             ApplicationConfig.RedisConf redisConf = config.redis;
27             auto redisPoolOptions = redisConf.pool;
28 
29             CacheOptions options = new CacheOptions();
30             options.adapter = cacheConf.adapter;
31             options.prefix = cacheConf.prefix;
32             options.useSecondLevelCache = cacheConf.useSecondLevelCache;
33             options.maxEntriesLocalHeap = cacheConf.maxEntriesLocalHeap;
34             options.eternal = cacheConf.eternal;
35             options.timeToIdleSeconds = cacheConf.timeToIdleSeconds;
36             options.timeToLiveSeconds = cacheConf.timeToLiveSeconds;
37             options.overflowToDisk = cacheConf.overflowToDisk;
38             options.diskPersistent = cacheConf.diskPersistent;
39             options.diskExpiryThreadIntervalSeconds = cacheConf.diskExpiryThreadIntervalSeconds;
40             options.maxEntriesLocalDisk = cacheConf.maxEntriesLocalDisk;
41 
42             if(cacheConf.adapter == AdapterType.REDIS || cacheConf.adapter == AdapterType.REDIS_CLUSTER) {
43 
44                 if(!redisConf.enabled) {
45                     throw new Exception("The Redis is disabled.");
46                 }
47 
48                 RedisPoolConfig poolConfig = new RedisPoolConfig();
49                 poolConfig.host = redisConf.host;
50                 poolConfig.port = cast(int) redisConf.port;
51                 poolConfig.password = redisConf.password;
52                 poolConfig.database = cast(int) redisConf.database;
53                 poolConfig.soTimeout = cast(int) redisPoolOptions.idleTimeout;
54                 poolConfig.connectionTimeout =  redisConf.timeout;
55                 poolConfig.setMaxTotal(redisPoolOptions.maxPoolSize);
56                 poolConfig.setBlockWhenExhausted(redisPoolOptions.blockOnExhausted);
57                 poolConfig.setMaxWaitMillis(redisPoolOptions.waitTimeout);
58 
59                 version(HUNT_DEBUG) infof("Initializing RedisPool: %s", poolConfig.toString());
60 
61                 options.redisPool = poolConfig;
62                 options.redisCluster.nodes = redisConf.cluster.nodes;
63             } 
64             
65             return CacheFactory.create(options);
66         }).singleInstance();
67     }
68 }