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