1 module hunt.framework.provider.RedisServiceProvider; 2 3 import hunt.framework.provider.ServiceProvider; 4 import hunt.framework.config.ApplicationConfig; 5 6 import hunt.collection.HashSet; 7 import hunt.collection.Set; 8 import hunt.logging.ConsoleLogger; 9 import hunt.redis; 10 import poodinis; 11 12 import std.conv; 13 import std.string; 14 15 /** 16 * 17 */ 18 class RedisServiceProvider : ServiceProvider { 19 20 override void register() { 21 // container.register!(RedisPoolConfig)().singleInstance(); 22 23 container.register!(RedisPool)(() { 24 ApplicationConfig config = container.resolve!ApplicationConfig(); 25 26 auto redisOptions = config.redis; 27 auto redisPoolOptions = redisOptions.pool; 28 29 if (redisOptions.enabled) { 30 RedisPoolConfig poolConfig = new RedisPoolConfig(); 31 poolConfig.host = redisOptions.host; 32 poolConfig.port = cast(int) redisOptions.port; 33 poolConfig.password = redisOptions.password; 34 poolConfig.database = cast(int) redisOptions.database; 35 poolConfig.soTimeout = cast(int) redisPoolOptions.idleTimeout; 36 poolConfig.connectionTimeout = redisOptions.timeout; 37 poolConfig.setMaxTotal(redisPoolOptions.maxPoolSize); 38 poolConfig.setBlockWhenExhausted(redisPoolOptions.blockOnExhausted); 39 poolConfig.setMaxWaitMillis(redisPoolOptions.waitTimeout); 40 41 infof("Initializing RedisPool: %s", poolConfig.toString()); 42 43 return new RedisPool(poolConfig); 44 } else { 45 // warning("RedisPool has been disabled."); 46 // return new RedisPool(); 47 throw new Exception("The Redis is disabled."); 48 } 49 }).singleInstance(); 50 51 container.register!(RedisCluster)(() { 52 ApplicationConfig config = container.resolve!ApplicationConfig(); 53 54 auto redisOptions = config.redis; 55 auto redisPoolOptions = redisOptions.pool; 56 auto clusterOptions = config.redis.cluster; 57 58 if(clusterOptions.enabled) { 59 60 RedisPoolConfig poolConfig = new RedisPoolConfig(); 61 poolConfig.host = redisOptions.host; 62 poolConfig.port = cast(int) redisOptions.port; 63 poolConfig.password = redisOptions.password; 64 poolConfig.database = cast(int) redisOptions.database; 65 poolConfig.soTimeout = cast(int) redisOptions.timeout; 66 poolConfig.connectionTimeout = redisOptions.timeout; 67 poolConfig.setMaxTotal(redisPoolOptions.maxPoolSize); 68 poolConfig.setBlockWhenExhausted(redisPoolOptions.blockOnExhausted); 69 poolConfig.setMaxWaitMillis(redisPoolOptions.waitTimeout); 70 71 infof("Initializing RedisCluster: %s", poolConfig.toString()); 72 73 string[] hostPorts = clusterOptions.nodes; 74 Set!(HostAndPort) clusterNode = new HashSet!(HostAndPort)(); 75 foreach(string item; hostPorts) { 76 string[] hostPort = item.split(":"); 77 if(hostPort.length < 2) { 78 warningf("Wrong host and port: %s", item); 79 continue; 80 } 81 82 version(HUNT_DEBUG) { 83 tracef("Cluster host: %s", hostPort); 84 } 85 86 try { 87 int port = to!int(hostPort[1]); 88 clusterNode.add(new HostAndPort(hostPort[0], port)); 89 } catch(Exception ex) { 90 warning(ex); 91 } 92 } 93 94 RedisCluster jc = new RedisCluster(clusterNode, redisOptions.timeout, redisOptions.timeout, 95 clusterOptions.redirections, redisOptions.password, poolConfig); 96 97 return jc; 98 99 } else { 100 throw new Exception("The RedisCluster is disabled."); 101 } 102 103 // }).newInstance(); 104 }).singleInstance(); 105 } 106 }