1 module hunt.cache.manger; 2 import hunt.cache.ucache; 3 4 class CacheManger 5 { 6 UCache createCache( string cacheName , string driverName = "memory" ,string args = "" , bool enableL2Cache = false) 7 { 8 synchronized(this) 9 { 10 if(getCache(cacheName)){ 11 return null; 12 } 13 14 auto ucache = UCache.CreateUCache(driverName , args , enableL2Cache); 15 _mapCaches[cacheName] = ucache; 16 return ucache; 17 } 18 } 19 20 string[] getAllCacheNames() 21 { 22 synchronized(this){ 23 return _mapCaches.keys; 24 } 25 } 26 27 UCache getCache(string cacheName) 28 { 29 synchronized(this){ 30 UCache *ucache = cacheName in _mapCaches; 31 if(ucache == null) 32 return null; 33 else 34 return *ucache; 35 } 36 } 37 38 void destroyCache(string cacheName) 39 { 40 synchronized(this){ 41 _mapCaches.remove(cacheName); 42 } 43 } 44 45 private: 46 UCache[string] _mapCaches; 47 } 48 49 50 // unittest{ 51 52 // import core.thread; 53 // import std.algorithm; 54 // import std.stdio; 55 56 57 // CacheManger manger = new CacheManger(); 58 59 // //test manger. 60 // string[] allkeys = ["memory" , "memory_l2"]; 61 62 // auto memory = manger.createCache(allkeys[0]); 63 // auto memory_l2 = manger.createCache(allkeys[1] , "memory" , "" , true); 64 65 // version(WITH_HUNT_REDIS) 66 // { 67 // allkeys ~= ["redis" ,"redis_l2"]; 68 69 // auto redis = manger.createCache(allkeys[$ - 2] , "redis" , "127.0.0.1:6379"); 70 // auto redis_l2 = manger.createCache(allkeys[$ - 1] , "redis" , "127.0.0.1:6379" , true); 71 // } 72 73 // version(WITH_HUNT_MEMCACHE) 74 // { 75 // allkeys ~= ["memcached" , "memcached_l2"]; 76 // auto memcached = manger.createCache(allkeys[$ - 2] , "memcached" , "--SERVER=127.0.0.1:11211" ); 77 // auto memcached_l2 = manger.createCache(allkeys[$ -1] , "memcached" , "--SERVER=127.0.0.1:11211" , true); 78 // } 79 80 // version(WITH_HUNT_ROCKSDB) 81 // { 82 // allkeys ~= ["rocksdb" , "rocksdb_l2"]; 83 // auto rocksdb = manger.createCache(allkeys[$ - 2] , "rocksdb" , "/tmp/test1"); 84 // auto rocksdb_l2 = manger.createCache(allkeys[$ -1] , "rocksdb" , "/tmp/test2" , true); 85 // } 86 87 88 // auto names = manger.getAllCacheNames(); 89 // names.sort; 90 // allkeys.sort; 91 // assert(allkeys.length == names.length); 92 93 // void test(UCache cache) 94 // { 95 // cache.put("key1" ,"value1" , 1); 96 // string[string] map = ["key2":"value2" , "key3":"value3"]; 97 // cache.putAll(map); 98 99 // string value = cache.get("key1"); 100 // assert(value == "value1"); 101 // assert(cache.containsKey("key2")); 102 // assert(!cache.putifAbsent("key1" , "value11")); 103 // auto kvs = cache.getall(["key2" , "key3"]); 104 // foreach(k,v ; kvs) 105 // { 106 // assert(map[k] == v.origin); 107 // } 108 109 // assert(cache.remove("key2")); 110 // assert(!cache.containsKey("key2")); 111 // Thread.sleep(dur!"seconds"(2)); 112 // assert(!cache.containsKey("key1")); 113 // assert(cache.putifAbsent("key1" , "value11")); 114 // cache.clear(); 115 // assert(!cache.containsKey("key3")); 116 // } 117 118 // foreach(k ; allkeys) 119 // { 120 // import std.stdio; 121 // writeln("test " ,k); 122 123 // test(manger.getCache(k)); 124 // } 125 126 // foreach(k ; allkeys) 127 // manger.destroyCache(k); 128 129 // assert(manger.getAllCacheNames().length == 0); 130 131 // }