1 /*
2  * Hunt - A redis client library for D programming language.
3  *
4  * Copyright (C) 2018-2019 HuntLabs
5  *
6  * Website: https://www.huntlabs.net/
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.redis.ShardedRedis;
13 
14 // import hunt.redis.BinaryRedis;
15 // import hunt.redis.BinaryRedisPubSub;
16 // import hunt.redis.BinaryShardedRedis;
17 // import hunt.redis.BitOP;
18 // import hunt.redis.BitPosParams;
19 // import hunt.redis.Client;
20 // import hunt.redis.ClusterReset;
21 // import hunt.redis.GeoCoordinate;
22 // import hunt.redis.GeoRadiusResponse;
23 // import hunt.redis.GeoUnit;
24 // import hunt.redis.HostAndPort;
25 // import hunt.redis.ListPosition;
26 // import hunt.redis.Module;
27 // import hunt.redis.Pipeline;
28 // import hunt.redis.Protocol;
29 // import hunt.redis.Redis;
30 // import hunt.redis.RedisMonitor;
31 // import hunt.redis.RedisPoolAbstract;
32 // import hunt.redis.RedisPubSub;
33 // import hunt.redis.RedisShardInfo;
34 // import hunt.redis.ScanParams;
35 // import hunt.redis.ScanResult;
36 // import hunt.redis.ShardedRedisPool;
37 // import hunt.redis.SortingParams;
38 // import hunt.redis.StreamEntry;
39 // import hunt.redis.StreamEntryID;
40 // import hunt.redis.StreamPendingEntry;
41 // import hunt.redis.Transaction;
42 // import hunt.redis.Tuple;
43 // import hunt.redis.ZParams;
44 
45 // import hunt.redis.commands.RedisCommands;
46 // import hunt.redis.Protocol;
47 // import hunt.redis.params.GeoRadiusParam;
48 // import hunt.redis.params.SetParams;
49 // import hunt.redis.params.ZAddParams;
50 // import hunt.redis.params.ZIncrByParams;
51 // import hunt.redis.util.Hashing;
52 
53 // import hunt.util.Common;
54 // import hunt.collection.List;
55 // import hunt.collection.Map;
56 // import hunt.collection.Set;
57 
58 // import hunt.Boolean;
59 // import hunt.Double;
60 // import hunt.Long;
61 
62 // import std.regex;
63 // alias Pattern = Regex!char;
64 
65 // class ShardedRedis : BinaryShardedRedis, RedisCommands, Closeable {
66 
67 //     protected ShardedRedisPool dataSource = null;
68 
69 //     this(List!(RedisShardInfo) shards) {
70 //         super(shards);
71 //     }
72 
73 //     this(List!(RedisShardInfo) shards, Hashing algo) {
74 //         super(shards, algo);
75 //     }
76 
77 //     this(List!(RedisShardInfo) shards, Pattern keyTagPattern) {
78 //         super(shards, keyTagPattern);
79 //     }
80 
81 //     this(List!(RedisShardInfo) shards, Hashing algo, Pattern keyTagPattern) {
82 //         super(shards, algo, keyTagPattern);
83 //     }
84 
85 //     override
86 //     string set(string key, string value) {
87 //         Redis j = getShard(key);
88 //         return j.set(key, value);
89 //     }
90 
91 //     override
92 //     string set(string key, string value, SetParams params) {
93 //         Redis j = getShard(key);
94 //         return j.set(key, value, params);
95 //     }
96 
97 //     override
98 //     string get(string key) {
99 //         Redis j = getShard(key);
100 //         return j.get(key);
101 //     }
102 
103 //     override
104 //     string echo(string string) {
105 //         Redis j = getShard(string);
106 //         return j.echo(string);
107 //     }
108 
109 //     override
110 //     bool exists(string key) {
111 //         Redis j = getShard(key);
112 //         return j.exists(key);
113 //     }
114 
115 //     override
116 //     string type(string key) {
117 //         Redis j = getShard(key);
118 //         return j.type(key);
119 //     }
120 
121 //     override
122 //     const(ubyte)[] dump(string key) {
123 //         Redis j = getShard(key);
124 //         return j.dump(key);
125 //     }
126 
127 //     override
128 //     string restore(string key, int ttl, const(ubyte)[] serializedValue) {
129 //         Redis j = getShard(key);
130 //         return j.restore(key, ttl, serializedValue);
131 //     }
132 
133 //     override
134 //     string restoreReplace(string key, int ttl, const(ubyte)[] serializedValue) {
135 //         Redis j = getShard(key);
136 //         return j.restoreReplace(key, ttl, serializedValue);
137 //     }
138 
139 //     override
140 //     Long expire(string key, int seconds) {
141 //         Redis j = getShard(key);
142 //         return j.expire(key, seconds);
143 //     }
144 
145 //     override
146 //     Long pexpire(string key, long milliseconds) {
147 //         Redis j = getShard(key);
148 //         return j.pexpire(key, milliseconds);
149 //     }
150 
151 //     override
152 //     Long expireAt(string key, long unixTime) {
153 //         Redis j = getShard(key);
154 //         return j.expireAt(key, unixTime);
155 //     }
156 
157 //     override
158 //     Long pexpireAt(string key, long millisecondsTimestamp) {
159 //         Redis j = getShard(key);
160 //         return j.pexpireAt(key, millisecondsTimestamp);
161 //     }
162 
163 //     override
164 //     Long ttl(string key) {
165 //         Redis j = getShard(key);
166 //         return j.ttl(key);
167 //     }
168 
169 //     override
170 //     Long pttl(string key) {
171 //         Redis j = getShard(key);
172 //         return j.pttl(key);
173 //     }
174 
175 //     override
176 //     bool setbit(string key, long offset, bool value) {
177 //         Redis j = getShard(key);
178 //         return j.setbit(key, offset, value);
179 //     }
180 
181 //     override
182 //     bool setbit(string key, long offset, string value) {
183 //         Redis j = getShard(key);
184 //         return j.setbit(key, offset, value);
185 //     }
186 
187 //     override
188 //     bool getbit(string key, long offset) {
189 //         Redis j = getShard(key);
190 //         return j.getbit(key, offset);
191 //     }
192 
193 //     // override
194 //     // long setrange(string key, long offset, string value) {
195 //     //     Redis j = getShard(key);
196 //     //     return j.setrange(key, offset, value);
197 //     // }
198 
199 //     // override
200 //     // string getrange(string key, long startOffset, long endOffset) {
201 //     //     Redis j = getShard(key);
202 //     //     return j.getrange(key, startOffset, endOffset);
203 //     // }
204 
205 //     // override
206 //     // string getSet(string key, string value) {
207 //     //     Redis j = getShard(key);
208 //     //     return j.getSet(key, value);
209 //     // }
210 
211 //     // override
212 //     // long setnx(string key, string value) {
213 //     //     Redis j = getShard(key);
214 //     //     return j.setnx(key, value);
215 //     // }
216 
217 //     // override
218 //     // string setex(string key, int seconds, string value) {
219 //     //     Redis j = getShard(key);
220 //     //     return j.setex(key, seconds, value);
221 //     // }
222 
223 //     // override
224 //     // string psetex(string key, long milliseconds, string value) {
225 //     //     Redis j = getShard(key);
226 //     //     return j.psetex(key, milliseconds, value);
227 //     // }
228 
229 //     // List!(string) blpop(string arg) {
230 //     //     Redis j = getShard(arg);
231 //     //     return j.blpop(arg);
232 //     // }
233 
234 //     // override
235 //     // List!(string) blpop(int timeout, string key) {
236 //     //     Redis j = getShard(key);
237 //     //     return j.blpop(timeout, key);
238 //     // }
239 
240 //     // List!(string) brpop(string arg) {
241 //     //     Redis j = getShard(arg);
242 //     //     return j.brpop(arg);
243 //     // }
244 
245 //     // override
246 //     // List!(string) brpop(int timeout, string key) {
247 //     //     Redis j = getShard(key);
248 //     //     return j.brpop(timeout, key);
249 //     // }
250 
251 //     // override
252 //     // long decrBy(string key, long decrement) {
253 //     //     Redis j = getShard(key);
254 //     //     return j.decrBy(key, decrement);
255 //     // }
256 
257 //     // override
258 //     // long decr(string key) {
259 //     //     Redis j = getShard(key);
260 //     //     return j.decr(key);
261 //     // }
262 
263 //     // override
264 //     // long incrBy(string key, long increment) {
265 //     //     Redis j = getShard(key);
266 //     //     return j.incrBy(key, increment);
267 //     // }
268 
269 //     // override
270 //     // Double incrByFloat(string key, double increment) {
271 //     //     Redis j = getShard(key);
272 //     //     return j.incrByFloat(key, increment);
273 //     // }
274 
275 //     // override
276 //     // long incr(string key) {
277 //     //     Redis j = getShard(key);
278 //     //     return j.incr(key);
279 //     // }
280 
281 //     // override
282 //     // long append(string key, string value) {
283 //     //     Redis j = getShard(key);
284 //     //     return j.append(key, value);
285 //     // }
286 
287 //     // override
288 //     // string substr(string key, int start, int end) {
289 //     //     Redis j = getShard(key);
290 //     //     return j.substr(key, start, end);
291 //     // }
292 
293 //     // override
294 //     // long hset(string key, string field, string value) {
295 //     //     Redis j = getShard(key);
296 //     //     return j.hset(key, field, value);
297 //     // }
298 
299 //     // override
300 //     // long hset(string key, Map!(string, string) hash) {
301 //     //     Redis j = getShard(key);
302 //     //     return j.hset(key, hash);
303 //     // }
304 
305 //     // override
306 //     // string hget(string key, string field) {
307 //     //     Redis j = getShard(key);
308 //     //     return j.hget(key, field);
309 //     // }
310 
311 //     // override
312 //     // long hsetnx(string key, string field, string value) {
313 //     //     Redis j = getShard(key);
314 //     //     return j.hsetnx(key, field, value);
315 //     // }
316 
317 //     // override
318 //     // string hmset(string key, Map!(string, string) hash) {
319 //     //     Redis j = getShard(key);
320 //     //     return j.hmset(key, hash);
321 //     // }
322 
323 //     // override
324 //     // List!(string) hmget(string key, string[] fields...) {
325 //     //     Redis j = getShard(key);
326 //     //     return j.hmget(key, fields);
327 //     // }
328 
329 //     // override
330 //     // long hincrBy(string key, string field, long value) {
331 //     //     Redis j = getShard(key);
332 //     //     return j.hincrBy(key, field, value);
333 //     // }
334 
335 //     // override
336 //     // Double hincrByFloat(string key, string field, double value) {
337 //     //     Redis j = getShard(key);
338 //     //     return j.hincrByFloat(key, field, value);
339 //     // }
340 
341 //     // override
342 //     // bool hexists(string key, string field) {
343 //     //     Redis j = getShard(key);
344 //     //     return j.hexists(key, field);
345 //     // }
346 
347 //     override
348 //     Long del(string key) {
349 //         Redis j = getShard(key);
350 //         return j.del(key);
351 //     }
352 
353 //     override
354 //     Long unlink(string key) {
355 //         Redis j = getShard(key);
356 //         return j.unlink(key);
357 //     }
358 
359 //     // override
360 //     // long hdel(string key, string[] fields...) {
361 //     //     Redis j = getShard(key);
362 //     //     return j.hdel(key, fields);
363 //     // }
364 
365 //     // override
366 //     // long hlen(string key) {
367 //     //     Redis j = getShard(key);
368 //     //     return j.hlen(key);
369 //     // }
370 
371 //     // override
372 //     // Set!(string) hkeys(string key) {
373 //     //     Redis j = getShard(key);
374 //     //     return j.hkeys(key);
375 //     // }
376 
377 //     // override
378 //     // List!(string) hvals(string key) {
379 //     //     Redis j = getShard(key);
380 //     //     return j.hvals(key);
381 //     // }
382 
383 //     // override
384 //     // Map!(string, string) hgetAll(string key) {
385 //     //     Redis j = getShard(key);
386 //     //     return j.hgetAll(key);
387 //     // }
388 
389 //     // override
390 //     // long rpush(string key, string[] strings...) {
391 //     //     Redis j = getShard(key);
392 //     //     return j.rpush(key, strings);
393 //     // }
394 
395 //     // override
396 //     // long lpush(string key, string[] strings...) {
397 //     //     Redis j = getShard(key);
398 //     //     return j.lpush(key, strings);
399 //     // }
400 
401 //     // override
402 //     // long lpushx(string key, string[] string...) {
403 //     //     Redis j = getShard(key);
404 //     //     return j.lpushx(key, string);
405 //     // }
406 
407 //     override
408 //     Long strlen(string key) {
409 //         Redis j = getShard(key);
410 //         return j.strlen(key);
411 //     }
412 
413 //     override
414 //     Long move(string key, int dbIndex) {
415 //         Redis j = getShard(key);
416 //         return j.move(key, dbIndex);
417 //     }
418 
419 //     // override
420 //     // long rpushx(string key, string[] string...) {
421 //     //     Redis j = getShard(key);
422 //     //     return j.rpushx(key, string);
423 //     // }
424 
425 //     override
426 //     Long persist(string key) {
427 //         Redis j = getShard(key);
428 //         return j.persist(key);
429 //     }
430 
431 //     // override
432 //     // long llen(string key) {
433 //     //     Redis j = getShard(key);
434 //     //     return j.llen(key);
435 //     // }
436 
437 //     // override
438 //     // List!(string) lrange(string key, long start, long stop) {
439 //     //     Redis j = getShard(key);
440 //     //     return j.lrange(key, start, stop);
441 //     // }
442 
443 //     // override
444 //     // string ltrim(string key, long start, long stop) {
445 //     //     Redis j = getShard(key);
446 //     //     return j.ltrim(key, start, stop);
447 //     // }
448 
449 //     // override
450 //     // string lindex(string key, long index) {
451 //     //     Redis j = getShard(key);
452 //     //     return j.lindex(key, index);
453 //     // }
454 
455 //     // override
456 //     // string lset(string key, long index, string value) {
457 //     //     Redis j = getShard(key);
458 //     //     return j.lset(key, index, value);
459 //     // }
460 
461 //     // override
462 //     // long lrem(string key, long count, string value) {
463 //     //     Redis j = getShard(key);
464 //     //     return j.lrem(key, count, value);
465 //     // }
466 
467 //     // override
468 //     // string lpop(string key) {
469 //     //     Redis j = getShard(key);
470 //     //     return j.lpop(key);
471 //     // }
472 
473 //     // override
474 //     // string rpop(string key) {
475 //     //     Redis j = getShard(key);
476 //     //     return j.rpop(key);
477 //     // }
478 
479 //     // override
480 //     // long sadd(string key, string[] members...) {
481 //     //     Redis j = getShard(key);
482 //     //     return j.sadd(key, members);
483 //     // }
484 
485 //     // override
486 //     // Set!(string) smembers(string key) {
487 //     //     Redis j = getShard(key);
488 //     //     return j.smembers(key);
489 //     // }
490 
491 //     // override
492 //     // long srem(string key, string[] members...) {
493 //     //     Redis j = getShard(key);
494 //     //     return j.srem(key, members);
495 //     // }
496 
497 //     // override
498 //     // string spop(string key) {
499 //     //     Redis j = getShard(key);
500 //     //     return j.spop(key);
501 //     // }
502 
503 //     // override
504 //     // Set!(string) spop(string key, long count) {
505 //     //     Redis j = getShard(key);
506 //     //     return j.spop(key, count);
507 //     // }
508 
509 //     // override
510 //     // long scard(string key) {
511 //     //     Redis j = getShard(key);
512 //     //     return j.scard(key);
513 //     // }
514 
515 //     // override
516 //     // bool sismember(string key, string member) {
517 //     //     Redis j = getShard(key);
518 //     //     return j.sismember(key, member);
519 //     // }
520 
521 //     // override
522 //     // string srandmember(string key) {
523 //     //     Redis j = getShard(key);
524 //     //     return j.srandmember(key);
525 //     // }
526 
527 //     // override
528 //     // List!(string) srandmember(string key, int count) {
529 //     //     Redis j = getShard(key);
530 //     //     return j.srandmember(key, count);
531 //     // }
532 
533 //     // override
534 //     // long zadd(string key, double score, string member) {
535 //     //     Redis j = getShard(key);
536 //     //     return j.zadd(key, score, member);
537 //     // }
538 
539 //     // override
540 //     // long zadd(string key, double score, string member, ZAddParams params) {
541 //     //     Redis j = getShard(key);
542 //     //     return j.zadd(key, score, member, params);
543 //     // }
544 
545 //     // override
546 //     // long zadd(string key, Map!(string, Double) scoreMembers) {
547 //     //     Redis j = getShard(key);
548 //     //     return j.zadd(key, scoreMembers);
549 //     // }
550 
551 //     // override
552 //     // long zadd(string key, Map!(string, Double) scoreMembers, ZAddParams params) {
553 //     //     Redis j = getShard(key);
554 //     //     return j.zadd(key, scoreMembers, params);
555 //     // }
556 
557 //     // override
558 //     // Set!(string) zrange(string key, long start, long stop) {
559 //     //     Redis j = getShard(key);
560 //     //     return j.zrange(key, start, stop);
561 //     // }
562 
563 //     // override
564 //     // long zrem(string key, string[] members...) {
565 //     //     Redis j = getShard(key);
566 //     //     return j.zrem(key, members);
567 //     // }
568 
569 //     // override
570 //     // Double zincrby(string key, double increment, string member) {
571 //     //     Redis j = getShard(key);
572 //     //     return j.zincrby(key, increment, member);
573 //     // }
574 
575 //     // override
576 //     // Double zincrby(string key, double increment, string member, ZIncrByParams params) {
577 //     //     Redis j = getShard(key);
578 //     //     return j.zincrby(key, increment, member, params);
579 //     // }
580 
581 //     // override
582 //     // long zrank(string key, string member) {
583 //     //     Redis j = getShard(key);
584 //     //     return j.zrank(key, member);
585 //     // }
586 
587 //     // override
588 //     // long zrevrank(string key, string member) {
589 //     //     Redis j = getShard(key);
590 //     //     return j.zrevrank(key, member);
591 //     // }
592 
593 //     // override
594 //     // Set!(string) zrevrange(string key, long start, long stop) {
595 //     //     Redis j = getShard(key);
596 //     //     return j.zrevrange(key, start, stop);
597 //     // }
598 
599 //     // override
600 //     // Set!(Tuple) zrangeWithScores(string key, long start, long stop) {
601 //     //     Redis j = getShard(key);
602 //     //     return j.zrangeWithScores(key, start, stop);
603 //     // }
604 
605 //     // override
606 //     // Set!(Tuple) zrevrangeWithScores(string key, long start, long stop) {
607 //     //     Redis j = getShard(key);
608 //     //     return j.zrevrangeWithScores(key, start, stop);
609 //     // }
610 
611 //     // override
612 //     // long zcard(string key) {
613 //     //     Redis j = getShard(key);
614 //     //     return j.zcard(key);
615 //     // }
616 
617 //     // override
618 //     // Double zscore(string key, string member) {
619 //     //     Redis j = getShard(key);
620 //     //     return j.zscore(key, member);
621 //     // }
622 
623 //     // override
624 //     // List!(string) sort(string key) {
625 //     //     Redis j = getShard(key);
626 //     //     return j.sort(key);
627 //     // }
628 
629 //     // override
630 //     // List!(string) sort(string key, SortingParams sortingParameters) {
631 //     //     Redis j = getShard(key);
632 //     //     return j.sort(key, sortingParameters);
633 //     // }
634 
635 //     // override
636 //     // long zcount(string key, double min, double max) {
637 //     //     Redis j = getShard(key);
638 //     //     return j.zcount(key, min, max);
639 //     // }
640 
641 //     // override
642 //     // long zcount(string key, string min, string max) {
643 //     //     Redis j = getShard(key);
644 //     //     return j.zcount(key, min, max);
645 //     // }
646 
647 //     // override
648 //     // Set!(string) zrangeByScore(string key, double min, double max) {
649 //     //     Redis j = getShard(key);
650 //     //     return j.zrangeByScore(key, min, max);
651 //     // }
652 
653 //     // override
654 //     // Set!(string) zrevrangeByScore(string key, double max, double min) {
655 //     //     Redis j = getShard(key);
656 //     //     return j.zrevrangeByScore(key, max, min);
657 //     // }
658 
659 //     // override
660 //     // Set!(string) zrangeByScore(string key, double min, double max, int offset, int count) {
661 //     //     Redis j = getShard(key);
662 //     //     return j.zrangeByScore(key, min, max, offset, count);
663 //     // }
664 
665 //     // override
666 //     // Set!(string) zrevrangeByScore(string key, double max, double min, int offset, int count) {
667 //     //     Redis j = getShard(key);
668 //     //     return j.zrevrangeByScore(key, max, min, offset, count);
669 //     // }
670 
671 //     // override
672 //     // Set!(Tuple) zrangeByScoreWithScores(string key, double min, double max) {
673 //     //     Redis j = getShard(key);
674 //     //     return j.zrangeByScoreWithScores(key, min, max);
675 //     // }
676 
677 //     // override
678 //     // Set!(Tuple) zrevrangeByScoreWithScores(string key, double max, double min) {
679 //     //     Redis j = getShard(key);
680 //     //     return j.zrevrangeByScoreWithScores(key, max, min);
681 //     // }
682 
683 //     // override
684 //     // Set!(Tuple) zrangeByScoreWithScores(string key, double min, double max, int offset,
685 //     //         int count) {
686 //     //     Redis j = getShard(key);
687 //     //     return j.zrangeByScoreWithScores(key, min, max, offset, count);
688 //     // }
689 
690 //     // override
691 //     // Set!(Tuple) zrevrangeByScoreWithScores(string key, double max, double min, int offset,
692 //     //         int count) {
693 //     //     Redis j = getShard(key);
694 //     //     return j.zrevrangeByScoreWithScores(key, max, min, offset, count);
695 //     // }
696 
697 //     // override
698 //     // Set!(string) zrangeByScore(string key, string min, string max) {
699 //     //     Redis j = getShard(key);
700 //     //     return j.zrangeByScore(key, min, max);
701 //     // }
702 
703 //     // override
704 //     // Set!(string) zrevrangeByScore(string key, string max, string min) {
705 //     //     Redis j = getShard(key);
706 //     //     return j.zrevrangeByScore(key, max, min);
707 //     // }
708 
709 //     // override
710 //     // Set!(string) zrangeByScore(string key, string min, string max, int offset, int count) {
711 //     //     Redis j = getShard(key);
712 //     //     return j.zrangeByScore(key, min, max, offset, count);
713 //     // }
714 
715 //     // override
716 //     // Set!(string) zrevrangeByScore(string key, string max, string min, int offset, int count) {
717 //     //     Redis j = getShard(key);
718 //     //     return j.zrevrangeByScore(key, max, min, offset, count);
719 //     // }
720 
721 //     // override
722 //     // Set!(Tuple) zrangeByScoreWithScores(string key, string min, string max) {
723 //     //     Redis j = getShard(key);
724 //     //     return j.zrangeByScoreWithScores(key, min, max);
725 //     // }
726 
727 //     // override
728 //     // Set!(Tuple) zrevrangeByScoreWithScores(string key, string max, string min) {
729 //     //     Redis j = getShard(key);
730 //     //     return j.zrevrangeByScoreWithScores(key, max, min);
731 //     // }
732 
733 //     // override
734 //     // Set!(Tuple) zrangeByScoreWithScores(string key, string min, string max, int offset,
735 //     //         int count) {
736 //     //     Redis j = getShard(key);
737 //     //     return j.zrangeByScoreWithScores(key, min, max, offset, count);
738 //     // }
739 
740 //     // override
741 //     // Set!(Tuple) zrevrangeByScoreWithScores(string key, string max, string min, int offset,
742 //     //         int count) {
743 //     //     Redis j = getShard(key);
744 //     //     return j.zrevrangeByScoreWithScores(key, max, min, offset, count);
745 //     // }
746 
747 //     // override
748 //     // long zremrangeByRank(string key, long start, long stop) {
749 //     //     Redis j = getShard(key);
750 //     //     return j.zremrangeByRank(key, start, stop);
751 //     // }
752 
753 //     // override
754 //     // long zremrangeByScore(string key, double min, double max) {
755 //     //     Redis j = getShard(key);
756 //     //     return j.zremrangeByScore(key, min, max);
757 //     // }
758 
759 //     // override
760 //     // long zremrangeByScore(string key, string min, string max) {
761 //     //     Redis j = getShard(key);
762 //     //     return j.zremrangeByScore(key, min, max);
763 //     // }
764 
765 //     // override
766 //     // long zlexcount(string key, string min, string max) {
767 //     //     return getShard(key).zlexcount(key, min, max);
768 //     // }
769 
770 //     // override
771 //     // Set!(string) zrangeByLex(string key, string min, string max) {
772 //     //     return getShard(key).zrangeByLex(key, min, max);
773 //     // }
774 
775 //     // override
776 //     // Set!(string) zrangeByLex(string key, string min, string max,
777 //     //         int offset, int count) {
778 //     //     return getShard(key).zrangeByLex(key, min, max, offset, count);
779 //     // }
780 
781 //     // override
782 //     // Set!(string) zrevrangeByLex(string key, string max, string min) {
783 //     //     return getShard(key).zrevrangeByLex(key, max, min);
784 //     // }
785 
786 //     // override
787 //     // Set!(string) zrevrangeByLex(string key, string max, string min, int offset, int count) {
788 //     //     return getShard(key).zrevrangeByLex(key, max, min, offset, count);
789 //     // }
790 
791 //     // override
792 //     // long zremrangeByLex(string key, string min, string max) {
793 //     //     return getShard(key).zremrangeByLex(key, min, max);
794 //     // }
795 
796 //     // override
797 //     // long linsert(string key, ListPosition where, string pivot, string value) {
798 //     //     Redis j = getShard(key);
799 //     //     return j.linsert(key, where, pivot, value);
800 //     // }
801 
802 //     override
803 //     Long bitcount(string key) {
804 //         Redis j = getShard(key);
805 //         return j.bitcount(key);
806 //     }
807 
808 //     override
809 //     Long bitcount(string key, long start, long end) {
810 //         Redis j = getShard(key);
811 //         return j.bitcount(key, start, end);
812 //     }
813 
814 //     // override
815 //     // long bitpos(string key, bool value) {
816 //     //     Redis j = getShard(key);
817 //     //     return j.bitpos(key, value);
818 //     // }
819 
820 //     // override
821 //     // long bitpos(string key, bool value, BitPosParams params) {
822 //     //     Redis j = getShard(key);
823 //     //     return j.bitpos(key, value, params);
824 //     // }
825 
826 //     // override
827 //     // ScanResult!(MapEntry!(string, string)) hscan(string key, string cursor) {
828 //     //     Redis j = getShard(key);
829 //     //     return j.hscan(key, cursor);
830 //     // }
831 
832 //     // override
833 //     // ScanResult!(MapEntry!(string, string)) hscan(string key, string cursor, ScanParams params) {
834 //     //     Redis j = getShard(key);
835 //     //     return j.hscan(key, cursor, params);
836 //     // }
837 
838 //     // override
839 //     // ScanResult!(string) sscan(string key, string cursor) {
840 //     //     Redis j = getShard(key);
841 //     //     return j.sscan(key, cursor);
842 //     // }
843 
844 //     // override
845 //     // ScanResult!(Tuple) zscan(string key, string cursor) {
846 //     //     Redis j = getShard(key);
847 //     //     return j.zscan(key, cursor);
848 //     // }
849 
850 //     // override
851 //     // ScanResult!(Tuple) zscan(string key, string cursor, ScanParams params) {
852 //     //     Redis j = getShard(key);
853 //     //     return j.zscan(key, cursor, params);
854 //     // }
855 
856 //     // override
857 //     // ScanResult!(string) sscan(string key, string cursor, ScanParams params) {
858 //     //     Redis j = getShard(key);
859 //     //     return j.sscan(key, cursor, params);
860 //     // }
861 
862 //     override
863 //     void close() {
864 //         if (dataSource !is null) {
865 //             bool broken = false;
866 
867 //             foreach(Redis jedis ; getAllShards()) {
868 //                 if (jedis.getClient().isBroken()) {
869 //                     broken = true;
870 //                     break;
871 //                 }
872 //             }
873 //             ShardedRedisPool pool = this.dataSource;
874 //             this.dataSource = null;
875 //             if (broken) {
876 //                 pool.returnBrokenResource(this);
877 //             } else {
878 //                 pool.returnResource(this);
879 //             }
880 
881 //         } else {
882 //             disconnect();
883 //         }
884 //     }
885 
886 //     void setDataSource(ShardedRedisPool shardedRedisPool) {
887 //         this.dataSource = shardedRedisPool;
888 //     }
889 
890 //     void resetState() {
891 //         foreach(Redis jedis ; getAllShards()) {
892 //             jedis.resetState();
893 //         }
894 //     }
895 
896 //     override
897 //     Long pfadd(string key, string[] elements...) {
898 //         Redis j = getShard(key);
899 //         return j.pfadd(key, elements);
900 //     }
901 
902 //     override
903 //     Long pfcount(string key) {
904 //         Redis j = getShard(key);
905 //         return j.pfcount(key);
906 //     }
907 
908 //     override
909 //     Long touch(string key) {
910 //         Redis j = getShard(key);
911 //         return j.touch(key);
912 //     }
913 
914 //     // override
915 //     // long geoadd(string key, double longitude, double latitude, string member) {
916 //     //     Redis j = getShard(key);
917 //     //     return j.geoadd(key, longitude, latitude, member);
918 //     // }
919 
920 //     // override
921 //     // long geoadd(string key, Map!(string, GeoCoordinate) memberCoordinateMap) {
922 //     //     Redis j = getShard(key);
923 //     //     return j.geoadd(key, memberCoordinateMap);
924 //     // }
925 
926 //     // override
927 //     // Double geodist(string key, string member1, string member2) {
928 //     //     Redis j = getShard(key);
929 //     //     return j.geodist(key, member1, member2);
930 //     // }
931 
932 //     // override
933 //     // Double geodist(string key, string member1, string member2, GeoUnit unit) {
934 //     //     Redis j = getShard(key);
935 //     //     return j.geodist(key, member1, member2, unit);
936 //     // }
937 
938 //     // override
939 //     // List!(string) geohash(string key, string[] members...) {
940 //     //     Redis j = getShard(key);
941 //     //     return j.geohash(key, members);
942 //     // }
943 
944 //     // override
945 //     // List!(GeoCoordinate) geopos(string key, string[] members...) {
946 //     //     Redis j = getShard(key);
947 //     //     return j.geopos(key, members);
948 //     // }
949 
950 //     // override
951 //     // List!(GeoRadiusResponse) georadius(string key, double longitude, double latitude,
952 //     //         double radius, GeoUnit unit) {
953 //     //     Redis j = getShard(key);
954 //     //     return j.georadius(key, longitude, latitude, radius, unit);
955 //     // }
956 
957 //     // override
958 //     // List!(GeoRadiusResponse) georadiusReadonly(string key, double longitude, double latitude,
959 //     //         double radius, GeoUnit unit) {
960 //     //     Redis j = getShard(key);
961 //     //     return j.georadiusReadonly(key, longitude, latitude, radius, unit);
962 //     // }
963 
964 //     // override
965 //     // List!(GeoRadiusResponse) georadius(string key, double longitude, double latitude,
966 //     //         double radius, GeoUnit unit, GeoRadiusParam param) {
967 //     //     Redis j = getShard(key);
968 //     //     return j.georadius(key, longitude, latitude, radius, unit, param);
969 //     // }
970 
971 //     // override
972 //     // List!(GeoRadiusResponse) georadiusReadonly(string key, double longitude, double latitude,
973 //     //         double radius, GeoUnit unit, GeoRadiusParam param) {
974 //     //     Redis j = getShard(key);
975 //     //     return j.georadiusReadonly(key, longitude, latitude, radius, unit, param);
976 //     // }
977 
978 //     // override
979 //     // List!(GeoRadiusResponse) georadiusByMember(string key, string member, double radius,
980 //     //         GeoUnit unit) {
981 //     //     Redis j = getShard(key);
982 //     //     return j.georadiusByMember(key, member, radius, unit);
983 //     // }
984 
985 //     // override
986 //     // List!(GeoRadiusResponse) georadiusByMemberReadonly(string key, string member, double radius,
987 //     //         GeoUnit unit) {
988 //     //     Redis j = getShard(key);
989 //     //     return j.georadiusByMemberReadonly(key, member, radius, unit);
990 //     // }
991 
992 //     // override
993 //     // List!(GeoRadiusResponse) georadiusByMember(string key, string member, double radius,
994 //     //         GeoUnit unit, GeoRadiusParam param) {
995 //     //     Redis j = getShard(key);
996 //     //     return j.georadiusByMember(key, member, radius, unit, param);
997 //     // }
998 
999 //     // override
1000 //     // List!(GeoRadiusResponse) georadiusByMemberReadonly(string key, string member, double radius,
1001 //     //         GeoUnit unit, GeoRadiusParam param) {
1002 //     //     Redis j = getShard(key);
1003 //     //     return j.georadiusByMemberReadonly(key, member, radius, unit, param);
1004 //     // }
1005 
1006 //     // override
1007 //     // List!(long) bitfield(string key, string[] arguments...) {
1008 //     //     Redis j = getShard(key);
1009 //     //     return j.bitfield(key, arguments);
1010 //     // }
1011 
1012 //     // override
1013 //     // long hstrlen(string key, string field) {
1014 //     //     Redis j = getShard(key);
1015 //     //     return j.hstrlen(key, field);
1016 //     // }
1017 
1018 //     // override
1019 //     // StreamEntryID xadd(string key, StreamEntryID id, Map!(string, string) hash) {
1020 //     //     Redis j = getShard(key);
1021 //     //     return j.xadd(key, id, hash);
1022 //     // }
1023     
1024 //     // override
1025 //     // StreamEntryID xadd(string key, StreamEntryID id, Map!(string, string) hash, long maxLen, bool approximateLength) {
1026 //     //     Redis j = getShard(key);
1027 //     //     return j.xadd(key, id, hash, maxLen, approximateLength);
1028 //     // }
1029 
1030 //     // override
1031 //     // long xlen(string key) {
1032 //     //     Redis j = getShard(key);
1033 //     //     return j.xlen(key);
1034 //     // }
1035     
1036 //     // override
1037 //     // List!(StreamEntry) xrange(string key, StreamEntryID start, StreamEntryID end, int count) {
1038 //     //     Redis j = getShard(key);
1039 //     //     return j.xrange(key, start, end, count);
1040 //     // }
1041 
1042 //     // override
1043 //     // long xack(string key, string group, StreamEntryID[] ids...) {
1044 //     //     Redis j = getShard(key);
1045 //     //     return j.xack(key, group, ids);
1046 //     // }
1047 
1048 //     // override
1049 //     // string xgroupCreate(string key, string consumer, StreamEntryID id, bool makeStream) {
1050 //     //     Redis j = getShard(key);
1051 //     //     return j.xgroupCreate(key, consumer, id, makeStream);
1052 //     // }
1053 
1054 //     // override
1055 //     // string xgroupSetID(string key, string groupname, StreamEntryID id) {
1056 //     //     Redis j = getShard(key);
1057 //     //     return j.xgroupSetID(key, groupname, id);
1058 //     // }
1059 
1060 //     // override
1061 //     // long xgroupDestroy(string key, string groupname) {
1062 //     //     Redis j = getShard(key);
1063 //     //     return j.xgroupDestroy(key, groupname);
1064 //     // }
1065 
1066 //     // override
1067 //     // string xgroupDelConsumer(string key, string groupname, string consumername) {
1068 //     //     Redis j = getShard(key);
1069 //     //     return j.xgroupDelConsumer(key, groupname, consumername);
1070 //     // }
1071 
1072 
1073 //     // override
1074 //     // long xdel(string key, StreamEntryID[] ids...) {
1075 //     //     Redis j = getShard(key);
1076 //     //     return j.xdel(key, ids);
1077 //     // }
1078 
1079 //     // override
1080 //     // long xtrim(string key, long maxLen, bool approximateLength) {
1081 //     //     Redis j = getShard(key);
1082 //     //     return j.xtrim(key, maxLen, approximateLength);
1083 //     // }
1084 
1085 //     // override
1086 //     // List!(StreamEntry) xrevrange(string key, StreamEntryID end, StreamEntryID start, int count) {
1087 //     //     Redis j = getShard(key);
1088 //     //     return j.xrevrange(key, end, start, count);
1089 //     // }
1090 
1091 //     // override
1092 //     // List!(StreamPendingEntry) xpending(string key, string groupname, StreamEntryID start, StreamEntryID end,
1093 //     //         int count, string consumername) {
1094 //     //     Redis j = getShard(key);
1095 //     //     return j.xpending(key, groupname, start, end, count, consumername);
1096 //     // }
1097 
1098 //     // override
1099 //     // List!(StreamEntry) xclaim(string key, string group, string consumername, long minIdleTime, long newIdleTime,
1100 //     //         int retries, bool force, StreamEntryID[] ids...) {
1101 //     //     Redis j = getShard(key);
1102 //     //     return j.xclaim(key, group, consumername, minIdleTime, newIdleTime, retries, force, ids);
1103 //     // }
1104 
1105 //     // override
1106 //     // Object sendCommand(ProtocolCommand cmd, string[] args...) {
1107 //     //     // default since no sample key provided in RedisCommands interface
1108 //     //     string sampleKey = args.length > 0 ? args[0] : cmd.to!string();
1109 //     //     Redis j = getShard(sampleKey);
1110 //     //     return j.sendCommand(cmd, args);
1111 //     // }
1112 // }