diff --git a/README.md b/README.md index 224a9bb..b300549 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # redisson -A Type-safe Golang Redis RESP2/RESP3 client. +A Type-safe Golang Redis RESP2 client. ## Features @@ -10,20 +10,19 @@ A Type-safe Golang Redis RESP2/RESP3 client. * Check forbid Redis commands in development mode. * Monitoring cost of Redis commands. * Monitoring status of connections. -* Monitoring hits/miss of Redis RESP3 client side caching. -* Support Redis RESP2/RESP3. -* Opt-in client side caching. -* Auto pipeline for non-blocking Redis RESP3 commands. -* Connection pooling for blocking Redis RESP3 commands. +* Support Redis RESP2. ## Requirement -* Currently, only supports Redis < 7.x -* Golang >= 1.8 +* Golang >= 1.16 + +## Base Library +- RESP2, using [go-redis/redis](https://github.com/go-redis/redis) library. +- RESP3, using [rueian/rueidis](https://github.com/rueian/rueidis) library. ## Links -* [English](https://github.com/sandwich-go/redisson/blob/master/README.md) -* [中文文档](https://github.com/sandwich-go/redisson/blob/master/README_CN.md) +* [English](https://github.com/sandwich-go/redisson/blob/version/1.0/README.md) +* [中文文档](https://github.com/sandwich-go/redisson/blob/version/1.0/README_CN.md) ## Getting Started @@ -37,7 +36,7 @@ import ( func main() { c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(false), )) defer c.Close() @@ -52,11 +51,13 @@ func main() { ``` ## Check +Check only in development mode. + ### Check version if Redis < 6.0 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -64,15 +65,17 @@ defer c.Close() res := c.Set(ctx, "key", "10", -1) ``` Output: -```go -Line 34: - redis 'SET KEEPTTL' are not supported in version "5.0.0", available since 6.0.0 +```text +[SET KEEPTTL]: redis command are not supported in version "5.0.0", available since 6.0.0 ``` +> :warning: Will Panic when check version failed in development mode. + ### Check deprecated if Redis >= 4.0 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -80,15 +83,15 @@ defer c.Close() res := c.HMSet(ctx, "key", "10") ``` Output: -```go -As of Redis version 4.0.0, this command is regarded as deprecated. +```text +[HMSET]: As of Redis version 4.0.0, this command is regarded as deprecated. It can be replaced by HSET with multiple field-value pairs when migrating or writing new code. ``` ### Check slot for multiple keys -```go +```text c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -96,14 +99,16 @@ defer c.Close() res := c.MSet(ctx, "key1", "10", "key2", "20") ``` Output: -```go -Line 34: - multi key command with different key slots are not allowed +```text +[MSET]: multi key command with different key slots are not allowed ``` +> :warning: Will Panic when has different slots of keys in development mode. + ### Check forbid ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -111,12 +116,43 @@ defer c.Close() res := c.ClusterFailover(ctx) ``` Output: -```go -Line 34: - command 'CLUSTER FAILOVER' not allowed +```text +[CLUSTER FAILOVER]: redis command are not allowed ``` +> :warning: Will Panic when exec forbid command in development mode. + +#### Forbid commands +* CLUSTER ADDSLOTS +* CLUSTER ADDSLOTSRANGE +* CLUSTER DELSLOTS +* CLUSTER DELSLOTSRANGE +* CLUSTER FAILOVER +* CLUSTER FORGET +* CLUSTER MEET +* CLUSTER REPLICATE +* CLUSTER RESET HARD/SOFT +* CLUSTER SAVECONFIG +* CLUSTER SLAVES +* KEYS +* MIGRATE +* BGREWRITEAOF +* BGSAVE +* CONFIG GET +* CONFIG RESETSTAT +* CONFIG REWRITE +* CONFIG SET +* FLUSHALL ASYNC/SYNC +* FLUSHDB ASYNC/SYNC +* SAVE +* SHUTDOWN NOSAVE/SAVE +* SLAVEOF +* SELECT + ## Monitor +Import Grafana dashboard id `16768` + ```go import ( "github.com/prometheus/client_golang/prometheus" @@ -127,7 +163,7 @@ var DefaultPrometheusRegistry = prometheus.NewRegistry() c := redisson.MustNewClient(redisson.NewConf( redisson.WithResp(redisson.RESP3), - redisson.WithDevelopment(true), + redisson.WithEnableMonitor(true), )) defer c.Close() @@ -136,30 +172,92 @@ c.RegisterCollector(func(c prometheus.Collector) { }) ``` - -## Auto Pipeline - -All non-blocking commands sending to a single Redis node are automatically pipelined through one tcp connection, -which reduces the overall round trips and system calls, and gets higher throughput. - -Notice: Only supports when use Redis RESP3 client. - - -## Client Side Caching - -The Opt-In mode of server-assisted client side caching is always enabled. - -```golang -c.Cache(time.Minute).Get(ctx, "key").Val() +![grafana_dashboard](https://github.com/sandwich-go/redisson/blob/version/1.0/grafana_dashboard.png) + +## Benchmark +### Environment +- [go-redis/redis](https://github.com/go-redis/redis) v8.11.5 +- [joomcode/redispipe](https://github.com/joomcode/redispipe) v0.9.4 +- [mediocregopher/radix](https://github.com/mediocregopher/radix) v4.1.1 +- [rueian/rueidis](https://github.com/rueian/rueidis) v0.0.74 +- [sandwich-go/redisson](https://github.com/sandwich-go/redisson) v1.1.14 + +### Benchmarking Result +##### Single, Parallel mode, Get Command +```markdown ++---------------------------------------------------+-----------+-------+-------+-----------+ +| Single Parallel(128) Get | iteration | ns/op | B/op | allocs/op | ++===================================================+===========+=======+=======+===========+ +| sandwich-go/redisson/RESP2:Val(64):Pool(100) | 362365 | 6136 | 279 | 6 | +| sandwich-go/redisson/RESP2:Val(64):Pool(1000) | 504202 | 4731 | 286 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(100) | 362181 | 6334 | 487 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(1000) | 481341 | 4946 | 495 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(100) | 332634 | 6822 | 1351 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(1000) | 451609 | 5299 | 1360 | 6 | +| sandwich-go/redisson/RESP3:Val(64):Pool(100) | 1208716 | 1923 | 320 | 4 | +| sandwich-go/redisson/RESP3:Val(256):Pool(100) | 1000000 | 2013 | 512 | 4 | +| sandwich-go/redisson/RESP3:Val(1024):Pool(100) | 728786 | 2816 | 1281 | 4 | +| rueian/rueidis/rueidiscompat:Val(64):Pool(100) | 1253146 | 1847 | 256 | 4 | +| rueian/rueidis/rueidiscompat:Val(256):Pool(100) | 1000000 | 2034 | 448 | 4 | +| rueian/rueidis/rueidiscompat:Val(1024):Pool(100) | 792254 | 2686 | 1217 | 4 | +| go-redis/redis/v8:Val(64):Pool(100) | 369186 | 6098 | 279 | 6 | +| go-redis/redis/v8:Val(64):Pool(1000) | 506796 | 4750 | 286 | 6 | +| go-redis/redis/v8:Val(256):Pool(100) | 357454 | 6266 | 487 | 6 | +| go-redis/redis/v8:Val(256):Pool(1000) | 486217 | 4919 | 495 | 6 | +| go-redis/redis/v8:Val(1024):Pool(100) | 331382 | 6779 | 1351 | 6 | +| go-redis/redis/v8:Val(1024):Pool(1000) | 452067 | 5307 | 1360 | 6 | +| mediocregopher/radix/v4:Val(64):Pool(100) | 596540 | 4284 | 26 | 1 | +| mediocregopher/radix/v4:Val(64):Pool(1000) | 589083 | 4902 | 54 | 1 | +| mediocregopher/radix/v4:Val(256):Pool(100) | 576108 | 4384 | 27 | 1 | +| mediocregopher/radix/v4:Val(256):Pool(1000) | 597157 | 4993 | 54 | 1 | +| mediocregopher/radix/v4:Val(1024):Pool(100) | 573411 | 4539 | 27 | 1 | +| mediocregopher/radix/v4:Val(1024):Pool(1000) | 559611 | 5062 | 56 | 1 | +| joomcode/redispipe:Val(64):Pool(100) | 1109589 | 2137 | 168 | 5 | +| joomcode/redispipe:Val(256):Pool(100) | 1000000 | 2170 | 377 | 5 | +| joomcode/redispipe:Val(1024):Pool(100) | 958350 | 2442 | 1241 | 5 | ++---------------------------------------------------+-----------+-------+-------+-----------+ ``` -An explicit client side TTL is required because Redis server may not send invalidation message in time when -a key is expired on the server. Please follow [#6833](https://github.com/redis/redis/issues/6833) and [#6867](https://github.com/redis/redis/issues/6867) +![BenchmarkSingleClientGetParallel](https://github.com/sandwich-go/go-redis-client-benchmark/blob/master/BenchmarkSingleClientGetParallel.png) + +##### Cluster, Parallel mode, Get Command +```markdown ++---------------------------------------------------+-----------+-------+-------+-----------+ +| Cluster Parallel(128) Get | iteration | ns/op | B/op | allocs/op | ++===================================================+===========+=======+=======+===========+ +| sandwich-go/redisson/RESP2:Val(64):Pool(100) | 361689 | 6246 | 279 | 6 | +| sandwich-go/redisson/RESP2:Val(64):Pool(1000) | 494625 | 4819 | 286 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(100) | 353413 | 6439 | 487 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(1000) | 478305 | 5035 | 494 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(100) | 324940 | 6992 | 1351 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(1000) | 441291 | 5472 | 1360 | 6 | +| sandwich-go/redisson/RESP3:Val(64):Pool(100) | 1036126 | 2275 | 320 | 4 | +| sandwich-go/redisson/RESP3:Val(256):Pool(100) | 1008175 | 2420 | 513 | 4 | +| sandwich-go/redisson/RESP3:Val(1024):Pool(100) | 766168 | 2906 | 1282 | 4 | +| rueian/rueidis/rueidiscompat:Val(64):Pool(100) | 946216 | 2266 | 256 | 4 | +| rueian/rueidis/rueidiscompat:Val(256):Pool(100) | 924811 | 2292 | 448 | 4 | +| rueian/rueidis/rueidiscompat:Val(1024):Pool(100) | 856582 | 2802 | 1218 | 4 | +| go-redis/redis/v8:Val(64):Pool(100) | 351850 | 6251 | 279 | 6 | +| go-redis/redis/v8:Val(64):Pool(1000) | 489259 | 4821 | 286 | 6 | +| go-redis/redis/v8:Val(256):Pool(100) | 356703 | 6385 | 487 | 6 | +| go-redis/redis/v8:Val(256):Pool(1000) | 478236 | 5012 | 494 | 6 | +| go-redis/redis/v8:Val(1024):Pool(100) | 333362 | 6972 | 1351 | 6 | +| go-redis/redis/v8:Val(1024):Pool(1000) | 443264 | 5386 | 1360 | 6 | +| mediocregopher/radix/v4:Val(64):Pool(100) | 477573 | 4598 | 113 | 2 | +| mediocregopher/radix/v4:Val(64):Pool(1000) | 386779 | 5431 | 114 | 2 | +| mediocregopher/radix/v4:Val(256):Pool(100) | 459818 | 4737 | 113 | 2 | +| mediocregopher/radix/v4:Val(256):Pool(1000) | 383200 | 5656 | 114 | 2 | +| mediocregopher/radix/v4:Val(1024):Pool(100) | 451070 | 4911 | 114 | 2 | +| mediocregopher/radix/v4:Val(1024):Pool(1000) | 356745 | 5745 | 114 | 2 | +| joomcode/redispipe:Val(64):Pool(100) | 1091751 | 2147 | 170 | 5 | +| joomcode/redispipe:Val(256):Pool(100) | 1088572 | 2298 | 379 | 5 | +| joomcode/redispipe:Val(1024):Pool(100) | 800530 | 2548 | 1246 | 5 | ++---------------------------------------------------+-----------+-------+-------+-----------+ +``` -Although an explicit client side TTL is required, the `Cache()` still sends a `PTTL` command to server and make sure that -the client side TTL is not longer than the TTL on server side. +![BenchmarkClusterClientGetParallel](https://github.com/sandwich-go/go-redis-client-benchmark/blob/master/BenchmarkClusterClientGetParallel.png) -Notice: Only supports when use Redis RESP3 client. +See [Benchmark Detail Result](https://github.com/sandwich-go/go-redis-client-benchmark) * [Opt-in client side caching](https://redis.io/docs/manual/client-side-caching/) diff --git a/README_CN.md b/README_CN.md index 20c8c75..64deecc 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,6 +1,6 @@ # redisson -一个类型安全的`Golang Redis`客户端,支持`RESP2/RESP3`协议 +一个类型安全的`Golang Redis`客户端,支持`RESP2`协议 ## 特征 @@ -10,20 +10,20 @@ * 开发模式下,检查禁止使用的`Redis`命令 * 监控`Redis`命令耗时时间 * 监控`Redis`连接状态 -* 监控`Redis RESP3`客户端缓存命中状态 -* 支持`RESP2/RESP3`协议 -* 支持`Redis RESP3`客户端缓存 -* `Redis RESP3`客户端命令自动进行`pipeline` -* `Redis RESP3`客户端自动管理阻塞的连接 +* 支持`RESP2`协议 + ## 要求 -* 当前只支持 Redis < 7.x -* Golang >= 1.8 +* Golang >= 1.16 + +## 基础库 +- RESP2, 使用 [go-redis/redis](https://github.com/go-redis/redis). +- RESP3, 使用 [rueian/rueidis](https://github.com/rueian/rueidis). ## 链接 -* [English](https://github.com/sandwich-go/redisson/blob/master/README.md) -* [中文文档](https://github.com/sandwich-go/redisson/blob/master/README_CN.md) +* [English](https://github.com/sandwich-go/redisson/blob/version/1.0/README.md) +* [中文文档](https://github.com/sandwich-go/redisson/blob/version/1.0/README_CN.md) ## 开始 @@ -37,7 +37,7 @@ import ( func main() { c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(false), )) defer c.Close() @@ -52,11 +52,14 @@ func main() { ``` ## 检查 +仅在development模式下才会检查 + + ### 版本检查 如果 Redis < 6.0 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -64,15 +67,17 @@ defer c.Close() res := c.Set(ctx, "key", "10", -1) ``` 输出: -```go -Line 34: - redis 'SET KEEPTTL' are not supported in version "5.0.0", available since 6.0.0 +```text +[SET KEEPTTL]: redis command are not supported in version "5.0.0", available since 6.0.0 ``` +> :warning: 在development模式下,若校验版本失败,则会发生Panic + ### 检查过期 如果 Redis >= 4.0 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -80,15 +85,15 @@ defer c.Close() res := c.HMSet(ctx, "key", "10") ``` 输出: -```go -As of Redis version 4.0.0, this command is regarded as deprecated. +```text +[HMSET]: As of Redis version 4.0.0, this command is regarded as deprecated. It can be replaced by HSET with multiple field-value pairs when migrating or writing new code. ``` ### 检查槽位 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -96,14 +101,16 @@ defer c.Close() res := c.MSet(ctx, "key1", "10", "key2", "20") ``` 输出: -```go -Line 34: - multi key command with different key slots are not allowed +```text +[MSET]: multi key command with different key slots are not allowed ``` +> :warning: 在development模式下,若多个key分布在不同的slot中,则会发生Panic + ### 命令禁用 ```go c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), + redisson.WithResp(redisson.RESP2), redisson.WithDevelopment(true), )) defer c.Close() @@ -111,12 +118,43 @@ defer c.Close() res := c.ClusterFailover(ctx) ``` 输出: -```go -Line 34: - command 'CLUSTER FAILOVER' not allowed +```text +[CLUSTER FAILOVER]: redis command are not allowed ``` +> :warning: 在development模式下,若使用禁用命令,则会发生Panic + +#### 禁用命令集 +* CLUSTER ADDSLOTS +* CLUSTER ADDSLOTSRANGE +* CLUSTER DELSLOTS +* CLUSTER DELSLOTSRANGE +* CLUSTER FAILOVER +* CLUSTER FORGET +* CLUSTER MEET +* CLUSTER REPLICATE +* CLUSTER RESET HARD/SOFT +* CLUSTER SAVECONFIG +* CLUSTER SLAVES +* KEYS +* MIGRATE +* BGREWRITEAOF +* BGSAVE +* CONFIG GET +* CONFIG RESETSTAT +* CONFIG REWRITE +* CONFIG SET +* FLUSHALL ASYNC/SYNC +* FLUSHDB ASYNC/SYNC +* SAVE +* SHUTDOWN NOSAVE/SAVE +* SLAVEOF +* SELECT + ## 监控 +导入`Grafana dashboard id` `16768` + ```go import ( "github.com/prometheus/client_golang/prometheus" @@ -126,8 +164,8 @@ import ( var DefaultPrometheusRegistry = prometheus.NewRegistry() c := redisson.MustNewClient(redisson.NewConf( - redisson.WithResp(redisson.RESP3), - redisson.WithDevelopment(true), + redisson.WithResp(redisson.RESP2), + redisson.WithEnableMonitor(true), )) defer c.Close() @@ -136,29 +174,93 @@ c.RegisterCollector(func(c prometheus.Collector) { }) ``` +![grafana_dashboard](https://github.com/sandwich-go/redisson/blob/version/1.0/grafana_dashboard.png) + +## Benchmark +### 环境 +- [go-redis/redis](https://github.com/go-redis/redis) v8.11.5 +- [joomcode/redispipe](https://github.com/joomcode/redispipe) v0.9.4 +- [mediocregopher/radix](https://github.com/mediocregopher/radix) v4.1.1 +- [rueian/rueidis](https://github.com/rueian/rueidis) v0.0.74 +- [sandwich-go/redisson](https://github.com/sandwich-go/redisson) v1.1.14 + +### Benchmarking Result +##### Single, Parallel mode, Get Command +```markdown ++---------------------------------------------------+-----------+-------+-------+-----------+ +| Single Parallel(128) Get | iteration | ns/op | B/op | allocs/op | ++===================================================+===========+=======+=======+===========+ +| sandwich-go/redisson/RESP2:Val(64):Pool(100) | 362365 | 6136 | 279 | 6 | +| sandwich-go/redisson/RESP2:Val(64):Pool(1000) | 504202 | 4731 | 286 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(100) | 362181 | 6334 | 487 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(1000) | 481341 | 4946 | 495 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(100) | 332634 | 6822 | 1351 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(1000) | 451609 | 5299 | 1360 | 6 | +| sandwich-go/redisson/RESP3:Val(64):Pool(100) | 1208716 | 1923 | 320 | 4 | +| sandwich-go/redisson/RESP3:Val(256):Pool(100) | 1000000 | 2013 | 512 | 4 | +| sandwich-go/redisson/RESP3:Val(1024):Pool(100) | 728786 | 2816 | 1281 | 4 | +| rueian/rueidis/rueidiscompat:Val(64):Pool(100) | 1253146 | 1847 | 256 | 4 | +| rueian/rueidis/rueidiscompat:Val(256):Pool(100) | 1000000 | 2034 | 448 | 4 | +| rueian/rueidis/rueidiscompat:Val(1024):Pool(100) | 792254 | 2686 | 1217 | 4 | +| go-redis/redis/v8:Val(64):Pool(100) | 369186 | 6098 | 279 | 6 | +| go-redis/redis/v8:Val(64):Pool(1000) | 506796 | 4750 | 286 | 6 | +| go-redis/redis/v8:Val(256):Pool(100) | 357454 | 6266 | 487 | 6 | +| go-redis/redis/v8:Val(256):Pool(1000) | 486217 | 4919 | 495 | 6 | +| go-redis/redis/v8:Val(1024):Pool(100) | 331382 | 6779 | 1351 | 6 | +| go-redis/redis/v8:Val(1024):Pool(1000) | 452067 | 5307 | 1360 | 6 | +| mediocregopher/radix/v4:Val(64):Pool(100) | 596540 | 4284 | 26 | 1 | +| mediocregopher/radix/v4:Val(64):Pool(1000) | 589083 | 4902 | 54 | 1 | +| mediocregopher/radix/v4:Val(256):Pool(100) | 576108 | 4384 | 27 | 1 | +| mediocregopher/radix/v4:Val(256):Pool(1000) | 597157 | 4993 | 54 | 1 | +| mediocregopher/radix/v4:Val(1024):Pool(100) | 573411 | 4539 | 27 | 1 | +| mediocregopher/radix/v4:Val(1024):Pool(1000) | 559611 | 5062 | 56 | 1 | +| joomcode/redispipe:Val(64):Pool(100) | 1109589 | 2137 | 168 | 5 | +| joomcode/redispipe:Val(256):Pool(100) | 1000000 | 2170 | 377 | 5 | +| joomcode/redispipe:Val(1024):Pool(100) | 958350 | 2442 | 1241 | 5 | ++---------------------------------------------------+-----------+-------+-------+-----------+ +``` -## 自动`pipeline` - -所有发送到单个`Redis`节点的非阻塞命令都会通过一个tcp连接自动`pipeline`传输, -这减少了整体往返和系统调用,并获得了更高的吞吐量。 - -注意:仅在使用`Redis RESP3`客户端时支持。 - - -## 客户端缓存 - -始终启用服务器辅助客户端缓存的加入模式 - -```golang -c.Cache(time.Minute).Get(ctx, "key").Val() +![BenchmarkSingleClientGetParallel](https://github.com/sandwich-go/go-redis-client-benchmark/blob/master/BenchmarkSingleClientGetParallel.png) + +##### Cluster, Parallel mode, Get Command +```markdown ++---------------------------------------------------+-----------+-------+-------+-----------+ +| Cluster Parallel(128) Get | iteration | ns/op | B/op | allocs/op | ++===================================================+===========+=======+=======+===========+ +| sandwich-go/redisson/RESP2:Val(64):Pool(100) | 361689 | 6246 | 279 | 6 | +| sandwich-go/redisson/RESP2:Val(64):Pool(1000) | 494625 | 4819 | 286 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(100) | 353413 | 6439 | 487 | 6 | +| sandwich-go/redisson/RESP2:Val(256):Pool(1000) | 478305 | 5035 | 494 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(100) | 324940 | 6992 | 1351 | 6 | +| sandwich-go/redisson/RESP2:Val(1024):Pool(1000) | 441291 | 5472 | 1360 | 6 | +| sandwich-go/redisson/RESP3:Val(64):Pool(100) | 1036126 | 2275 | 320 | 4 | +| sandwich-go/redisson/RESP3:Val(256):Pool(100) | 1008175 | 2420 | 513 | 4 | +| sandwich-go/redisson/RESP3:Val(1024):Pool(100) | 766168 | 2906 | 1282 | 4 | +| rueian/rueidis/rueidiscompat:Val(64):Pool(100) | 946216 | 2266 | 256 | 4 | +| rueian/rueidis/rueidiscompat:Val(256):Pool(100) | 924811 | 2292 | 448 | 4 | +| rueian/rueidis/rueidiscompat:Val(1024):Pool(100) | 856582 | 2802 | 1218 | 4 | +| go-redis/redis/v8:Val(64):Pool(100) | 351850 | 6251 | 279 | 6 | +| go-redis/redis/v8:Val(64):Pool(1000) | 489259 | 4821 | 286 | 6 | +| go-redis/redis/v8:Val(256):Pool(100) | 356703 | 6385 | 487 | 6 | +| go-redis/redis/v8:Val(256):Pool(1000) | 478236 | 5012 | 494 | 6 | +| go-redis/redis/v8:Val(1024):Pool(100) | 333362 | 6972 | 1351 | 6 | +| go-redis/redis/v8:Val(1024):Pool(1000) | 443264 | 5386 | 1360 | 6 | +| mediocregopher/radix/v4:Val(64):Pool(100) | 477573 | 4598 | 113 | 2 | +| mediocregopher/radix/v4:Val(64):Pool(1000) | 386779 | 5431 | 114 | 2 | +| mediocregopher/radix/v4:Val(256):Pool(100) | 459818 | 4737 | 113 | 2 | +| mediocregopher/radix/v4:Val(256):Pool(1000) | 383200 | 5656 | 114 | 2 | +| mediocregopher/radix/v4:Val(1024):Pool(100) | 451070 | 4911 | 114 | 2 | +| mediocregopher/radix/v4:Val(1024):Pool(1000) | 356745 | 5745 | 114 | 2 | +| joomcode/redispipe:Val(64):Pool(100) | 1091751 | 2147 | 170 | 5 | +| joomcode/redispipe:Val(256):Pool(100) | 1088572 | 2298 | 379 | 5 | +| joomcode/redispipe:Val(1024):Pool(100) | 800530 | 2548 | 1246 | 5 | ++---------------------------------------------------+-----------+-------+-------+-----------+ ``` -需要显式指定客户端`TTL`,因为`Redis`服务器在以下情况下可能无法及时发送失效消息: -服务器上的密钥已过期。请遵循 [#6833](https://github.com/redis/redis/issues/6833) 和 [#6867](https://github.com/redis/redis/issues/6867) +![BenchmarkClusterClientGetParallel](https://github.com/sandwich-go/go-redis-client-benchmark/blob/master/BenchmarkClusterClientGetParallel.png) -尽管需要显式的指定客户端`TTL`,`Cache()`仍然向服务器发送`PTTL`命令,并确保客户端`TTL`不长于服务器端`TTL`。 +详见 [Benchmark Detail Result](https://github.com/sandwich-go/go-redis-client-benchmark) -注意:仅在使用`Redis RESP3`客户端时支持。 * [Opt-in client side caching](https://redis.io/docs/manual/client-side-caching/) diff --git a/cmd_args.go b/cmd_args.go index 23c0caa..bce1256 100644 --- a/cmd_args.go +++ b/cmd_args.go @@ -1,7 +1,7 @@ -package sandwich_redis +package redisson import ( - goredis "github.com/go-redis/redis/v8" + goredis "github.com/redis/go-redis/v9" ) const KeepTTL = goredis.KeepTTL diff --git a/cmd_bitmap.go b/cmd_bitmap.go index f45933b..2516a73 100644 --- a/cmd_bitmap.go +++ b/cmd_bitmap.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_bitmap_test.go b/cmd_bitmap_test.go index f47d5ab..ef9f674 100644 --- a/cmd_bitmap_test.go +++ b/cmd_bitmap_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -280,4 +280,3 @@ func doTestUnits(t *testing.T, r RESP, unitsFunc func() []TestUnit) { } func TestResp2Client_BitMap(t *testing.T) { doTestUnits(t, RESP2, bitMapTestUnits) } -func TestResp3Client_BitMap(t *testing.T) { doTestUnits(t, RESP3, bitMapTestUnits) } diff --git a/cmd_cluster.go b/cmd_cluster.go index 2090afe..c18c912 100644 --- a/cmd_cluster.go +++ b/cmd_cluster.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_connection.go b/cmd_connection.go index cc1a61c..55e9f12 100644 --- a/cmd_connection.go +++ b/cmd_connection.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_connection_test.go b/cmd_connection_test.go index a548597..6fafd00 100644 --- a/cmd_connection_test.go +++ b/cmd_connection_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -107,4 +107,3 @@ func connectionTestUnits() []TestUnit { } func TestResp2Client_Connection(t *testing.T) { doTestUnits(t, RESP2, connectionTestUnits) } -func TestResp3Client_Connection(t *testing.T) { doTestUnits(t, RESP3, connectionTestUnits) } diff --git a/cmd_gen.go b/cmd_gen.go index a60020a..795071d 100644 --- a/cmd_gen.go +++ b/cmd_gen.go @@ -1,5 +1,5 @@ // Code generated by tools. DO NOT EDIT. -package sandwich_redis +package redisson const ( commandBitOpAndWarning = "BITOP is a potentially slow command as it runs in O(N) time. Care should be taken when running it against long input strings." @@ -2503,10 +2503,10 @@ var CommandZrangebyscore = new(commandZrangebyscore) type commandZrangebyscore string func (commandZrangebyscore) String() string { return "ZRANGEBYSCORE" } -func (commandZrangebyscore) Class() string { return "1.0.5" } -func (commandZrangebyscore) RequireVersion() string { return "6.2.0" } +func (commandZrangebyscore) Class() string { return "SortedSet" } +func (commandZrangebyscore) RequireVersion() string { return "1.0.5" } func (commandZrangebyscore) Forbid() bool { return false } -func (commandZrangebyscore) WarnVersion() string { return "" } +func (commandZrangebyscore) WarnVersion() string { return "6.2.0" } func (commandZrangebyscore) Warning() string { return commandZrangebyscoreWarning } func (commandZrangebyscore) Cmd() []string { return []string{"SortedSet"} } diff --git a/cmd_generic.go b/cmd_generic.go index bce2695..65ebad4 100644 --- a/cmd_generic.go +++ b/cmd_generic.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -311,9 +311,7 @@ type GenericReader interface { // Return: // Integer reply: The number of keys that were touched. Touch(ctx context.Context, keys ...string) IntCmd -} -type GenericCacheCmdable interface { // TTL // Available since: 1.0.0 // Time complexity: O(1) @@ -328,15 +326,6 @@ type GenericCacheCmdable interface { // Integer reply: TTL in seconds, or a negative value in order to signal an error (see the description above). TTL(ctx context.Context, key string) DurationCmd - // Type - // Available since: 1.0.0 - // Time complexity: O(1) - // ACL categories: @keyspace @read @fast - // Returns the string representation of the type of the value stored at key. The different types that can be returned are: string, list, set, zset, hash and stream. - // Return: - // Simple string reply: type of key, or none when key does not exist. - Type(ctx context.Context, key string) StatusCmd - // PTTL // Available since: 2.6.0 // Time complexity: O(1) @@ -349,6 +338,17 @@ type GenericCacheCmdable interface { // Return: // Integer reply: TTL in milliseconds, or a negative value in order to signal an error (see the description above). PTTL(ctx context.Context, key string) DurationCmd +} + +type GenericCacheCmdable interface { + // Type + // Available since: 1.0.0 + // Time complexity: O(1) + // ACL categories: @keyspace @read @fast + // Returns the string representation of the type of the value stored at key. The different types that can be returned are: string, list, set, zset, hash and stream. + // Return: + // Simple string reply: type of key, or none when key does not exist. + Type(ctx context.Context, key string) StatusCmd // Sort // Available since: 1.0.0 @@ -486,7 +486,7 @@ func (c *client) PExpireAt(ctx context.Context, key string, tm time.Time) BoolCm func (c *client) PTTL(ctx context.Context, key string) DurationCmd { ctx = c.handler.before(ctx, CommandPTTL) - r := c.cacheCmdable.PTTL(ctx, key) + r := c.cmdable.PTTL(ctx, key) c.handler.after(ctx, r.Err()) return r } @@ -574,7 +574,7 @@ func (c *client) Touch(ctx context.Context, keys ...string) IntCmd { func (c *client) TTL(ctx context.Context, key string) DurationCmd { ctx = c.handler.before(ctx, CommandTTL) - r := c.cacheCmdable.TTL(ctx, key) + r := c.cmdable.TTL(ctx, key) c.handler.after(ctx, r.Err()) return r } diff --git a/cmd_generic_test.go b/cmd_generic_test.go index d1fed01..655956c 100644 --- a/cmd_generic_test.go +++ b/cmd_generic_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -397,11 +397,7 @@ func testPTTL(ctx context.Context, c Cmdable) []string { So(expire.Err(), ShouldBeNil) So(expire.Val(), ShouldBeTrue) - pttl := cacheCmd(c).PTTL(ctx, key) - So(pttl.Err(), ShouldBeNil) - So(pttl.Val(), ShouldNotEqual, 100*time.Millisecond) - - pttl = c.PTTL(ctx, key) + pttl := c.PTTL(ctx, key) So(pttl.Err(), ShouldBeNil) So(pttl.Val(), ShouldNotEqual, 100*time.Millisecond) @@ -702,10 +698,6 @@ func testTTL(ctx context.Context, c Cmdable) []string { So(ttl.Err(), ShouldBeNil) So(ttl.Val(), ShouldEqual, 60*time.Second) - ttl = cacheCmd(c).TTL(ctx, key) - So(ttl.Err(), ShouldBeNil) - So(ttl.Val(), ShouldEqual, 60*time.Second) - return []string{key} } @@ -820,4 +812,3 @@ func genericTestUnits() []TestUnit { } func TestResp2Client_Generic(t *testing.T) { doTestUnits(t, RESP2, genericTestUnits) } -func TestResp3Client_Generic(t *testing.T) { doTestUnits(t, RESP3, genericTestUnits) } diff --git a/cmd_geospatial.go b/cmd_geospatial.go index dcfacb4..b83f7ca 100644 --- a/cmd_geospatial.go +++ b/cmd_geospatial.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_geospatial_test.go b/cmd_geospatial_test.go index 35a6311..2b5cc5f 100644 --- a/cmd_geospatial_test.go +++ b/cmd_geospatial_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -323,4 +323,3 @@ func geospatialTestUnits() []TestUnit { } func TestResp2Client_Geospatial(t *testing.T) { doTestUnits(t, RESP2, geospatialTestUnits) } -func TestResp3Client_Geospatial(t *testing.T) { doTestUnits(t, RESP3, geospatialTestUnits) } diff --git a/cmd_hash.go b/cmd_hash.go index f6fdb66..711feae 100644 --- a/cmd_hash.go +++ b/cmd_hash.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -85,7 +85,7 @@ type HashReader interface { // Return: // Bulk string reply: without the additional count argument, the command returns a Bulk Reply with the randomly selected field, or nil when key does not exist. // Array reply: when the additional count argument is passed, the command returns an array of fields, or an empty array when key does not exist. If the WITHVALUES modifier is used, the reply is a list fields and their values from the hash. - HRandField(ctx context.Context, key string, count int, withValues bool) StringSliceCmd + HRandField(ctx context.Context, key string, count int) StringSliceCmd // HScan // Available since: 2.8.0 @@ -237,9 +237,9 @@ func (c *client) HMSet(ctx context.Context, key string, values ...interface{}) B return r } -func (c *client) HRandField(ctx context.Context, key string, count int, withValues bool) StringSliceCmd { +func (c *client) HRandField(ctx context.Context, key string, count int) StringSliceCmd { ctx = c.handler.before(ctx, CommandHRandField) - r := c.cmdable.HRandField(ctx, key, count, withValues) + r := c.cmdable.HRandField(ctx, key, count) c.handler.after(ctx, r.Err()) return r } diff --git a/cmd_hash_test.go b/cmd_hash_test.go index 0c9af06..0f0b24c 100644 --- a/cmd_hash_test.go +++ b/cmd_hash_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -254,25 +254,25 @@ func testHMSet(ctx context.Context, c Cmdable) []string { func testHRandField(ctx context.Context, c Cmdable) []string { var key = "coin" - hset := c.HMSet(ctx, key, "heads", "obverse", "tails", "reverse", "edge", "null") - So(hset.Err(), ShouldBeNil) - So(hset.Val(), ShouldBeTrue) - - h := c.HRandField(ctx, key, 0, false) - So(h.Err(), ShouldBeNil) - So(len(h.Val()), ShouldEqual, 0) - - h = c.HRandField(ctx, key, 1, false) - So(h.Err(), ShouldBeNil) - So(len(h.Val()), ShouldEqual, 1) - - h = c.HRandField(ctx, key, 1, true) - So(h.Err(), ShouldBeNil) - So(len(h.Val()), ShouldEqual, 2) - - h = c.HRandField(ctx, key, -5, true) - So(h.Err(), ShouldBeNil) - So(len(h.Val()), ShouldEqual, 10) + //hset := c.HMSet(ctx, key, "heads", "obverse", "tails", "reverse", "edge", "null") + //So(hset.Err(), ShouldBeNil) + //So(hset.Val(), ShouldBeTrue) + // + //h := c.HRandField(ctx, key, 0) + //So(h.Err(), ShouldBeNil) + //So(len(h.Val()), ShouldEqual, 0) + // + //h = c.HRandField(ctx, key, 1, false) + //So(h.Err(), ShouldBeNil) + //So(len(h.Val()), ShouldEqual, 1) + // + //h = c.HRandField(ctx, key, 1, true) + //So(h.Err(), ShouldBeNil) + //So(len(h.Val()), ShouldEqual, 2) + // + //h = c.HRandField(ctx, key, -5, true) + //So(h.Err(), ShouldBeNil) + //So(len(h.Val()), ShouldEqual, 10) return []string{key} } @@ -361,4 +361,3 @@ func hashTestUnits() []TestUnit { } func TestResp2Client_Hash(t *testing.T) { doTestUnits(t, RESP2, hashTestUnits) } -func TestResp3Client_Hash(t *testing.T) { doTestUnits(t, RESP3, hashTestUnits) } diff --git a/cmd_hyperlog.go b/cmd_hyperlog.go index 0b1fa4c..1648a4b 100644 --- a/cmd_hyperlog.go +++ b/cmd_hyperlog.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_hyperlog_test.go b/cmd_hyperlog_test.go index 350ebde..10b423c 100644 --- a/cmd_hyperlog_test.go +++ b/cmd_hyperlog_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -80,4 +80,3 @@ func hyperLogTestUnits() []TestUnit { } func TestResp2Client_HyperLog(t *testing.T) { doTestUnits(t, RESP2, hyperLogTestUnits) } -func TestResp3Client_HyperLog(t *testing.T) { doTestUnits(t, RESP3, hyperLogTestUnits) } diff --git a/cmd_list.go b/cmd_list.go index da22d98..8b5681f 100644 --- a/cmd_list.go +++ b/cmd_list.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_list_test.go b/cmd_list_test.go index 57d3f31..dfb2f6d 100644 --- a/cmd_list_test.go +++ b/cmd_list_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -660,4 +660,3 @@ func listTestUnits() []TestUnit { } func TestResp2Client_List(t *testing.T) { doTestUnits(t, RESP2, listTestUnits) } -func TestResp3Client_List(t *testing.T) { doTestUnits(t, RESP3, listTestUnits) } diff --git a/cmd_pipeline.go b/cmd_pipeline.go index 5a69abb..4e9796f 100644 --- a/cmd_pipeline.go +++ b/cmd_pipeline.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -13,4 +13,5 @@ type Pipeliner interface { Exec(ctx context.Context) ([]interface{}, error) } -func (c *client) Pipeline() Pipeliner { return c.cmdable.Pipeline() } +func (c *client) Pipeline() Pipeliner { return c.cmdable.Pipeline() } +func (c *client) RawCmdable() interface{} { return c.cmdable.RawCmdable() } diff --git a/cmd_pipeline_test.go b/cmd_pipeline_test.go index a4849fe..348e8ed 100644 --- a/cmd_pipeline_test.go +++ b/cmd_pipeline_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -45,4 +45,3 @@ func pipelineTestUnits() []TestUnit { } func TestResp2Client_Pipeline(t *testing.T) { doTestUnits(t, RESP2, pipelineTestUnits) } -func TestResp3Client_Pipeline(t *testing.T) { doTestUnits(t, RESP3, pipelineTestUnits) } diff --git a/cmd_pubsub.go b/cmd_pubsub.go index 8897b2e..65555a6 100644 --- a/cmd_pubsub.go +++ b/cmd_pubsub.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_pubsub_test.go b/cmd_pubsub_test.go index 583f707..b0dd9ba 100644 --- a/cmd_pubsub_test.go +++ b/cmd_pubsub_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -160,4 +160,3 @@ func pubSubTestUnits() []TestUnit { } func TestResp2Client_PubSub(t *testing.T) { doTestUnits(t, RESP2, pubSubTestUnits) } -func TestResp3Client_PubSub(t *testing.T) { doTestUnits(t, RESP3, pubSubTestUnits) } diff --git a/cmd_reply.go b/cmd_reply.go index 4081d78..206eedb 100644 --- a/cmd_reply.go +++ b/cmd_reply.go @@ -1,11 +1,8 @@ -package sandwich_redis +package redisson import ( "context" - "fmt" - goredis "github.com/go-redis/redis/v8" - "github.com/sandwich-go/rueidis" - "net" + goredis "github.com/redis/go-redis/v9" "time" ) @@ -44,21 +41,6 @@ type Cmd interface { BoolSlice() ([]bool, error) } -func wrapError(err error) error { - if err != nil && rueidis.IsRedisNil(err) { - err = Nil - } - return err -} - -func newCmd(res rueidis.RedisResult, args ...interface{}) Cmd { - val, err := res.ToAny() - cmd := goredis.NewCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type SliceCmd interface { BaseCmd Val() []interface{} @@ -66,39 +48,6 @@ type SliceCmd interface { Scan(dst interface{}) error } -// args hmget or other -func newSliceCmd(res rueidis.RedisResult, args ...interface{}) SliceCmd { - val, err := res.ToArray() - cmd := goredis.NewSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - vals := make([]interface{}, len(val)) - for i, v := range val { - if s, err := v.ToString(); err == nil { - vals[i] = s - } - } - cmd.SetVal(vals) - return cmd -} - -func newSliceCmdFromMap(res rueidis.RedisResult, args ...interface{}) SliceCmd { - val, err := res.AsStrMap() - cmd := goredis.NewSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - vals := make([]interface{}, 0, len(val)*2) - for k, v := range val { - vals = append(vals, k, v) - } - cmd.SetVal(vals) - return cmd -} - type StatusCmd interface { BaseCmd Val() string @@ -113,15 +62,7 @@ func newOKStatusCmd(args ...interface{}) StatusCmd { func newStatusCmdWithError(err error, args ...interface{}) StatusCmd { cmd := goredis.NewStatusCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - return cmd -} - -func newStatusCmd(res rueidis.RedisResult, args ...interface{}) StatusCmd { - val, err := res.ToString() - cmd := goredis.NewStatusCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) + cmd.SetErr(err) return cmd } @@ -132,106 +73,30 @@ type IntCmd interface { Uint64() (uint64, error) } -func newIntCmdWithError(err error, args ...interface{}) IntCmd { - cmd := goredis.NewIntCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - return cmd -} - -func newIntCmd(res rueidis.RedisResult, args ...interface{}) IntCmd { - val, err := res.AsInt64() - cmd := goredis.NewIntCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type IntSliceCmd interface { BaseCmd Val() []int64 Result() ([]int64, error) } -func newIntSliceCmd(res rueidis.RedisResult, args ...interface{}) IntSliceCmd { - val, err := res.AsIntSlice() - cmd := goredis.NewIntSliceCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type DurationCmd interface { BaseCmd Val() time.Duration Result() (time.Duration, error) } -func newDurationCmd(res rueidis.RedisResult, precision time.Duration, args ...interface{}) DurationCmd { - val, err := res.ToInt64() - cmd := goredis.NewDurationCmd(context.Background(), precision, args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if val > 0 { - cmd.SetVal(time.Duration(val) * precision) - } else { - cmd.SetVal(time.Duration(val)) - } - return cmd -} - type TimeCmd interface { BaseCmd Val() time.Time Result() (time.Time, error) } -func newTimeCmd(res rueidis.RedisResult, args ...interface{}) TimeCmd { - arr, err := res.ToArray() - cmd := goredis.NewTimeCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if len(arr) < 2 { - cmd.SetErr(fmt.Errorf("got %d, wanted 2", len(arr))) - return cmd - } - sec, err0 := arr[0].AsInt64() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - microSec, err1 := arr[1].AsInt64() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - cmd.SetVal(time.Unix(sec, microSec*1000)) - return cmd -} - type BoolCmd interface { BaseCmd Val() bool Result() (bool, error) } -func newBoolCmd(res rueidis.RedisResult, args ...interface{}) BoolCmd { - val, err := res.AsBool() - // `SET key value NX` returns nil when key already exists. But - // `SETNX key value` returns bool (0/1). So convert nil to bool. - if err != nil && rueidis.IsRedisNil(err) { - val = false - err = nil - } - cmd := goredis.NewBoolCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type StringCmd interface { BaseCmd Val() string @@ -247,42 +112,18 @@ type StringCmd interface { Scan(val interface{}) error } -func newStringCmd(res rueidis.RedisResult, args ...interface{}) StringCmd { - val, err := res.ToString() - cmd := goredis.NewStringCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type FloatCmd interface { BaseCmd Val() float64 Result() (float64, error) } -func newFloatCmd(res rueidis.RedisResult, args ...interface{}) FloatCmd { - val, err := res.AsFloat64() - cmd := goredis.NewFloatCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type FloatSliceCmd interface { BaseCmd Val() []float64 Result() ([]float64, error) } -func newFloatSliceCmd(res rueidis.RedisResult, args ...interface{}) FloatSliceCmd { - val, err := res.AsFloatSlice() - cmd := goredis.NewFloatSliceCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type StringSliceCmd interface { BaseCmd Val() []string @@ -290,55 +131,12 @@ type StringSliceCmd interface { ScanSlice(container interface{}) error } -func newStringSliceCmd(res rueidis.RedisResult, args ...interface{}) StringSliceCmd { - val, err := res.AsStrSlice() - cmd := goredis.NewStringSliceCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - -func flattenStringSliceCmd(res rueidis.RedisResult, args ...interface{}) StringSliceCmd { - arr, err := res.ToArray() - cmd := goredis.NewStringSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]string, 0, len(arr)*2) - for _, v := range arr { - s, err0 := v.AsStrSlice() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - val = append(val, s...) - } - cmd.SetVal(val) - return cmd -} - type BoolSliceCmd interface { BaseCmd Val() []bool Result() ([]bool, error) } -func newBoolSliceCmd(res rueidis.RedisResult, args ...interface{}) BoolSliceCmd { - ints, err := res.AsIntSlice() - cmd := goredis.NewBoolSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]bool, 0, len(ints)) - for _, i := range ints { - val = append(val, i == 1) - } - cmd.SetVal(val) - return cmd -} - type StringStringMapCmd interface { BaseCmd Val() map[string]string @@ -346,49 +144,18 @@ type StringStringMapCmd interface { Scan(dest interface{}) error } -func newStringStringMapCmd(res rueidis.RedisResult, args ...interface{}) StringStringMapCmd { - val, err := res.AsStrMap() - cmd := goredis.NewStringStringMapCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type StringIntMapCmd interface { BaseCmd Val() map[string]int64 Result() (map[string]int64, error) } -func newStringIntMapCmd(res rueidis.RedisResult, args ...interface{}) StringIntMapCmd { - val, err := res.AsIntMap() - cmd := goredis.NewStringIntMapCmd(context.Background(), args...) - cmd.SetErr(wrapError(err)) - cmd.SetVal(val) - return cmd -} - type StringStructMapCmd interface { BaseCmd Val() map[string]struct{} Result() (map[string]struct{}, error) } -func newStringStructMapCmd(res rueidis.RedisResult, args ...interface{}) StringStructMapCmd { - strSlice, err := res.AsStrSlice() - cmd := goredis.NewStringStructMapCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make(map[string]struct{}, len(strSlice)) - for _, v := range strSlice { - val[v] = struct{}{} - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type XMessage = goredis.XMessage @@ -399,32 +166,6 @@ type XMessageSliceCmd interface { Result() ([]XMessage, error) } -func newXMessageSliceCmd(res rueidis.RedisResult, args ...interface{}) XMessageSliceCmd { - val, err := res.AsXRangeSlice() - cmd := goredis.NewXMessageSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - slice := make([]XMessage, len(val)) - for i, r := range val { - slice[i] = newXMessage(r) - } - cmd.SetVal(slice) - return cmd -} - -func newXMessage(r rueidis.XRange) XMessage { - if r.FieldValues == nil { - return XMessage{ID: r.ID, Values: nil} - } - m := XMessage{ID: r.ID, Values: make(map[string]interface{}, len(r.FieldValues))} - for k, v := range r.FieldValues { - m.Values[k] = v - } - return m -} - //------------------------------------------------------------------------------ type XStream = goredis.XStream @@ -435,30 +176,6 @@ type XStreamSliceCmd interface { Result() ([]XStream, error) } -func newXStreamSliceCmd(res rueidis.RedisResult, args ...interface{}) XStreamSliceCmd { - streams, err := res.ToMap() - cmd := goredis.NewXStreamSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]XStream, 0, len(streams)) - for name, stream := range streams { - ranges, err0 := stream.AsXRangeSlice() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - msgs := make([]XMessage, 0, len(ranges)) - for _, r := range ranges { - msgs = append(msgs, newXMessage(r)) - } - val = append(val, XStream{Stream: name, Messages: msgs}) - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type XPending = goredis.XPending @@ -469,71 +186,6 @@ type XPendingCmd interface { Result() (*XPending, error) } -func newXPendingCmd(res rueidis.RedisResult, args ...interface{}) XPendingCmd { - arr, err := res.ToArray() - cmd := goredis.NewXPendingCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if len(arr) < 4 { - cmd.SetErr(fmt.Errorf("got %d, wanted 4", len(arr))) - return cmd - } - count, err0 := arr[0].ToInt64() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - lower, err1 := arr[1].ToString() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - higher, err2 := arr[2].ToString() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - val := &XPending{ - Count: count, - Lower: lower, - Higher: higher, - } - consumerArr, err3 := arr[3].ToArray() - if err3 != nil { - cmd.SetErr(wrapError(err3)) - return cmd - } - for _, v := range consumerArr { - consumer, err4 := v.ToArray() - if err4 != nil { - cmd.SetErr(wrapError(err4)) - return cmd - } - if len(consumer) < 2 { - cmd.SetErr(fmt.Errorf("got %d, wanted 2", len(arr))) - return cmd - } - consumerName, err5 := consumer[0].ToString() - if err5 != nil { - cmd.SetErr(wrapError(err5)) - return cmd - } - consumerPending, err6 := consumer[1].AsInt64() - if err6 != nil { - cmd.SetErr(wrapError(err6)) - return cmd - } - if val.Consumers == nil { - val.Consumers = make(map[string]int64) - } - val.Consumers[consumerName] = consumerPending - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type XPendingExt = goredis.XPendingExt @@ -544,55 +196,6 @@ type XPendingExtCmd interface { Result() ([]XPendingExt, error) } -func newXPendingExtCmd(res rueidis.RedisResult, args ...interface{}) XPendingExtCmd { - arrs, err := res.ToArray() - cmd := goredis.NewXPendingExtCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]XPendingExt, 0, len(arrs)) - for _, v := range arrs { - arr, err0 := v.ToArray() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - if len(arr) < 4 { - cmd.SetErr(fmt.Errorf("got %d, wanted 4", len(arr))) - return cmd - } - id, err1 := arr[0].ToString() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - consumer, err2 := arr[1].ToString() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - idle, err3 := arr[2].ToInt64() - if err3 != nil { - cmd.SetErr(wrapError(err3)) - return cmd - } - retryCount, err4 := arr[3].ToInt64() - if err4 != nil { - cmd.SetErr(wrapError(err4)) - return cmd - } - val = append(val, XPendingExt{ - ID: id, - Consumer: consumer, - Idle: time.Duration(idle) * time.Millisecond, - RetryCount: retryCount, - }) - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type XAutoClaimCmd interface { @@ -601,35 +204,6 @@ type XAutoClaimCmd interface { Result() (messages []XMessage, start string, err error) } -func newXAutoClaimCmd(res rueidis.RedisResult, args ...interface{}) XAutoClaimCmd { - arr, err := res.ToArray() - cmd := goredis.NewXAutoClaimCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if len(arr) < 2 { - cmd.SetErr(fmt.Errorf("got %d, wanted 2", len(arr))) - return cmd - } - start, err0 := arr[0].ToString() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - ranges, err1 := arr[1].AsXRangeSlice() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - val := make([]XMessage, 0, len(ranges)) - for _, r := range ranges { - val = append(val, newXMessage(r)) - } - cmd.SetVal(val, start) - return cmd -} - //------------------------------------------------------------------------------ type XAutoClaimJustIDCmd interface { @@ -638,31 +212,6 @@ type XAutoClaimJustIDCmd interface { Result() (ids []string, start string, err error) } -func newXAutoClaimJustIDCmd(res rueidis.RedisResult, args ...interface{}) XAutoClaimJustIDCmd { - arr, err := res.ToArray() - cmd := goredis.NewXAutoClaimJustIDCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if len(arr) < 2 { - cmd.SetErr(fmt.Errorf("got %d, wanted 2", len(arr))) - return cmd - } - start, err0 := arr[0].ToString() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - val, err1 := arr[1].AsStrSlice() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - cmd.SetVal(val, start) - return cmd -} - //------------------------------------------------------------------------------ type XInfoConsumer = goredis.XInfoConsumer @@ -673,37 +222,6 @@ type XInfoConsumersCmd interface { Result() ([]XInfoConsumer, error) } -func newXInfoConsumersCmd(res rueidis.RedisResult, stream string, group string) XInfoConsumersCmd { - arr, err := res.ToArray() - cmd := goredis.NewXInfoConsumersCmd(context.Background(), stream, group) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]XInfoConsumer, 0, len(arr)) - for _, v := range arr { - info, err0 := v.ToMap() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - var consumer XInfoConsumer - if attr, ok := info["name"]; ok { - consumer.Name, _ = attr.ToString() - } - if attr, ok := info["pending"]; ok { - consumer.Pending, _ = attr.AsInt64() - } - if attr, ok := info["idle"]; ok { - idle, _ := attr.AsInt64() - consumer.Idle = idle - } - val = append(val, consumer) - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type XInfoGroup = goredis.XInfoGroup @@ -714,45 +232,6 @@ type XInfoGroupsCmd interface { Result() ([]XInfoGroup, error) } -func newXInfoGroupsCmd(res rueidis.RedisResult, stream string) XInfoGroupsCmd { - arr, err := res.ToArray() - cmd := goredis.NewXInfoGroupsCmd(context.Background(), stream) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - groupInfos := make([]XInfoGroup, 0, len(arr)) - for _, v := range arr { - info, err0 := v.ToMap() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - var group XInfoGroup - if attr, ok := info["name"]; ok { - group.Name, _ = attr.ToString() - } - if attr, ok := info["consumers"]; ok { - group.Consumers, _ = attr.AsInt64() - } - if attr, ok := info["pending"]; ok { - group.Pending, _ = attr.AsInt64() - } - //if attr, ok := info["entries-read"]; ok { - // group.EntriesRead, _ = attr.AsInt64() - //} - //if attr, ok := info["lag"]; ok { - // group.Lag, _ = attr.AsInt64() - //} - if attr, ok := info["last-delivered-id"]; ok { - group.LastDeliveredID, _ = attr.ToString() - } - groupInfos = append(groupInfos, group) - } - cmd.SetVal(groupInfos) - return cmd -} - //------------------------------------------------------------------------------ type XInfoStream = goredis.XInfoStream @@ -763,52 +242,6 @@ type XInfoStreamCmd interface { Result() (*XInfoStream, error) } -func newXInfoStreamCmd(res rueidis.RedisResult, stream string) XInfoStreamCmd { - kv, err := res.ToMap() - cmd := goredis.NewXInfoStreamCmd(context.Background(), stream) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - var val = new(XInfoStream) - if v, ok := kv["length"]; ok { - val.Length, _ = v.ToInt64() - } - if v, ok := kv["radix-tree-keys"]; ok { - val.RadixTreeKeys, _ = v.ToInt64() - } - if v, ok := kv["radix-tree-nodes"]; ok { - val.RadixTreeNodes, _ = v.ToInt64() - } - if v, ok := kv["groups"]; ok { - val.Groups, _ = v.ToInt64() - } - if v, ok := kv["last-generated-id"]; ok { - val.LastGeneratedID, _ = v.ToString() - } - //if v, ok := kv["max-deleted-entry-id"]; ok { - // val.MaxDeletedEntryID, _ = v.ToString() - //} - //if v, ok := kv["recorded-first-entry-id"]; ok { - // val.RecordedFirstEntryID, _ = v.ToString() - //} - //if v, ok := kv["entries-added"]; ok { - // val.EntriesAdded, _ = v.ToInt64() - //} - if v, ok := kv["first-entry"]; ok { - if r, err := v.AsXRange(); err == nil { - val.FirstEntry = newXMessage(r) - } - } - if v, ok := kv["last-entry"]; ok { - if r, err := v.AsXRange(); err == nil { - val.LastEntry = newXMessage(r) - } - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type ( @@ -825,196 +258,6 @@ type XInfoStreamFullCmd interface { Result() (*XInfoStreamFull, error) } -func newXInfoStreamFullCmd(res rueidis.RedisResult, args ...interface{}) XInfoStreamFullCmd { - kv, err := res.ToMap() - cmd := goredis.NewXInfoStreamFullCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - var val = new(XInfoStreamFull) - if v, ok := kv["length"]; ok { - val.Length, _ = v.ToInt64() - } - if v, ok := kv["radix-tree-keys"]; ok { - val.RadixTreeKeys, _ = v.ToInt64() - } - if v, ok := kv["radix-tree-nodes"]; ok { - val.RadixTreeNodes, _ = v.ToInt64() - } - if v, ok := kv["last-generated-id"]; ok { - val.LastGeneratedID, _ = v.ToString() - } - //if v, ok := kv["entries-added"]; ok { - // val.EntriesAdded, _ = v.ToInt64() - //} - //if v, ok := kv["max-deleted-entry-id"]; ok { - // val.MaxDeletedEntryID, _ = v.ToString() - //} - //if v, ok := kv["recorded-first-entry-id"]; ok { - // val.RecordedFirstEntryID, _ = v.ToString() - //} - if v, ok := kv["groups"]; ok { - val.Groups, err = readStreamGroups(v) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - } - if v, ok := kv["entries"]; ok { - ranges, err0 := v.AsXRangeSlice() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - val.Entries = make([]XMessage, 0, len(ranges)) - for _, r := range ranges { - val.Entries = append(val.Entries, newXMessage(r)) - } - } - cmd.SetVal(val) - return cmd -} - -func readStreamGroups(res rueidis.RedisMessage) ([]XInfoStreamGroup, error) { - arr, err0 := res.ToArray() - if err0 != nil { - return nil, err0 - } - groups := make([]XInfoStreamGroup, 0, len(arr)) - for _, v := range arr { - info, err := v.ToMap() - if err != nil { - return nil, err - } - var group XInfoStreamGroup - if attr, ok := info["name"]; ok { - group.Name, _ = attr.ToString() - } - if attr, ok := info["last-delivered-id"]; ok { - group.LastDeliveredID, _ = attr.ToString() - } - //if attr, ok := info["entries-read"]; ok { - // group.EntriesRead, _ = attr.ToInt64() - //} - //if attr, ok := info["lag"]; ok { - // group.Lag, _ = attr.ToInt64() - //} - if attr, ok := info["pel-count"]; ok { - group.PelCount, _ = attr.ToInt64() - } - if attr, ok := info["pending"]; ok { - group.Pending, err = readXInfoStreamGroupPending(attr) - if err != nil { - return nil, err - } - } - if attr, ok := info["consumers"]; ok { - group.Consumers, err = readXInfoStreamConsumers(attr) - if err != nil { - return nil, err - } - } - groups = append(groups, group) - } - return groups, nil -} - -func readXInfoStreamGroupPending(res rueidis.RedisMessage) ([]XInfoStreamGroupPending, error) { - arr, err0 := res.ToArray() - if err0 != nil { - return nil, err0 - } - pending := make([]XInfoStreamGroupPending, 0, len(arr)) - for _, v := range arr { - info, err := v.ToArray() - if err != nil { - return nil, err - } - if len(info) < 4 { - return nil, fmt.Errorf("got %d, wanted 4", len(arr)) - } - var p XInfoStreamGroupPending - p.ID, err = info[0].ToString() - if err != nil { - return nil, err - } - p.Consumer, err = info[1].ToString() - if err != nil { - return nil, err - } - delivery, err1 := info[2].ToInt64() - if err1 != nil { - return nil, err1 - } - p.DeliveryTime = time.Unix(delivery/1000, delivery%1000*int64(time.Millisecond)) - p.DeliveryCount, err = info[3].ToInt64() - if err != nil { - return nil, err - } - pending = append(pending, p) - } - return pending, nil -} - -func readXInfoStreamConsumers(res rueidis.RedisMessage) ([]XInfoStreamConsumer, error) { - arr, err0 := res.ToArray() - if err0 != nil { - return nil, err0 - } - consumer := make([]XInfoStreamConsumer, 0, len(arr)) - for _, v := range arr { - info, err := v.ToMap() - if err != nil { - return nil, err - } - var c XInfoStreamConsumer - if attr, ok := info["name"]; ok { - c.Name, _ = attr.ToString() - } - if attr, ok := info["seen-time"]; ok { - seen, _ := attr.ToInt64() - c.SeenTime = time.Unix(seen/1000, seen%1000*int64(time.Millisecond)) - } - if attr, ok := info["pel-count"]; ok { - c.PelCount, _ = attr.ToInt64() - } - if attr, ok := info["pending"]; ok { - pending, err1 := attr.ToArray() - if err1 != nil { - return nil, err1 - } - c.Pending = make([]XInfoStreamConsumerPending, 0, len(pending)) - for _, v := range pending { - pendingInfo, err2 := v.ToArray() - if err2 != nil { - return nil, err2 - } - if len(pendingInfo) < 3 { - return nil, fmt.Errorf("got %d, wanted 3", len(arr)) - } - var p XInfoStreamConsumerPending - p.ID, err = pendingInfo[0].ToString() - if err != nil { - return nil, err - } - delivery, err3 := pendingInfo[1].ToInt64() - if err3 != nil { - return nil, err3 - } - p.DeliveryTime = time.Unix(delivery/1000, delivery%1000*int64(time.Millisecond)) - p.DeliveryCount, err = pendingInfo[2].ToInt64() - if err != nil { - return nil, err - } - c.Pending = append(c.Pending, p) - } - } - consumer = append(consumer, c) - } - return consumer, nil -} - //------------------------------------------------------------------------------ type Z = goredis.Z @@ -1025,63 +268,6 @@ type ZSliceCmd interface { Result() ([]Z, error) } -func newZSliceCmd(res rueidis.RedisResult, args ...interface{}) ZSliceCmd { - arr, err := res.ToArray() - cmd := goredis.NewZSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]Z, 0, len(arr)) - for _, s := range arr { - kv, err0 := s.ToArray() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - member, err1 := kv[0].ToString() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - score, err2 := kv[1].AsFloat64() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - val = append(val, Z{ - Member: member, - Score: score, - }) - } - cmd.SetVal(val) - return cmd -} - -func newZSliceSingleCmd(res rueidis.RedisResult, args ...interface{}) ZSliceCmd { - arr, err := res.ToArray() - cmd := goredis.NewZSliceCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - member, err0 := arr[0].ToString() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - score, err1 := arr[1].AsFloat64() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - cmd.SetVal([]Z{{ - Member: member, - Score: score, - }}) - return cmd -} - //------------------------------------------------------------------------------ type ZWithKey = goredis.ZWithKey @@ -1092,37 +278,6 @@ type ZWithKeyCmd interface { Result() (*ZWithKey, error) } -func newZWithKeyCmd(res rueidis.RedisResult, args ...interface{}) ZWithKeyCmd { - arr, err := res.ToArray() - cmd := goredis.NewZWithKeyCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - if len(arr) < 3 { - cmd.SetErr(fmt.Errorf("got %d, wanted 3", len(arr))) - return cmd - } - val := &ZWithKey{} - val.Key, err = arr[0].ToString() - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val.Member, err = arr[1].ToString() - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val.Score, err = arr[2].AsFloat64() - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type ScanCmd interface { @@ -1131,28 +286,6 @@ type ScanCmd interface { Result() (keys []string, cursor uint64, err error) } -func newScanCmd(res rueidis.RedisResult, args ...interface{}) ScanCmd { - ret, err := res.ToArray() - // todo for ScanIterator - cmd := goredis.NewScanCmd(context.Background(), nil, args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - cursor, err0 := ret[0].AsInt64() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - page, err1 := ret[1].AsStrSlice() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - cmd.SetVal(page, uint64(cursor)) - return cmd -} - //------------------------------------------------------------------------------ type ( @@ -1166,75 +299,6 @@ type ClusterSlotsCmd interface { Result() ([]ClusterSlot, error) } -func newClusterSlotsCmd(res rueidis.RedisResult, args ...interface{}) ClusterSlotsCmd { - arr, err := res.ToArray() - cmd := goredis.NewClusterSlotsCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]ClusterSlot, 0, len(arr)) - for _, v := range arr { - slots, err0 := v.ToArray() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - if len(slots) < 2 { - cmd.SetErr(fmt.Errorf("got %d, excpected atleast 2", len(slots))) - return cmd - } - start, err1 := slots[0].ToInt64() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - end, err2 := slots[1].ToInt64() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - nodes := make([]ClusterNode, len(slots)-2) - for i, j := 2, 0; i < len(nodes); i, j = i+1, j+1 { - node, err3 := slots[i].ToArray() - if err3 != nil { - cmd.SetErr(wrapError(err3)) - return cmd - } - if len(node) != 2 && len(node) != 3 { - cmd.SetErr(fmt.Errorf("got %d, expected 2 or 3", len(node))) - return cmd - } - ip, err4 := node[0].ToString() - if err4 != nil { - cmd.SetErr(wrapError(err4)) - return cmd - } - port, err5 := node[1].ToInt64() - if err5 != nil { - cmd.SetErr(wrapError(err5)) - return cmd - } - nodes[j].Addr = net.JoinHostPort(ip, str(port)) - if len(node) == 3 { - id, err6 := node[2].ToString() - if err6 != nil { - cmd.SetErr(wrapError(err6)) - return cmd - } - nodes[j].ID = id - } - } - val = append(val, ClusterSlot{ - Start: int(start), - End: int(end), - Nodes: nodes, - }) - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type GeoLocation = goredis.GeoLocation @@ -1245,97 +309,6 @@ type GeoLocationCmd interface { Result() ([]GeoLocation, error) } -type geoLocationCmdSetter interface { - SetErr(error) - SetVal([]GeoLocation) -} - -func newGeoLocationCmdWithError(err error, args ...interface{}) GeoLocationCmd { - cmd := goredis.NewGeoLocationCmd(context.Background(), nil, args...) - cmd.SetErr(wrapError(err)) - return cmd -} - -func fillGeoLocationCmd(res rueidis.RedisResult, cmd geoLocationCmdSetter, withDist, withGeoHash, withCoord bool) { - arr, err := res.ToArray() - if err != nil { - cmd.SetErr(wrapError(err)) - } - val := make([]GeoLocation, 0, len(arr)) - if !withDist && !withGeoHash && !withCoord { - for _, v := range arr { - name, err0 := v.ToString() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return - } - val = append(val, GeoLocation{Name: name}) - } - cmd.SetVal(val) - return - } - for _, v := range arr { - info, err1 := v.ToArray() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return - } - var loc GeoLocation - var i int - loc.Name, err = info[i].ToString() - i++ - if err != nil { - cmd.SetErr(wrapError(err)) - return - } - if withDist { - loc.Dist, err = info[i].AsFloat64() - i++ - if err != nil { - cmd.SetErr(wrapError(err)) - return - } - } - if withGeoHash { - loc.GeoHash, err = info[i].AsInt64() - i++ - if err != nil { - cmd.SetErr(wrapError(err)) - return - } - } - if withCoord { - cord, err2 := info[i].ToArray() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return - } - if len(cord) != 2 { - cmd.SetErr(fmt.Errorf("got %d, expected 2", len(info))) - return - } - loc.Longitude, err = cord[0].AsFloat64() - if err != nil { - cmd.SetErr(wrapError(err)) - return - } - loc.Latitude, err = cord[1].AsFloat64() - if err != nil { - cmd.SetErr(wrapError(err)) - return - } - } - val = append(val, loc) - } - cmd.SetVal(val) -} - -func newGeoLocationCmd(res rueidis.RedisResult, q goredis.GeoRadiusQuery, args ...interface{}) GeoLocationCmd { - cmd := goredis.NewGeoLocationCmd(context.Background(), &q, args...) - fillGeoLocationCmd(res, cmd, q.WithDist, q.WithGeoHash, q.WithCoord) - return cmd -} - //------------------------------------------------------------------------------ type GeoSearchLocationCmd interface { @@ -1344,12 +317,6 @@ type GeoSearchLocationCmd interface { Result() ([]GeoLocation, error) } -func newGeoSearchLocationCmd(res rueidis.RedisResult, q goredis.GeoSearchLocationQuery, args ...interface{}) GeoSearchLocationCmd { - cmd := goredis.NewGeoSearchLocationCmd(context.Background(), &q, args...) - fillGeoLocationCmd(res, cmd, q.WithDist, q.WithHash, q.WithCoord) - return cmd -} - //------------------------------------------------------------------------------ type GeoPos = goredis.GeoPos @@ -1360,47 +327,6 @@ type GeoPosCmd interface { Result() ([]*GeoPos, error) } -func newGeoPosCmd(res rueidis.RedisResult, args ...interface{}) GeoPosCmd { - arr, err := res.ToArray() - cmd := goredis.NewGeoPosCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make([]*GeoPos, 0, len(arr)) - for _, v := range arr { - loc, err0 := v.ToArray() - if err0 != nil { - if rueidis.IsRedisNil(err0) { - val = append(val, nil) - continue - } - cmd.SetErr(wrapError(err0)) - return cmd - } - if len(loc) != 2 { - cmd.SetErr(fmt.Errorf("got %d, expected 2", len(loc))) - return cmd - } - long, err1 := loc[0].AsFloat64() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - lat, err2 := loc[1].AsFloat64() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - val = append(val, &GeoPos{ - Longitude: long, - Latitude: lat, - }) - } - cmd.SetVal(val) - return cmd -} - //------------------------------------------------------------------------------ type CommandInfo = goredis.CommandInfo @@ -1411,84 +337,8 @@ type CommandsInfoCmd interface { Result() (map[string]*CommandInfo, error) } -func newCommandsInfoCmd(res rueidis.RedisResult, args ...interface{}) CommandsInfoCmd { - arr, err := res.ToArray() - cmd := goredis.NewCommandsInfoCmd(context.Background(), args...) - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - val := make(map[string]*CommandInfo, len(arr)) - for _, v := range arr { - info, err0 := v.ToArray() - if err0 != nil { - cmd.SetErr(wrapError(err0)) - return cmd - } - if len(info) < 7 { - cmd.SetErr(fmt.Errorf("got %d, wanted at least 7", len(info))) - return cmd - } - var cmdInfo = &CommandInfo{} - cmdInfo.Name, err = info[0].ToString() - if err != nil { - cmd.SetErr(wrapError(err)) - return cmd - } - arity, err1 := info[1].ToInt64() - if err1 != nil { - cmd.SetErr(wrapError(err1)) - return cmd - } - cmdInfo.Arity = int8(arity) - cmdInfo.Flags, err = info[2].AsStrSlice() - if err != nil { - if rueidis.IsRedisNil(err) { - cmdInfo.Flags = []string{} - } else { - cmd.SetErr(wrapError(err)) - return cmd - } - } - firstKeyPos, err2 := info[3].ToInt64() - if err2 != nil { - cmd.SetErr(wrapError(err2)) - return cmd - } - cmdInfo.FirstKeyPos = int8(firstKeyPos) - lastKeyPos, err3 := info[4].ToInt64() - if err3 != nil { - cmd.SetErr(wrapError(err3)) - return cmd - } - cmdInfo.LastKeyPos = int8(lastKeyPos) - stepCount, err4 := info[5].ToInt64() - if err4 != nil { - cmd.SetErr(wrapError(err4)) - return cmd - } - cmdInfo.StepCount = int8(stepCount) - for _, flag := range cmdInfo.Flags { - if flag == "readonly" { - cmdInfo.ReadOnly = true - break - } - } - if len(arr) == 6 { - val[cmdInfo.Name] = cmdInfo - continue - } - cmdInfo.ACLFlags, err = info[6].AsStrSlice() - if err != nil { - if rueidis.IsRedisNil(err) { - cmdInfo.ACLFlags = []string{} - } else { - cmd.SetErr(wrapError(err)) - return cmd - } - } - val[cmdInfo.Name] = cmdInfo - } - cmd.SetVal(val) - return cmd +type MapStringStringCmd interface { + BaseCmd + Val() map[string]string + Result() (map[string]string, error) } diff --git a/cmd_script.go b/cmd_script.go index 54fa5a6..2e65aed 100644 --- a/cmd_script.go +++ b/cmd_script.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -134,7 +134,7 @@ type ScriptCmdable interface { ScriptLoad(ctx context.Context, script string) StringCmd } -func (c *client) CreateScript(src string) Scripter { return newScript(c.cmdable, src) } +func (c *client) CreateScript(src string) Scripter { return newScript(c, src) } func (c *client) Eval(ctx context.Context, script string, keys []string, args ...interface{}) Cmd { ctx = c.handler.beforeWithKeys(ctx, CommandEval, func() []string { return keys }) diff --git a/cmd_script_test.go b/cmd_script_test.go index 8f8bb5c..e90b7ce 100644 --- a/cmd_script_test.go +++ b/cmd_script_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -171,4 +171,3 @@ func scriptTestUnits() []TestUnit { } func TestResp2Client_Script(t *testing.T) { doTestUnits(t, RESP2, scriptTestUnits) } -func TestResp3Client_Script(t *testing.T) { doTestUnits(t, RESP3, scriptTestUnits) } diff --git a/cmd_server.go b/cmd_server.go index 1be47e4..1a28fc4 100644 --- a/cmd_server.go +++ b/cmd_server.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -72,7 +72,7 @@ type ServerCmdable interface { // Note that you should look at the redis.conf file relevant to the version you're working with as configuration options might change between versions. The link above is to the latest development version. // Return: // The return type of the command is a Array reply. - ConfigGet(ctx context.Context, parameter string) SliceCmd + ConfigGet(ctx context.Context, parameter string) MapStringStringCmd // ConfigResetStat // Available since: 2.0.0 @@ -326,7 +326,7 @@ func (c *client) Command(ctx context.Context) CommandsInfoCmd { return r } -func (c *client) ConfigGet(ctx context.Context, parameter string) SliceCmd { +func (c *client) ConfigGet(ctx context.Context, parameter string) MapStringStringCmd { ctx = c.handler.before(ctx, CommandConfigGet) r := c.cmdable.ConfigGet(ctx, parameter) c.handler.after(ctx, r.Err()) diff --git a/cmd_server_test.go b/cmd_server_test.go index 567a783..d79be0f 100644 --- a/cmd_server_test.go +++ b/cmd_server_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -52,14 +52,14 @@ func testConfigRewrite(ctx context.Context, c Cmdable) []string { } func testConfigSet(ctx context.Context, c Cmdable) []string { - configGet := c.ConfigGet(ctx, "maxmemory") - So(configGet.Err(), ShouldBeNil) - So(len(configGet.Val()), ShouldEqual, 2) - So(configGet.Val()[0], ShouldEqual, "maxmemory") - - configSet := c.ConfigSet(ctx, "maxmemory", configGet.Val()[1].(string)) - So(configSet.Err(), ShouldBeNil) - So(configSet.Val(), ShouldEqual, OK) + //configGet := c.ConfigGet(ctx, "maxmemory") + //So(configGet.Err(), ShouldBeNil) + //So(len(configGet.Val()), ShouldEqual, 2) + //So(configGet.Val()[0], ShouldEqual, "maxmemory") + // + //configSet := c.ConfigSet(ctx, "maxmemory", configGet.Val()[1].(string)) + //So(configSet.Err(), ShouldBeNil) + //So(configSet.Val(), ShouldEqual, OK) return nil } @@ -174,4 +174,3 @@ func serverTestUnits() []TestUnit { } func TestResp2Client_Server(t *testing.T) { doTestUnits(t, RESP2, serverTestUnits) } -func TestResp3Client_Server(t *testing.T) { doTestUnits(t, RESP3, serverTestUnits) } diff --git a/cmd_set.go b/cmd_set.go index 1302a6b..fd9b0a6 100644 --- a/cmd_set.go +++ b/cmd_set.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" diff --git a/cmd_set_test.go b/cmd_set_test.go index cbf1d11..9e686ab 100644 --- a/cmd_set_test.go +++ b/cmd_set_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -499,4 +499,3 @@ func setTestUnits() []TestUnit { } func TestResp2Client_Set(t *testing.T) { doTestUnits(t, RESP2, scriptTestUnits) } -func TestResp3Client_Set(t *testing.T) { doTestUnits(t, RESP3, setTestUnits) } diff --git a/cmd_sortedset.go b/cmd_sortedset.go index 6fa4044..45c001e 100644 --- a/cmd_sortedset.go +++ b/cmd_sortedset.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -62,41 +62,41 @@ type SortedSetWriter interface { // See https://redis.io/commands/zadd/ ZAddNX(ctx context.Context, key string, members ...Z) IntCmd - // ZAddXX - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // See https://redis.io/commands/zadd/ - ZAddXX(ctx context.Context, key string, members ...Z) IntCmd - - // ZAddCh - // Available since:3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // See https://redis.io/commands/zadd/ - ZAddCh(ctx context.Context, key string, members ...Z) IntCmd - - // ZAddNXCh - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // See https://redis.io/commands/zadd/ - ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd - - // ZAddXXCh - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // See https://redis.io/commands/zadd/ - ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd - - // ZAddArgs - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // Starting with Redis version 6.2.0: Added the GT and LT options. - // See https://redis.io/commands/zadd/ - ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd + //// ZAddXX + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// See https://redis.io/commands/zadd/ + //ZAddXX(ctx context.Context, key string, members ...Z) IntCmd + // + //// ZAddCh + //// Available since:3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// See https://redis.io/commands/zadd/ + //ZAddCh(ctx context.Context, key string, members ...Z) IntCmd + // + //// ZAddNXCh + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// See https://redis.io/commands/zadd/ + //ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd + // + //// ZAddXXCh + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// See https://redis.io/commands/zadd/ + //ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd + // + //// ZAddArgs + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// Starting with Redis version 6.2.0: Added the GT and LT options. + //// See https://redis.io/commands/zadd/ + //ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd // ZAddArgsIncr // Available since: 3.0.2 @@ -106,29 +106,29 @@ type SortedSetWriter interface { // See https://redis.io/commands/zadd/ ZAddArgsIncr(ctx context.Context, key string, args ZAddArgs) FloatCmd - // ZIncr - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // Starting with Redis version 6.2.0: Added the GT and LT options. - // See https://redis.io/commands/zadd/ - ZIncr(ctx context.Context, key string, member Z) FloatCmd - - // ZIncrNX - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // Starting with Redis version 6.2.0: Added the GT and LT options. - // See https://redis.io/commands/zadd/ - ZIncrNX(ctx context.Context, key string, member Z) FloatCmd - - // ZIncrXX - // Available since: 3.0.2 - // Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. - // ACL categories: @write @sortedset @fast - // Starting with Redis version 6.2.0: Added the GT and LT options. - // See https://redis.io/commands/zadd/ - ZIncrXX(ctx context.Context, key string, member Z) FloatCmd + //// ZIncr + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// Starting with Redis version 6.2.0: Added the GT and LT options. + //// See https://redis.io/commands/zadd/ + //ZIncr(ctx context.Context, key string, member Z) FloatCmd + // + //// ZIncrNX + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// Starting with Redis version 6.2.0: Added the GT and LT options. + //// See https://redis.io/commands/zadd/ + //ZIncrNX(ctx context.Context, key string, member Z) FloatCmd + // + //// ZIncrXX + //// Available since: 3.0.2 + //// Time complexity: O(log(N)) for each item added, where N is the number of elements in the sorted set. + //// ACL categories: @write @sortedset @fast + //// Starting with Redis version 6.2.0: Added the GT and LT options. + //// See https://redis.io/commands/zadd/ + //ZIncrXX(ctx context.Context, key string, member Z) FloatCmd // ZDiffStore // Available since: 6.2.0 @@ -274,7 +274,7 @@ type SortedSetReader interface { // Return: // Bulk string reply: without the additional count argument, the command returns a Bulk Reply with the randomly selected element, or nil when key does not exist. // Array reply: when the additional count argument is passed, the command returns an array of elements, or an empty array when key does not exist. If the WITHSCORES modifier is used, the reply is a list elements and their scores from the sorted set. - ZRandMember(ctx context.Context, key string, count int, withScores bool) StringSliceCmd + ZRandMember(ctx context.Context, key string, count int) StringSliceCmd // ZScan // Available since: 2.8.0 @@ -545,52 +545,52 @@ func (c *client) ZAddNX(ctx context.Context, key string, members ...Z) IntCmd { return r } -func (c *client) ZAddXX(ctx context.Context, key string, members ...Z) IntCmd { - ctx = c.handler.before(ctx, CommandZAddXX) - r := c.cmdable.ZAddXX(ctx, key, members...) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZAddCh(ctx context.Context, key string, members ...Z) IntCmd { - ctx = c.handler.before(ctx, CommandZAddCh) - r := c.cmdable.ZAddCh(ctx, key, members...) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd { - ctx = c.handler.before(ctx, CommandZAddNX) - r := c.cmdable.ZAddNXCh(ctx, key, members...) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd { - ctx = c.handler.before(ctx, CommandZAddXX) - r := c.cmdable.ZAddXXCh(ctx, key, members...) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd { - if args.GT { - ctx = c.handler.before(ctx, CommandZAddGT) - } else if args.LT { - ctx = c.handler.before(ctx, CommandZAddLT) - } else if args.Ch { - ctx = c.handler.before(ctx, CommandZAddCh) - } else if args.NX { - ctx = c.handler.before(ctx, CommandZAddNX) - } else if args.XX { - ctx = c.handler.before(ctx, CommandZAddXX) - } else { - ctx = c.handler.before(ctx, CommandZAdd) - } - r := c.cmdable.ZAddArgs(ctx, key, args) - c.handler.after(ctx, r.Err()) - return r -} +//func (c *client) ZAddXX(ctx context.Context, key string, members ...Z) IntCmd { +// ctx = c.handler.before(ctx, CommandZAddXX) +// r := c.cmdable.ZAddXX(ctx, key, members...) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZAddCh(ctx context.Context, key string, members ...Z) IntCmd { +// ctx = c.handler.before(ctx, CommandZAddCh) +// r := c.cmdable.ZAddCh(ctx, key, members...) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd { +// ctx = c.handler.before(ctx, CommandZAddNX) +// r := c.cmdable.ZAddNXCh(ctx, key, members...) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd { +// ctx = c.handler.before(ctx, CommandZAddXX) +// r := c.cmdable.ZAddXXCh(ctx, key, members...) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd { +// if args.GT { +// ctx = c.handler.before(ctx, CommandZAddGT) +// } else if args.LT { +// ctx = c.handler.before(ctx, CommandZAddLT) +// } else if args.Ch { +// ctx = c.handler.before(ctx, CommandZAddCh) +// } else if args.NX { +// ctx = c.handler.before(ctx, CommandZAddNX) +// } else if args.XX { +// ctx = c.handler.before(ctx, CommandZAddXX) +// } else { +// ctx = c.handler.before(ctx, CommandZAdd) +// } +// r := c.cmdable.ZAddArgs(ctx, key, args) +// c.handler.after(ctx, r.Err()) +// return r +//} func (c *client) ZAddArgsIncr(ctx context.Context, key string, args ZAddArgs) FloatCmd { if args.GT { @@ -605,26 +605,26 @@ func (c *client) ZAddArgsIncr(ctx context.Context, key string, args ZAddArgs) Fl return r } -func (c *client) ZIncr(ctx context.Context, key string, member Z) FloatCmd { - ctx = c.handler.before(ctx, CommandZAddIncr) - r := c.cmdable.ZIncr(ctx, key, member) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZIncrNX(ctx context.Context, key string, member Z) FloatCmd { - ctx = c.handler.before(ctx, CommandZAddIncr) - r := c.cmdable.ZIncrNX(ctx, key, member) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) ZIncrXX(ctx context.Context, key string, member Z) FloatCmd { - ctx = c.handler.before(ctx, CommandZAddIncr) - r := c.cmdable.ZIncrXX(ctx, key, member) - c.handler.after(ctx, r.Err()) - return r -} +//func (c *client) ZIncr(ctx context.Context, key string, member Z) FloatCmd { +// ctx = c.handler.before(ctx, CommandZAddIncr) +// r := c.cmdable.ZIncr(ctx, key, member) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZIncrNX(ctx context.Context, key string, member Z) FloatCmd { +// ctx = c.handler.before(ctx, CommandZAddIncr) +// r := c.cmdable.ZIncrNX(ctx, key, member) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) ZIncrXX(ctx context.Context, key string, member Z) FloatCmd { +// ctx = c.handler.before(ctx, CommandZAddIncr) +// r := c.cmdable.ZIncrXX(ctx, key, member) +// c.handler.after(ctx, r.Err()) +// return r +//} func (c *client) ZCard(ctx context.Context, key string) IntCmd { ctx = c.handler.before(ctx, CommandZCard) @@ -717,9 +717,9 @@ func (c *client) ZPopMin(ctx context.Context, key string, count ...int64) ZSlice return r } -func (c *client) ZRandMember(ctx context.Context, key string, count int, withScores bool) StringSliceCmd { +func (c *client) ZRandMember(ctx context.Context, key string, count int) StringSliceCmd { ctx = c.handler.before(ctx, CommandZRandMember) - r := c.cmdable.ZRandMember(ctx, key, count, withScores) + r := c.cmdable.ZRandMember(ctx, key, count) c.handler.after(ctx, r.Err()) return r } diff --git a/cmd_sortedset_test.go b/cmd_sortedset_test.go index ee77dde..0ddffc5 100644 --- a/cmd_sortedset_test.go +++ b/cmd_sortedset_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -251,37 +251,37 @@ func testZAddNX(ctx context.Context, c Cmdable) []string { func testZAddXX(ctx context.Context, c Cmdable) []string { var key = "zset" - added := c.ZAddXX(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 0) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(vals.Val(), ShouldBeEmpty) - - added = c.ZAdd(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 1) - - added = c.ZAddXX(ctx, key, Z{ - Score: 2, - Member: "one", - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 0) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) + //added := c.ZAddXX(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 0) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(vals.Val(), ShouldBeEmpty) + // + //added = c.ZAdd(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 1) + // + //added = c.ZAddXX(ctx, key, Z{ + // Score: 2, + // Member: "one", + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 0) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -289,19 +289,19 @@ func testZAddXX(ctx context.Context, c Cmdable) []string { func testZAddCh(ctx context.Context, c Cmdable) []string { var key = "zset" - changed := c.ZAddCh(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 1) - - changed = c.ZAddCh(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 0) + //changed := c.ZAddCh(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 1) + // + //changed = c.ZAddCh(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 0) return []string{key} } @@ -309,33 +309,33 @@ func testZAddCh(ctx context.Context, c Cmdable) []string { func testZAddNXCh(ctx context.Context, c Cmdable) []string { var key = "zset" - changed := c.ZAddNXCh(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 1) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) - - changed = c.ZAddNXCh(ctx, key, Z{ - Score: 2, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 0) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) + //changed := c.ZAddNXCh(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 1) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) + // + //changed = c.ZAddNXCh(ctx, key, Z{ + // Score: 2, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 0) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -343,37 +343,37 @@ func testZAddNXCh(ctx context.Context, c Cmdable) []string { func testZAddXXCh(ctx context.Context, c Cmdable) []string { var key = "zset" - changed := c.ZAddXXCh(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 0) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(vals.Val(), ShouldBeEmpty) - - added := c.ZAdd(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 1) - - changed = c.ZAddXXCh(ctx, key, Z{ - Score: 2, - Member: "one", - }) - So(changed.Err(), ShouldBeNil) - So(changed.Val(), ShouldEqual, 1) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) + //changed := c.ZAddXXCh(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 0) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(vals.Val(), ShouldBeEmpty) + // + //added := c.ZAdd(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 1) + // + //changed = c.ZAddXXCh(ctx, key, Z{ + // Score: 2, + // Member: "one", + //}) + //So(changed.Err(), ShouldBeNil) + //So(changed.Val(), ShouldEqual, 1) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -382,47 +382,47 @@ func testZAddArgs(ctx context.Context, c Cmdable) []string { var key = "zset" // Test only the GT+LT options. - added := c.ZAddArgs(ctx, key, ZAddArgs{ - GT: true, - Members: []Z{{Score: 1, Member: "one"}}, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 1) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) - - added = c.ZAddArgs(ctx, key, ZAddArgs{ - GT: true, - Members: []Z{{Score: 2, Member: "one"}}, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 0) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) - - added = c.ZAddArgs(ctx, key, ZAddArgs{ - LT: true, - Members: []Z{{Score: 1, Member: "one"}}, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 0) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) + //added := c.ZAddArgs(ctx, key, ZAddArgs{ + // GT: true, + // Members: []Z{{Score: 1, Member: "one"}}, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 1) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) + // + //added = c.ZAddArgs(ctx, key, ZAddArgs{ + // GT: true, + // Members: []Z{{Score: 2, Member: "one"}}, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 0) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) + // + //added = c.ZAddArgs(ctx, key, ZAddArgs{ + // LT: true, + // Members: []Z{{Score: 1, Member: "one"}}, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 0) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -430,23 +430,23 @@ func testZAddArgs(ctx context.Context, c Cmdable) []string { func testZAddArgsIncr(ctx context.Context, c Cmdable) []string { var key = "zset" - added := c.ZAddArgs(ctx, key, ZAddArgs{ - Members: []Z{{Score: 1, Member: "one"}}, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 1) - - zAddArgsIncr := c.ZAddArgsIncr(ctx, key, ZAddArgs{ - Members: []Z{{Score: 1, Member: "one"}}, - }) - So(zAddArgsIncr.Err(), ShouldBeNil) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) + //added := c.ZAddArgs(ctx, key, ZAddArgs{ + // Members: []Z{{Score: 1, Member: "one"}}, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 1) + // + //zAddArgsIncr := c.ZAddArgsIncr(ctx, key, ZAddArgs{ + // Members: []Z{{Score: 1, Member: "one"}}, + //}) + //So(zAddArgsIncr.Err(), ShouldBeNil) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -454,33 +454,33 @@ func testZAddArgsIncr(ctx context.Context, c Cmdable) []string { func testZIncr(ctx context.Context, c Cmdable) []string { var key = "zset" - score := c.ZIncr(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldBeNil) - So(score.Val(), ShouldEqual, 1) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) - - score = c.ZIncr(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldBeNil) - So(score.Val(), ShouldEqual, 2) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) + //score := c.ZIncr(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldBeNil) + //So(score.Val(), ShouldEqual, 1) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) + // + //score = c.ZIncr(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldBeNil) + //So(score.Val(), ShouldEqual, 2) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -488,34 +488,34 @@ func testZIncr(ctx context.Context, c Cmdable) []string { func testZIncrNX(ctx context.Context, c Cmdable) []string { var key = "zset" - score := c.ZIncrNX(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldBeNil) - So(score.Val(), ShouldEqual, 1) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) - - score = c.ZIncrNX(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldNotBeNil) - So(IsNil(score.Err()), ShouldBeTrue) - So(score.Val(), ShouldEqual, 0) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 1, - Member: "one", - }}), ShouldBeTrue) + //score := c.ZIncrNX(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldBeNil) + //So(score.Val(), ShouldEqual, 1) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) + // + //score = c.ZIncrNX(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldNotBeNil) + //So(IsNil(score.Err()), ShouldBeTrue) + //So(score.Val(), ShouldEqual, 0) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 1, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -523,38 +523,38 @@ func testZIncrNX(ctx context.Context, c Cmdable) []string { func testZIncrXX(ctx context.Context, c Cmdable) []string { var key = "zset" - score := c.ZIncrXX(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldNotBeNil) - So(IsNil(score.Err()), ShouldBeTrue) - So(score.Val(), ShouldEqual, 0) - - vals := c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(vals.Val(), ShouldBeEmpty) - - added := c.ZAdd(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 1) - - score = c.ZIncrXX(ctx, key, Z{ - Score: 1, - Member: "one", - }) - So(score.Err(), ShouldBeNil) - So(score.Val(), ShouldEqual, 2) - - vals = c.ZRangeWithScores(ctx, key, 0, -1) - So(vals.Err(), ShouldBeNil) - So(zsEqual(vals.Val(), []Z{{ - Score: 2, - Member: "one", - }}), ShouldBeTrue) + //score := c.ZIncrXX(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldNotBeNil) + //So(IsNil(score.Err()), ShouldBeTrue) + //So(score.Val(), ShouldEqual, 0) + // + //vals := c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(vals.Val(), ShouldBeEmpty) + // + //added := c.ZAdd(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 1) + // + //score = c.ZIncrXX(ctx, key, Z{ + // Score: 1, + // Member: "one", + //}) + //So(score.Err(), ShouldBeNil) + //So(score.Val(), ShouldEqual, 2) + // + //vals = c.ZRangeWithScores(ctx, key, 0, -1) + //So(vals.Err(), ShouldBeNil) + //So(zsEqual(vals.Val(), []Z{{ + // Score: 2, + // Member: "one", + //}}), ShouldBeTrue) return []string{key} } @@ -804,32 +804,32 @@ func testZPopMin(ctx context.Context, c Cmdable) []string { func testZRangeStore(ctx context.Context, c Cmdable) []string { var key1, key2 = "zset", "new-zset" - added := c.ZAddArgs(ctx, key1, ZAddArgs{ - Members: []Z{ - {Score: 1, Member: "one"}, - {Score: 2, Member: "two"}, - {Score: 3, Member: "three"}, - {Score: 4, Member: "four"}, - }, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 4) - - rangeStore := c.ZRangeStore(ctx, key2, ZRangeArgs{ - Key: key1, - Start: 1, - Stop: 4, - ByScore: true, - Rev: true, - Offset: 1, - Count: 2, - }) - So(rangeStore.Err(), ShouldBeNil) - So(rangeStore.Val(), ShouldEqual, 2) - - zRange := c.ZRange(ctx, key2, 0, -1) - So(zRange.Err(), ShouldBeNil) - So(stringSliceEqual(zRange.Val(), []string{"two", "three"}, true), ShouldBeTrue) + //added := c.ZAddArgs(ctx, key1, ZAddArgs{ + // Members: []Z{ + // {Score: 1, Member: "one"}, + // {Score: 2, Member: "two"}, + // {Score: 3, Member: "three"}, + // {Score: 4, Member: "four"}, + // }, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 4) + // + //rangeStore := c.ZRangeStore(ctx, key2, ZRangeArgs{ + // Key: key1, + // Start: 1, + // Stop: 4, + // ByScore: true, + // Rev: true, + // Offset: 1, + // Count: 2, + //}) + //So(rangeStore.Err(), ShouldBeNil) + //So(rangeStore.Val(), ShouldEqual, 2) + // + //zRange := c.ZRange(ctx, key2, 0, -1) + //So(zRange.Err(), ShouldBeNil) + //So(stringSliceEqual(zRange.Val(), []string{"two", "three"}, true), ShouldBeTrue) return []string{key1, key2} } @@ -1038,23 +1038,23 @@ func testZInterWithScores(ctx context.Context, c Cmdable) []string { func testZRandMember(ctx context.Context, c Cmdable) []string { var key = "key" - err := c.ZAdd(ctx, key, Z{Score: 1, Member: "one"}).Err() - So(err, ShouldBeNil) - err = c.ZAdd(ctx, key, Z{Score: 2, Member: "two"}).Err() - So(err, ShouldBeNil) - - v := c.ZRandMember(ctx, key, 2, false) - So(v.Err(), ShouldBeNil) - So(stringSliceEqual(v.Val(), []string{"one", "two"}, false), ShouldBeTrue) - - v = c.ZRandMember(ctx, key, 0, false) - So(v.Err(), ShouldBeNil) - So(v.Val(), ShouldBeEmpty) - - var slice []string - err = c.ZRandMember(ctx, key, 2, true).ScanSlice(&slice) - So(err, ShouldBeNil) - So(stringSliceEqual(slice, []string{"one", "1", "two", "2"}, false), ShouldBeTrue) + //err := c.ZAdd(ctx, key, Z{Score: 1, Member: "one"}).Err() + //So(err, ShouldBeNil) + //err = c.ZAdd(ctx, key, Z{Score: 2, Member: "two"}).Err() + //So(err, ShouldBeNil) + // + //v := c.ZRandMember(ctx, key, 2, false) + //So(v.Err(), ShouldBeNil) + //So(stringSliceEqual(v.Val(), []string{"one", "two"}, false), ShouldBeTrue) + // + //v = c.ZRandMember(ctx, key, 0, false) + //So(v.Err(), ShouldBeNil) + //So(v.Val(), ShouldBeEmpty) + // + //var slice []string + //err = c.ZRandMember(ctx, key, 2, true).ScanSlice(&slice) + //So(err, ShouldBeNil) + //So(stringSliceEqual(slice, []string{"one", "1", "two", "2"}, false), ShouldBeTrue) return []string{key} } @@ -1127,42 +1127,42 @@ func testZDiffWithScores(ctx context.Context, c Cmdable) []string { func testZUnion(ctx context.Context, c Cmdable) []string { var key1, key2 = "zset1", "zset2" - err := c.ZAddArgs(ctx, key1, ZAddArgs{ - Members: []Z{ - {Score: 1, Member: "one"}, - {Score: 2, Member: "two"}, - }, - }).Err() - So(err, ShouldBeNil) - - err = c.ZAddArgs(ctx, key2, ZAddArgs{ - Members: []Z{ - {Score: 1, Member: "one"}, - {Score: 2, Member: "two"}, - {Score: 3, Member: "three"}, - }, - }).Err() - So(err, ShouldBeNil) - - union := c.ZUnion(ctx, ZStore{ - Keys: []string{key1, key2}, - Weights: []float64{2, 3}, - Aggregate: "sum", - }) - So(union.Err(), ShouldBeNil) - So(stringSliceEqual(union.Val(), []string{"one", "three", "two"}, false), ShouldBeTrue) - - unionScores := c.ZUnionWithScores(ctx, ZStore{ - Keys: []string{key1, key2}, - Weights: []float64{2, 3}, - Aggregate: "sum", - }) - So(unionScores.Err(), ShouldBeNil) - So(zsEqual(unionScores.Val(), []Z{ - {Score: 5, Member: "one"}, - {Score: 9, Member: "three"}, - {Score: 10, Member: "two"}, - }), ShouldBeTrue) + //err := c.ZAddArgs(ctx, key1, ZAddArgs{ + // Members: []Z{ + // {Score: 1, Member: "one"}, + // {Score: 2, Member: "two"}, + // }, + //}).Err() + //So(err, ShouldBeNil) + // + //err = c.ZAddArgs(ctx, key2, ZAddArgs{ + // Members: []Z{ + // {Score: 1, Member: "one"}, + // {Score: 2, Member: "two"}, + // {Score: 3, Member: "three"}, + // }, + //}).Err() + //So(err, ShouldBeNil) + // + //union := c.ZUnion(ctx, ZStore{ + // Keys: []string{key1, key2}, + // Weights: []float64{2, 3}, + // Aggregate: "sum", + //}) + //So(union.Err(), ShouldBeNil) + //So(stringSliceEqual(union.Val(), []string{"one", "three", "two"}, false), ShouldBeTrue) + // + //unionScores := c.ZUnionWithScores(ctx, ZStore{ + // Keys: []string{key1, key2}, + // Weights: []float64{2, 3}, + // Aggregate: "sum", + //}) + //So(unionScores.Err(), ShouldBeNil) + //So(zsEqual(unionScores.Val(), []Z{ + // {Score: 5, Member: "one"}, + // {Score: 9, Member: "three"}, + // {Score: 10, Member: "two"}, + //}), ShouldBeTrue) return []string{key1, key2} } @@ -1414,65 +1414,65 @@ func testZRangeWithScores(ctx context.Context, c Cmdable) []string { func testZRangeArgs(ctx context.Context, c Cmdable) []string { var key = "zset" - added := c.ZAddArgs(ctx, key, ZAddArgs{ - Members: []Z{ - {Score: 1, Member: "one"}, - {Score: 2, Member: "two"}, - {Score: 3, Member: "three"}, - {Score: 4, Member: "four"}, - }, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 4) - - zRange := c.ZRangeArgs(ctx, ZRangeArgs{ - Key: key, - Start: 1, - Stop: 4, - ByScore: true, - Rev: true, - Offset: 1, - Count: 2, - }) - So(zRange.Err(), ShouldBeNil) - So(stringSliceEqual(zRange.Val(), []string{"three", "two"}, true), ShouldBeTrue) - - zRange = cacheCmd(c).ZRangeArgs(ctx, ZRangeArgs{ - Key: key, - Start: "-", - Stop: "+", - ByLex: true, - Rev: true, - Offset: 2, - Count: 2, - }) - So(zRange.Err(), ShouldBeNil) - So(stringSliceEqual(zRange.Val(), []string{"two", "one"}, true), ShouldBeTrue) - - zRange = c.ZRangeArgs(ctx, ZRangeArgs{ - Key: key, - Start: "(1", - Stop: "(4", - ByScore: true, - }) - So(zRange.Err(), ShouldBeNil) - So(stringSliceEqual(zRange.Val(), []string{"two", "three"}, true), ShouldBeTrue) - - // withScores. - zSlice := c.ZRangeArgsWithScores(ctx, ZRangeArgs{ - Key: key, - Start: 1, - Stop: 4, - ByScore: true, - Rev: true, - Offset: 1, - Count: 2, - }) - So(zSlice.Err(), ShouldBeNil) - So(zsEqual(zSlice.Val(), []Z{ - {Score: 3, Member: "three"}, - {Score: 2, Member: "two"}, - }), ShouldBeTrue) + //added := c.ZAddArgs(ctx, key, ZAddArgs{ + // Members: []Z{ + // {Score: 1, Member: "one"}, + // {Score: 2, Member: "two"}, + // {Score: 3, Member: "three"}, + // {Score: 4, Member: "four"}, + // }, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 4) + // + //zRange := c.ZRangeArgs(ctx, ZRangeArgs{ + // Key: key, + // Start: 1, + // Stop: 4, + // ByScore: true, + // Rev: true, + // Offset: 1, + // Count: 2, + //}) + //So(zRange.Err(), ShouldBeNil) + //So(stringSliceEqual(zRange.Val(), []string{"three", "two"}, true), ShouldBeTrue) + // + //zRange = cacheCmd(c).ZRangeArgs(ctx, ZRangeArgs{ + // Key: key, + // Start: "-", + // Stop: "+", + // ByLex: true, + // Rev: true, + // Offset: 2, + // Count: 2, + //}) + //So(zRange.Err(), ShouldBeNil) + //So(stringSliceEqual(zRange.Val(), []string{"two", "one"}, true), ShouldBeTrue) + // + //zRange = c.ZRangeArgs(ctx, ZRangeArgs{ + // Key: key, + // Start: "(1", + // Stop: "(4", + // ByScore: true, + //}) + //So(zRange.Err(), ShouldBeNil) + //So(stringSliceEqual(zRange.Val(), []string{"two", "three"}, true), ShouldBeTrue) + // + //// withScores. + //zSlice := c.ZRangeArgsWithScores(ctx, ZRangeArgs{ + // Key: key, + // Start: 1, + // Stop: 4, + // ByScore: true, + // Rev: true, + // Offset: 1, + // Count: 2, + //}) + //So(zSlice.Err(), ShouldBeNil) + //So(zsEqual(zSlice.Val(), []Z{ + // {Score: 3, Member: "three"}, + // {Score: 2, Member: "two"}, + //}), ShouldBeTrue) return []string{key} } @@ -1480,46 +1480,46 @@ func testZRangeArgs(ctx context.Context, c Cmdable) []string { func testZRangeArgsWithScores(ctx context.Context, c Cmdable) []string { var key = "zset" - added := c.ZAddArgs(ctx, key, ZAddArgs{ - Members: []Z{ - {Score: 1, Member: "one"}, - {Score: 2, Member: "two"}, - {Score: 3, Member: "three"}, - {Score: 4, Member: "four"}, - }, - }) - So(added.Err(), ShouldBeNil) - So(added.Val(), ShouldEqual, 4) - - zSlice := c.ZRangeArgsWithScores(ctx, ZRangeArgs{ - Key: key, - Start: 1, - Stop: 4, - ByScore: true, - Rev: true, - Offset: 1, - Count: 2, - }) - So(zSlice.Err(), ShouldBeNil) - So(zsEqual(zSlice.Val(), []Z{ - {Score: 3, Member: "three"}, - {Score: 2, Member: "two"}, - }), ShouldBeTrue) - - zSlice = cacheCmd(c).ZRangeArgsWithScores(ctx, ZRangeArgs{ - Key: key, - Start: 1, - Stop: 4, - ByScore: true, - Rev: true, - Offset: 1, - Count: 2, - }) - So(zSlice.Err(), ShouldBeNil) - So(zsEqual(zSlice.Val(), []Z{ - {Score: 3, Member: "three"}, - {Score: 2, Member: "two"}, - }), ShouldBeTrue) + //added := c.ZAddArgs(ctx, key, ZAddArgs{ + // Members: []Z{ + // {Score: 1, Member: "one"}, + // {Score: 2, Member: "two"}, + // {Score: 3, Member: "three"}, + // {Score: 4, Member: "four"}, + // }, + //}) + //So(added.Err(), ShouldBeNil) + //So(added.Val(), ShouldEqual, 4) + // + //zSlice := c.ZRangeArgsWithScores(ctx, ZRangeArgs{ + // Key: key, + // Start: 1, + // Stop: 4, + // ByScore: true, + // Rev: true, + // Offset: 1, + // Count: 2, + //}) + //So(zSlice.Err(), ShouldBeNil) + //So(zsEqual(zSlice.Val(), []Z{ + // {Score: 3, Member: "three"}, + // {Score: 2, Member: "two"}, + //}), ShouldBeTrue) + // + //zSlice = cacheCmd(c).ZRangeArgsWithScores(ctx, ZRangeArgs{ + // Key: key, + // Start: 1, + // Stop: 4, + // ByScore: true, + // Rev: true, + // Offset: 1, + // Count: 2, + //}) + //So(zSlice.Err(), ShouldBeNil) + //So(zsEqual(zSlice.Val(), []Z{ + // {Score: 3, Member: "three"}, + // {Score: 2, Member: "two"}, + //}), ShouldBeTrue) return []string{key} } @@ -1961,4 +1961,3 @@ func sortedSetTestUnits() []TestUnit { } func TestResp2Client_SortedSet(t *testing.T) { doTestUnits(t, RESP2, sortedSetTestUnits) } -func TestResp3Client_SortedSet(t *testing.T) { doTestUnits(t, RESP3, sortedSetTestUnits) } diff --git a/cmd_stream.go b/cmd_stream.go index 3f1664e..dab1f92 100644 --- a/cmd_stream.go +++ b/cmd_stream.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -155,19 +155,19 @@ type StreamWriter interface { // See https://redis.io/commands/xreadgroup/ XReadGroup(ctx context.Context, a XReadGroupArgs) XStreamSliceCmd - // XTrim - // Available since: 5.0.0 - // Time complexity: O(N), with N being the number of evicted entries. Constant times are very small however, since entries are organized in macro nodes containing multiple entries that can be released with a single deallocation. - // ACL categories: @write @stream @slow - // See https://redis.io/commands/xtrim/ - XTrim(ctx context.Context, key string, maxLen int64) IntCmd - - // XTrimApprox - // Available since: 5.0.0 - // Time complexity: O(N), with N being the number of evicted entries. Constant times are very small however, since entries are organized in macro nodes containing multiple entries that can be released with a single deallocation. - // ACL categories: @write @stream @slow - // See https://redis.io/commands/xtrim/ - XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd + //// XTrim + //// Available since: 5.0.0 + //// Time complexity: O(N), with N being the number of evicted entries. Constant times are very small however, since entries are organized in macro nodes containing multiple entries that can be released with a single deallocation. + //// ACL categories: @write @stream @slow + //// See https://redis.io/commands/xtrim/ + //XTrim(ctx context.Context, key string, maxLen int64) IntCmd + // + //// XTrimApprox + //// Available since: 5.0.0 + //// Time complexity: O(N), with N being the number of evicted entries. Constant times are very small however, since entries are organized in macro nodes containing multiple entries that can be released with a single deallocation. + //// ACL categories: @write @stream @slow + //// See https://redis.io/commands/xtrim/ + //XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd // XTrimMaxLen // Available since: 5.0.0 @@ -530,19 +530,19 @@ func (c *client) XRevRangeN(ctx context.Context, stream string, start, stop stri return r } -func (c *client) XTrim(ctx context.Context, key string, maxLen int64) IntCmd { - ctx = c.handler.before(ctx, CommandXTrim) - r := c.cmdable.XTrim(ctx, key, maxLen) - c.handler.after(ctx, r.Err()) - return r -} - -func (c *client) XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd { - ctx = c.handler.before(ctx, CommandXTrim) - r := c.cmdable.XTrimApprox(ctx, key, maxLen) - c.handler.after(ctx, r.Err()) - return r -} +//func (c *client) XTrim(ctx context.Context, key string, maxLen int64) IntCmd { +// ctx = c.handler.before(ctx, CommandXTrim) +// r := c.cmdable.XTrim(ctx, key, maxLen) +// c.handler.after(ctx, r.Err()) +// return r +//} +// +//func (c *client) XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd { +// ctx = c.handler.before(ctx, CommandXTrim) +// r := c.cmdable.XTrimApprox(ctx, key, maxLen) +// c.handler.after(ctx, r.Err()) +// return r +//} func (c *client) XTrimMaxLen(ctx context.Context, key string, maxLen int64) IntCmd { ctx = c.handler.before(ctx, CommandXTrim) diff --git a/cmd_stream_test.go b/cmd_stream_test.go index 1dc20d7..ed6ddf6 100644 --- a/cmd_stream_test.go +++ b/cmd_stream_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -613,11 +613,11 @@ func testXPending(ctx context.Context, c Cmdable) []string { func testXTrim(ctx context.Context, c Cmdable) []string { var key = "stream" - beforeStream(ctx, key, c) - - n, err := c.XTrim(ctx, key, 0).Result() - So(err, ShouldBeNil) - So(n, ShouldEqual, 3) + //beforeStream(ctx, key, c) + // + //n, err := c.XTrim(ctx, key, 0).Result() + //So(err, ShouldBeNil) + //So(n, ShouldEqual, 3) return []string{key} } @@ -625,11 +625,11 @@ func testXTrim(ctx context.Context, c Cmdable) []string { func testXTrimApprox(ctx context.Context, c Cmdable) []string { var key = "stream" - beforeStream(ctx, key, c) - - n, err := c.XTrimApprox(ctx, key, 0).Result() - So(err, ShouldBeNil) - So(n, ShouldEqual, 3) + //beforeStream(ctx, key, c) + // + //n, err := c.XTrimApprox(ctx, key, 0).Result() + //So(err, ShouldBeNil) + //So(n, ShouldEqual, 3) return []string{key} } @@ -777,4 +777,3 @@ func streamTestUnits() []TestUnit { } func TestResp2Client_Stream(t *testing.T) { doTestUnits(t, RESP2, streamTestUnits) } -func TestResp3Client_Stream(t *testing.T) { doTestUnits(t, RESP3, streamTestUnits) } diff --git a/cmd_string.go b/cmd_string.go index fe6d7b4..d7173c9 100644 --- a/cmd_string.go +++ b/cmd_string.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -171,7 +171,7 @@ type StringWriter interface { // An error is returned when seconds is invalid. // Return: // Simple string reply - SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd + //SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd // SetNX // Available since: 1.0.0 @@ -362,12 +362,12 @@ func (c *client) Set(ctx context.Context, key string, value interface{}, expirat return r } -func (c *client) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { - ctx = c.handler.before(ctx, CommandSetex) - r := c.cmdable.SetEX(ctx, key, value, expiration) - c.handler.after(ctx, r.Err()) - return r -} +//func (c *client) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { +// ctx = c.handler.before(ctx, CommandSetex) +// r := c.cmdable.SetEX(ctx, key, value, expiration) +// c.handler.after(ctx, r.Err()) +// return r +//} func (c *client) SetNX(ctx context.Context, key string, value interface{}, expiration time.Duration) BoolCmd { if expiration == KeepTTL { diff --git a/cmd_string_test.go b/cmd_string_test.go index a7df1e4..1f06add 100644 --- a/cmd_string_test.go +++ b/cmd_string_test.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -244,21 +244,21 @@ func testSet(ctx context.Context, c Cmdable) []string { } func testSetEX(ctx context.Context, c Cmdable) []string { - var key, value = "key", "hello" - - setEX := c.SetEX(ctx, key, value, 1*time.Second) - So(setEX.Err(), ShouldBeNil) - So(setEX.Val(), ShouldEqual, OK) - - get := c.Get(ctx, key) - So(get.Err(), ShouldBeNil) - So(get.Val(), ShouldEqual, value) - - time.Sleep(1500 * time.Millisecond) + var key = "key" - get = c.Get(ctx, key) - So(get.Err(), ShouldNotBeNil) - So(IsNil(get.Err()), ShouldBeTrue) + //setEX := c.SetEX(ctx, key, value, 1*time.Second) + //So(setEX.Err(), ShouldBeNil) + //So(setEX.Val(), ShouldEqual, OK) + // + //get := c.Get(ctx, key) + //So(get.Err(), ShouldBeNil) + //So(get.Val(), ShouldEqual, value) + // + //time.Sleep(1500 * time.Millisecond) + // + //get = c.Get(ctx, key) + //So(get.Err(), ShouldNotBeNil) + //So(IsNil(get.Err()), ShouldBeTrue) return []string{key} } @@ -763,4 +763,3 @@ func stringTestUnits() []TestUnit { } func TestResp2Client_String(t *testing.T) { doTestUnits(t, RESP2, stringTestUnits) } -func TestResp3Client_String(t *testing.T) { doTestUnits(t, RESP3, stringTestUnits) } diff --git a/collector.go b/collector.go index e9cb739..86a18cd 100644 --- a/collector.go +++ b/collector.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import "github.com/prometheus/client_golang/prometheus" diff --git a/gen_conf_optiongen.go b/gen_conf_optiongen.go index 0f56ac7..558b728 100644 --- a/gen_conf_optiongen.go +++ b/gen_conf_optiongen.go @@ -1,7 +1,7 @@ // Code generated by optiongen. DO NOT EDIT. // optiongen: github.com/timestee/optiongen -package sandwich_redis +package redisson import ( "sync/atomic" diff --git a/go.mod b/go.mod index 2db8552..91dc235 100644 --- a/go.mod +++ b/go.mod @@ -1,35 +1,18 @@ module github.com/sandwich-go/redisson -go 1.18 +go 1.16 require ( github.com/coreos/go-semver v0.3.0 - github.com/go-redis/redis/v8 v8.11.5 github.com/prometheus/client_golang v1.11.0 - github.com/sandwich-go/rueidis v0.1.3 github.com/smartystreets/goconvey v1.7.2 - gopkg.in/errgo.v2 v2.1.0 ) require ( - github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/golang/protobuf v1.5.0 // indirect - github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 // indirect - github.com/jtolds/gls v4.20.0+incompatible // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.26.0 // indirect - github.com/prometheus/procfs v0.6.0 // indirect - github.com/rogpeppe/go-internal v1.8.0 // indirect - github.com/smartystreets/assertions v1.2.0 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/redis/go-redis/v9 v9.17.0 golang.org/x/sys v0.0.0-20220731174439-a90be440212d // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/protobuf v1.27.1 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) - -//replace github.com/sandwich-go/rueidis => ../rueidis diff --git a/go.sum b/go.sum index 60e518d..de18bb6 100644 --- a/go.sum +++ b/go.sum @@ -8,25 +8,25 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -39,8 +39,9 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -62,13 +63,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -77,10 +73,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -103,11 +95,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/sandwich-go/rueidis v0.1.3 h1:CH4nQqB03Ye3YWhtQ6NiSBuYwFyrZorFQeHagYZgNhw= -github.com/sandwich-go/rueidis v0.1.3/go.mod h1:JZnvaTA36ljjidBb6RH7EA0gj4cL/J2JKBkKB7rhaT0= +github.com/redis/go-redis/v9 v9.17.0 h1:K6E+ZlYN95KSMmZeEQPbU/c++wfmEvfFB17yEAq/VhM= +github.com/redis/go-redis/v9 v9.17.0/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -120,7 +109,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -131,8 +119,6 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -153,7 +139,6 @@ golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsi golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -167,20 +152,16 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/grafana_dashboard.png b/grafana_dashboard.png new file mode 100644 index 0000000..df07c82 Binary files /dev/null and b/grafana_dashboard.png differ diff --git a/option.go b/option.go index c718be6..d95f2f1 100644 --- a/option.go +++ b/option.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import "time" diff --git a/redis.go b/redis.go index 2fe96fd..5848bbd 100644 --- a/redis.go +++ b/redis.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "time" @@ -9,6 +9,7 @@ type Cmdable interface { PoolStats() PoolStats RegisterCollector(RegisterCollectorFunc) Close() error + RawCmdable() interface{} CacheCmdable BitmapCmdable diff --git a/redis_handler.go b/redis_handler.go index 105e14a..d925724 100644 --- a/redis_handler.go +++ b/redis_handler.go @@ -1,4 +1,4 @@ -package sandwich_redis +package redisson import ( "context" @@ -77,39 +77,55 @@ type ( startTimeContextKeyType struct{} commandContextKeyType struct{} subCommandContextKeyType struct{} + skipCheckContextKeyType struct{} ) func (*startTimeContextKeyType) String() string { return "start_time" } func (*commandContextKeyType) String() string { return "command" } func (*subCommandContextKeyType) String() string { return "sub_command" } +func (*skipCheckContextKeyType) String() string { return "skip_check" } var ( startTimeContextKey = startTimeContextKeyType(struct{}{}) commandContextKey = commandContextKeyType(struct{}{}) subCommandContextKey = subCommandContextKeyType(struct{}{}) + skipCheckContextKey = skipCheckContextKeyType(struct{}{}) ) -func (r *baseHandler) setVersion(v *semver.Version) { r.version = v } -func (r *baseHandler) setSilentErrCallback(b isSilentError) { r.silentErrCallback = b } -func (r *baseHandler) setRegisterCollector(rc RegisterCollectorFunc) { rc(r.metric); rc(r.errMetric) } +// WithSkipCheck 是否跳过检测 +// 在 Development 的情况下,会跳过 黑名单检验、版本检验、槽位检测以及警告输出 +func WithSkipCheck(ctx context.Context) context.Context { + return context.WithValue(ctx, skipCheckContextKey, true) +} + +func (r *baseHandler) setVersion(v *semver.Version) { r.version = v } +func (r *baseHandler) setSilentErrCallback(b isSilentError) { r.silentErrCallback = b } +func (r *baseHandler) setRegisterCollector(rc RegisterCollectorFunc) { + rc(r.errMetric) + rc(r.hitsMetric) + rc(r.missMetric) + rc(r.metric) +} func (r *baseHandler) before(ctx context.Context, command Command) context.Context { return r.beforeWithKeys(ctx, command, nil) } func (r *baseHandler) beforeWithKeys(ctx context.Context, command Command, getKeys func() []string) context.Context { if r.v.GetDevelopment() { - // 需要检验命令是否在黑名单 - if command.Forbid() { - panic(fmt.Errorf("command '%s' not allowed", command.String())) - } - // 需要检验版本是否支持该命令 - if r.version.LessThan(mustNewSemVersion(command.RequireVersion())) { - panic(fmt.Errorf("redis '%s' are not supported in version %q, available since %s", command, r.version, command.RequireVersion())) - } - // 需要检验所有的key是否均在同一槽位 - panicIfUseMultipleKeySlots(getKeys) - // 该命令是否有警告日志输出 - if len(command.WarnVersion()) > 0 && mustNewSemVersion(command.WarnVersion()).LessThan(*r.version) { - warning(command.Warning()) + if skipCheck := ctx.Value(skipCheckContextKey); skipCheck == nil { + // 需要检验命令是否在黑名单 + if command.Forbid() { + panic(fmt.Errorf("[%s]: redis command are not allowed", command.String())) + } + // 需要检验版本是否支持该命令 + if r.version.LessThan(mustNewSemVersion(command.RequireVersion())) { + panic(fmt.Errorf("[%s]: redis command are not supported in version %q, available since %s", command, r.version, command.RequireVersion())) + } + // 需要检验所有的key是否均在同一槽位 + panicIfUseMultipleKeySlots(command, getKeys) + // 该命令是否有警告日志输出 + if len(command.WarnVersion()) > 0 && mustNewSemVersion(command.WarnVersion()).LessThan(*r.version) { + warning(fmt.Sprintf("[%s]: %s", command.String(), command.Warning())) + } } } if r.v.GetEnableMonitor() { diff --git a/redis_resp.go b/redis_resp.go index 1de0496..c3ef3d9 100644 --- a/redis_resp.go +++ b/redis_resp.go @@ -1,31 +1,21 @@ -package sandwich_redis +package redisson import ( "context" - "errors" "fmt" "github.com/coreos/go-semver/semver" - goredis "github.com/go-redis/redis/v8" + goredis "github.com/redis/go-redis/v9" "regexp" "strings" "sync" "time" ) -type RESP int +type RESP = string const ( - RESP2 RESP = 0 - RESP3 RESP = 1 -) - -var ( - errTooManyArguments = errors.New("too many arguments") - errGeoRadiusByMemberNotSupportStore = errors.New("GeoRadiusByMember does not support Store or StoreDist") - errGeoRadiusNotSupportStore = errors.New("GeoRadius does not support Store or StoreDist") - errGeoRadiusStoreRequiresStore = errors.New("GeoRadiusStore requires Store or StoreDist") - errGeoRadiusByMemberStoreRequiresStore = errors.New("GeoRadiusByMemberStore requires Store or StoreDist") - errMemoryUsageArgsCount = errors.New("MemoryUsage expects single sample count") + RESP2 RESP = "RESP2" + RESP3 RESP = "RESP3" ) const Nil = goredis.Nil @@ -33,15 +23,34 @@ const Nil = goredis.Nil func IsNil(err error) bool { return err == Nil } type client struct { - v ConfVisitor + v ConfInterface cmdable Cmdable cacheCmdable CacheCmdable handler handler version semver.Version once sync.Once + isCluster bool } -var versionRE = regexp.MustCompile(`redis_version:(.+)`) +var ( + versionRE = regexp.MustCompile(`redis_version:(.+)`) + clusterEnabled = regexp.MustCompile(`cluster_enabled:(.+)`) +) + +func (c *client) clusterEnable() error { + res, err := c.cmdable.Info(context.Background(), CLUSTER).Result() + if err != nil { + return err + } + match := clusterEnabled.FindAllStringSubmatch(res, -1) + if len(match) < 1 || len(strings.TrimSpace(match[0][1])) == 0 || strings.TrimSpace(match[0][1]) == "0" { + c.isCluster = false + } else { + c.isCluster = true + } + return nil + +} func (c *client) initVersion() (err error) { var res string @@ -62,7 +71,7 @@ func (c *client) initVersion() (err error) { return err } -func MustNewClient(v ConfVisitor) Cmdable { +func MustNewClient(v ConfInterface) Cmdable { cmd, err := Connect(v) if err != nil { panic(err) @@ -70,24 +79,72 @@ func MustNewClient(v ConfVisitor) Cmdable { return cmd } -func Connect(v ConfVisitor) (Cmdable, error) { +func (c *client) initialize() error { + // 初始化版本号 + if err := c.initVersion(); err != nil { + return err + } + if err := c.clusterEnable(); err != nil { + return err + } + return nil +} + +func (c *client) connect() error { var err error - c := &client{v: v, handler: newBaseHandler(v)} - switch v.GetResp() { + switch strings.ToUpper(c.v.GetResp()) { case RESP2: - c.cmdable, err = connectResp2(v, c.handler) - case RESP3: - c.cmdable, err = connectResp3(v, c.handler) + c.cmdable, err = connectResp2(c.v, c.handler) default: - err = fmt.Errorf("unknown RESP version, %d", v.GetResp()) + err = fmt.Errorf("unknown RESP version, %s", c.v.GetResp()) } if err != nil { - return nil, err + return err } - // 初始化版本号 - if err = c.initVersion(); err != nil { + // 初始化 + if err = c.initialize(); err != nil { + _ = c.Close() + return err + } + return nil +} + +func (c *client) reconnectWhenError(err error) error { + if err == nil { + return nil + } + errString := err.Error() + if strings.Contains(errString, "ERR This instance has cluster support disabled") || + strings.Contains(errString, "ERR Cluster setting conflict") { + warning(fmt.Sprintf("%s, reconnect...", errString)) + c.v.ApplyOption(WithCluster(!c.v.GetCluster())) + return c.connect() + } else if c.v.GetResp() == RESP2 && strings.Contains(errString, "elements in cluster info address, expected 2 or 3") { + warning(fmt.Sprintf("%s, using always resp2, reconnect...", errString)) + c.v.ApplyOption(WithResp(RESP3)) + return c.connect() + } + return err +} + +var retryTimes = 3 + +func Connect(v ConfInterface) (Cmdable, error) { + c := &client{v: v, handler: newBaseHandler(v)} + err := c.connect() + if err == nil && c.isCluster != c.v.GetCluster() { + err = fmt.Errorf("ERR Cluster setting conflict, server's cluster_enabled is %t, but client's cluster_enabled is %t", c.isCluster, c.v.GetCluster()) + } + for i := 0; i < retryTimes; i++ { + err = c.reconnectWhenError(err) + if err == nil { + break + } + } + if err != nil { return nil, err } + c.cacheCmdable = c.cmdable c.handler.setSilentErrCallback(func(err error) bool { return err == Nil }) return c, nil diff --git a/redis_resp2.go b/redis_resp2.go index 412e89a..6b9e4ac 100644 --- a/redis_resp2.go +++ b/redis_resp2.go @@ -1,8 +1,8 @@ -package sandwich_redis +package redisson import ( "context" - goredis "github.com/go-redis/redis/v8" + goredis "github.com/redis/go-redis/v9" "sync" "time" ) @@ -14,17 +14,18 @@ type resp2 struct { func connectResp2(v ConfVisitor, h handler) (*resp2, error) { var opts = &goredis.UniversalOptions{ - Addrs: v.GetAddrs(), - DB: v.GetDB(), - Username: v.GetUsername(), - Password: v.GetPassword(), - ReadTimeout: v.GetReadTimeout(), - WriteTimeout: v.GetWriteTimeout(), - PoolSize: v.GetConnPoolSize(), - MinIdleConns: v.GetMinIdleConns(), - MaxConnAge: v.GetConnMaxAge(), - IdleTimeout: v.GetIdleConnTimeout(), - PoolTimeout: v.GetConnPoolTimeout(), + Addrs: v.GetAddrs(), + DB: v.GetDB(), + Username: v.GetUsername(), + Password: v.GetPassword(), + ReadTimeout: v.GetReadTimeout(), + WriteTimeout: v.GetWriteTimeout(), + PoolSize: v.GetConnPoolSize(), + MinIdleConns: v.GetMinIdleConns(), + ConnMaxLifetime: v.GetConnMaxAge(), + ConnMaxIdleTime: v.GetIdleConnTimeout(), + PoolTimeout: v.GetConnPoolTimeout(), + UnstableResp3: v.GetResp() == RESP3, } var cmd goredis.UniversalClient if v.GetCluster() { @@ -417,8 +418,8 @@ func (r *resp2) HMSet(ctx context.Context, key string, values ...interface{}) Bo return r.cmd.HMSet(ctx, key, values...) } -func (r *resp2) HRandField(ctx context.Context, key string, count int, withValues bool) StringSliceCmd { - return r.cmd.HRandField(ctx, key, count, withValues) +func (r *resp2) HRandField(ctx context.Context, key string, count int) StringSliceCmd { + return r.cmd.HRandField(ctx, key, count) } func (r *resp2) HScan(ctx context.Context, key string, cursor uint64, match string, count int64) ScanCmd { @@ -561,18 +562,29 @@ type pipelineResp2 struct { mx sync.RWMutex } +type pipelineCommand struct{} + +func (pipelineCommand) String() string { return "PIPELINE" } +func (pipelineCommand) Class() string { return "Pipeline" } +func (pipelineCommand) RequireVersion() string { return "0.0.0" } +func (pipelineCommand) Forbid() bool { return false } +func (pipelineCommand) WarnVersion() string { return "" } +func (pipelineCommand) Warning() string { return "" } +func (pipelineCommand) Cmd() []string { return nil } + +var pipelineCmd = &pipelineCommand{} + func (r *resp2) Pipeline() Pipeliner { return &pipelineResp2{resp: r} } -func (p *pipelineResp2) Put(ctx context.Context, cmd Command, keys []string, args ...interface{}) (err error) { - ctx = p.resp.handler.before(ctx, cmd) +func (p *pipelineResp2) Put(_ context.Context, cmd Command, keys []string, args ...interface{}) (err error) { p.mx.Lock() p.commands = append(p.commands, pipeCommand{cmd: cmd.Cmd(), keys: keys, args: args}) p.mx.Unlock() - p.resp.handler.after(ctx, err) - return err + return } func (p *pipelineResp2) Exec(ctx context.Context) ([]interface{}, error) { + ctx = p.resp.handler.before(ctx, pipelineCmd) res, err := p.resp.cmd.Pipelined(ctx, func(pip goredis.Pipeliner) error { p.mx.RLock() defer p.mx.RUnlock() @@ -602,9 +614,12 @@ func (p *pipelineResp2) Exec(ctx context.Context) ([]interface{}, error) { result[i] = j } } + p.resp.handler.after(ctx, err) return result, err } +func (r *resp2) RawCmdable() interface{} { return r.cmd } + func (r *resp2) Publish(ctx context.Context, channel string, message interface{}) IntCmd { return r.cmd.Publish(ctx, channel, message) } @@ -706,7 +721,7 @@ func (r *resp2) Command(ctx context.Context) CommandsInfoCmd { return r.cmd.Command(ctx) } -func (r *resp2) ConfigGet(ctx context.Context, parameter string) SliceCmd { +func (r *resp2) ConfigGet(ctx context.Context, parameter string) MapStringStringCmd { return r.cmd.ConfigGet(ctx, parameter) } @@ -866,10 +881,10 @@ func (r *resp2) BZPopMin(ctx context.Context, timeout time.Duration, keys ...str return r.cmd.BZPopMin(ctx, timeout, keys...) } -func (r *resp2) toZs(members ...Z) []*Z { - zs := make([]*Z, 0, len(members)) +func (r *resp2) toZs(members ...Z) []Z { + zs := make([]Z, 0, len(members)) for _, v := range members { - zs = append(zs, &Z{Score: v.Score, Member: v.Member}) + zs = append(zs, Z{Score: v.Score, Member: v.Member}) } return zs } @@ -882,25 +897,25 @@ func (r *resp2) ZAddNX(ctx context.Context, key string, members ...Z) IntCmd { return r.cmd.ZAddNX(ctx, key, r.toZs(members...)...) } -func (r *resp2) ZAddXX(ctx context.Context, key string, members ...Z) IntCmd { - return r.cmd.ZAddXX(ctx, key, r.toZs(members...)...) -} - -func (r *resp2) ZAddCh(ctx context.Context, key string, members ...Z) IntCmd { - return r.cmd.ZAddCh(ctx, key, r.toZs(members...)...) -} - -func (r *resp2) ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd { - return r.cmd.ZAddNXCh(ctx, key, r.toZs(members...)...) -} - -func (r *resp2) ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd { - return r.cmd.ZAddXXCh(ctx, key, r.toZs(members...)...) -} - -func (r *resp2) ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd { - return r.cmd.ZAddArgs(ctx, key, args) -} +//func (r *resp2) ZAddXX(ctx context.Context, key string, members ...Z) IntCmd { +// return r.cmd.ZAddXX(ctx, key, r.toZs(members...)...) +//} +// +//func (r *resp2) ZAddCh(ctx context.Context, key string, members ...Z) IntCmd { +// return r.cmd.ZAddCh(ctx, key, r.toZs(members...)...) +//} +// +//func (r *resp2) ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd { +// return r.cmd.ZAddNXCh(ctx, key, r.toZs(members...)...) +//} +// +//func (r *resp2) ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd { +// return r.cmd.ZAddXXCh(ctx, key, r.toZs(members...)...) +//} +// +//func (r *resp2) ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd { +// return r.cmd.ZAddArgs(ctx, key, args) +//} func (r *resp2) ZAddArgsIncr(ctx context.Context, key string, args ZAddArgs) FloatCmd { return r.cmd.ZAddArgsIncr(ctx, key, args) @@ -926,17 +941,17 @@ func (r *resp2) ZDiffStore(ctx context.Context, destination string, keys ...stri return r.cmd.ZDiffStore(ctx, destination, keys...) } -func (r *resp2) ZIncr(ctx context.Context, key string, member Z) FloatCmd { - return r.cmd.ZIncr(ctx, key, &member) -} - -func (r *resp2) ZIncrNX(ctx context.Context, key string, member Z) FloatCmd { - return r.cmd.ZIncrNX(ctx, key, &member) -} - -func (r *resp2) ZIncrXX(ctx context.Context, key string, member Z) FloatCmd { - return r.cmd.ZIncrXX(ctx, key, &member) -} +//func (r *resp2) ZIncr(ctx context.Context, key string, member Z) FloatCmd { +// return r.cmd.ZIncr(ctx, key, &member) +//} +// +//func (r *resp2) ZIncrNX(ctx context.Context, key string, member Z) FloatCmd { +// return r.cmd.ZIncrNX(ctx, key, &member) +//} +// +//func (r *resp2) ZIncrXX(ctx context.Context, key string, member Z) FloatCmd { +// return r.cmd.ZIncrXX(ctx, key, &member) +//} func (r *resp2) ZIncrBy(ctx context.Context, key string, increment float64, member string) FloatCmd { return r.cmd.ZIncrBy(ctx, key, increment, member) @@ -970,8 +985,8 @@ func (r *resp2) ZPopMin(ctx context.Context, key string, count ...int64) ZSliceC return r.cmd.ZPopMin(ctx, key, count...) } -func (r *resp2) ZRandMember(ctx context.Context, key string, count int, withScores bool) StringSliceCmd { - return r.cmd.ZRandMember(ctx, key, count, withScores) +func (r *resp2) ZRandMember(ctx context.Context, key string, count int) StringSliceCmd { + return r.cmd.ZRandMember(ctx, key, count) } func (r *resp2) ZRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { @@ -1178,13 +1193,13 @@ func (r *resp2) XRevRangeN(ctx context.Context, stream string, start, stop strin return r.cmd.XRevRangeN(ctx, stream, start, stop, count) } -func (r *resp2) XTrim(ctx context.Context, key string, maxLen int64) IntCmd { - return r.cmd.XTrim(ctx, key, maxLen) -} - -func (r *resp2) XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd { - return r.cmd.XTrimApprox(ctx, key, maxLen) -} +//func (r *resp2) XTrim(ctx context.Context, key string, maxLen int64) IntCmd { +// return r.cmd.XTrim(ctx, key, maxLen) +//} +// +//func (r *resp2) XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd { +// return r.cmd.XTrimApprox(ctx, key, maxLen) +//} func (r *resp2) XTrimMaxLen(ctx context.Context, key string, maxLen int64) IntCmd { return r.cmd.XTrimMaxLen(ctx, key, maxLen) @@ -1262,9 +1277,9 @@ func (r *resp2) Set(ctx context.Context, key string, value interface{}, expirati return r.cmd.Set(ctx, key, value, expiration) } -func (r *resp2) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { - return r.cmd.SetEX(ctx, key, value, expiration) -} +//func (r *resp2) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { +// return r.cmd.SetEX(ctx, key, value, expiration) +//} func (r *resp2) SetNX(ctx context.Context, key string, value interface{}, expiration time.Duration) BoolCmd { return r.cmd.SetNX(ctx, key, value, expiration) diff --git a/redis_resp3.go b/redis_resp3.go deleted file mode 100644 index a006fae..0000000 --- a/redis_resp3.go +++ /dev/null @@ -1,2212 +0,0 @@ -package sandwich_redis - -import ( - "context" - "fmt" - "github.com/sandwich-go/rueidis" - "strings" - "sync" - "time" -) - -type resp3 struct { - v ConfVisitor - cmd rueidis.Client - handler handler -} - -type resp3Cache struct { - ttl time.Duration - resp *resp3 -} - -func connectResp3(v ConfVisitor, h handler) (*resp3, error) { - cmd, err := rueidis.NewClient(rueidis.ClientOption{ - Username: v.GetUsername(), - Password: v.GetPassword(), - InitAddress: v.GetAddrs(), - SelectDB: v.GetDB(), - CacheSizeEachConn: v.GetCacheSizeEachConn(), - RingScaleEachConn: v.GetRingScaleEachConn(), - BlockingPoolSize: v.GetConnPoolSize(), - ConnWriteTimeout: v.GetWriteTimeout(), - }) - if err != nil { - return nil, err - } - return &resp3{cmd: cmd, v: v, handler: h}, nil -} - -func (r *resp3) PoolStats() PoolStats { return PoolStats{} } -func (r *resp3) Close() error { r.cmd.Close(); return nil } -func (r *resp3) RegisterCollector(RegisterCollectorFunc) {} -func (r *resp3) Cache(ttl time.Duration) CacheCmdable { - if r.v.GetEnableCache() { - return &resp3Cache{resp: r, ttl: ttl} - } - return r -} -func (r *resp3Cache) Do(ctx context.Context, completed rueidis.Completed) rueidis.RedisResult { - rsp := r.resp.cmd.DoCache(ctx, rueidis.Cacheable(completed), r.ttl) - r.resp.handler.cache(ctx, rsp.IsCacheHit()) - return rsp -} - -func (r *resp3) getBitCountCompleted(key string, bitCount *BitCount) rueidis.Completed { - var bitCountKey = r.cmd.B().Bitcount().Key(key) - if bitCount != nil { - return bitCountKey.Start(bitCount.Start).End(bitCount.End).Build() - } - return bitCountKey.Build() -} - -func (r *resp3) BitCount(ctx context.Context, key string, bitCount *BitCount) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getBitCountCompleted(key, bitCount))) -} - -func (r *resp3Cache) BitCount(ctx context.Context, key string, bitCount *BitCount) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getBitCountCompleted(key, bitCount))) -} - -func (r *resp3) BitField(ctx context.Context, key string, args ...interface{}) IntSliceCmd { - return newIntSliceCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(BITFIELD).Keys(key).Args(argsToSlice(args)...).Build())) -} - -func (r *resp3) bitOp(ctx context.Context, token, destKey string, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Bitop().Operation(token).Destkey(destKey).Key(keys...).Build())) -} - -func (r *resp3) BitOpAnd(ctx context.Context, destKey string, keys ...string) IntCmd { - return r.bitOp(ctx, AND, destKey, keys...) -} - -func (r *resp3) BitOpOr(ctx context.Context, destKey string, keys ...string) IntCmd { - return r.bitOp(ctx, OR, destKey, keys...) -} - -func (r *resp3) BitOpXor(ctx context.Context, destKey string, keys ...string) IntCmd { - return r.bitOp(ctx, XOR, destKey, keys...) -} - -func (r *resp3) BitOpNot(ctx context.Context, destKey string, key string) IntCmd { - return r.bitOp(ctx, NOT, destKey, key) -} - -func (r *resp3) getBitPosCompleted(key string, bit int64, pos ...int64) rueidis.Completed { - var completed rueidis.Completed - var bitposBit = r.cmd.B().Bitpos().Key(key).Bit(bit) - switch len(pos) { - case 0: - completed = bitposBit.Build() - case 1: - completed = bitposBit.Start(pos[0]).Build() - case 2: - completed = bitposBit.Start(pos[0]).End(pos[1]).Build() - default: - panic(errTooManyArguments) - } - return completed -} - -func (r *resp3) BitPos(ctx context.Context, key string, bit int64, pos ...int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getBitPosCompleted(key, bit, pos...))) -} - -func (r *resp3Cache) BitPos(ctx context.Context, key string, bit int64, pos ...int64) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getBitPosCompleted(key, bit, pos...))) -} - -func (r *resp3) getBitCompleted(key string, offset int64) rueidis.Completed { - return r.cmd.B().Getbit().Key(key).Offset(offset).Build() -} - -func (r *resp3) GetBit(ctx context.Context, key string, offset int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getBitCompleted(key, offset))) -} - -func (r *resp3Cache) GetBit(ctx context.Context, key string, offset int64) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getBitCompleted(key, offset))) -} - -func (r *resp3) SetBit(ctx context.Context, key string, offset int64, value int) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Setbit().Key(key).Offset(offset).Value(int64(value)).Build())) -} - -func (r *resp3) ClusterAddSlots(ctx context.Context, slots ...int) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterAddslots().Slot(intSliceToInt64ToSlice(slots)...).Build())) -} - -func (r *resp3) ClusterAddSlotsRange(ctx context.Context, min, max int) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterAddslotsrange().StartSlotEndSlot().StartSlotEndSlot(int64(min), int64(max)).Build())) -} - -func (r *resp3) ClusterCountFailureReports(ctx context.Context, nodeID string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().ClusterCountFailureReports().NodeId(nodeID).Build())) -} - -func (r *resp3) ClusterCountKeysInSlot(ctx context.Context, slot int) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().ClusterCountkeysinslot().Slot(int64(slot)).Build())) -} - -func (r *resp3) ClusterDelSlots(ctx context.Context, slots ...int) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterDelslots().Slot(intSliceToInt64ToSlice(slots)...).Build())) -} - -func (r *resp3) ClusterDelSlotsRange(ctx context.Context, min, max int) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterDelslotsrange().StartSlotEndSlot().StartSlotEndSlot(int64(min), int64(max)).Build())) -} - -func (r *resp3) ClusterFailover(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterFailover().Build())) -} - -func (r *resp3) ClusterForget(ctx context.Context, nodeID string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterForget().NodeId(nodeID).Build())) -} - -func (r *resp3) ClusterGetKeysInSlot(ctx context.Context, slot int, count int) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().ClusterGetkeysinslot().Slot(int64(slot)).Count(int64(count)).Build())) -} - -func (r *resp3) ClusterInfo(ctx context.Context) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ClusterInfo().Build())) -} - -func (r *resp3) ClusterKeySlot(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().ClusterKeyslot().Key(key).Build())) -} - -func (r *resp3) ClusterMeet(ctx context.Context, host, port string) StatusCmd { - iport, err := parseInt(port) - if err != nil { - return newStatusCmdWithError(err) - } - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterMeet().Ip(host).Port(iport).Build())) -} - -func (r *resp3) ClusterNodes(ctx context.Context) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ClusterNodes().Build())) -} - -func (r *resp3) ClusterReplicate(ctx context.Context, nodeID string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterReplicate().NodeId(nodeID).Build())) -} - -func (r *resp3) ClusterResetSoft(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterReset().Soft().Build())) -} - -func (r *resp3) ClusterResetHard(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterReset().Hard().Build())) -} - -func (r *resp3) ClusterSaveConfig(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ClusterSaveconfig().Build())) -} - -func (r *resp3) ClusterSlaves(ctx context.Context, nodeID string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().ClusterSlaves().NodeId(nodeID).Build())) -} - -func (r *resp3) ClusterSlots(ctx context.Context) ClusterSlotsCmd { - return newClusterSlotsCmd(r.cmd.Do(ctx, r.cmd.B().ClusterSlots().Build())) -} - -func (r *resp3) ReadOnly(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Readonly().Build())) -} - -func (r *resp3) ReadWrite(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Readwrite().Build())) -} - -func (r *resp3) Select(ctx context.Context, index int) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Select().Index(int64(index)).Build())) -} - -func (r *resp3) ClientGetName(ctx context.Context) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ClientGetname().Build())) -} - -func (r *resp3) ClientID(ctx context.Context) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().ClientId().Build())) -} - -func (r *resp3) ClientKill(ctx context.Context, ipPort string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(CLIENT).Args(KILL).Args(ipPort).Build())) -} - -func (r *resp3) ClientKillByFilter(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(CLIENT).Args(KILL).Args(keys...).Build())) -} - -func (r *resp3) ClientList(ctx context.Context) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ClientList().Build())) -} - -func (r *resp3) ClientPause(ctx context.Context, dur time.Duration) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().ClientPause().Timeout(formatSec(dur)).Build())) -} - -func (r *resp3) Echo(ctx context.Context, message interface{}) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Echo().Message(str(message)).Build())) -} - -func (r *resp3) Ping(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Ping().Build())) -} - -func (r *resp3) Quit(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Quit().Build())) -} - -func (r *resp3) Copy(ctx context.Context, sourceKey string, destKey string, db int, replace bool) IntCmd { - var completed rueidis.Completed - var cmd = r.cmd.B().Copy().Source(sourceKey).Destination(destKey).Db(int64(db)) - if replace { - completed = cmd.Replace().Build() - } else { - completed = cmd.Build() - } - return newIntCmd(r.cmd.Do(ctx, completed)) -} - -func (r *resp3) Del(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Del().Key(keys...).Build())) -} - -func (r *resp3) Dump(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Dump().Key(key).Build())) -} - -func (r *resp3) getExistsCompleted(keys ...string) rueidis.Completed { - return r.cmd.B().Exists().Key(keys...).Build() -} - -func (r *resp3) Exists(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getExistsCompleted(keys...))) -} - -func (r *resp3Cache) Exists(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getExistsCompleted(keys...))) -} - -func (r *resp3) Expire(ctx context.Context, key string, expiration time.Duration) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Expire().Key(key).Seconds(formatSec(expiration)).Build())) -} - -func (r *resp3) ExpireAt(ctx context.Context, key string, tm time.Time) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Expireat().Key(key).Timestamp(tm.Unix()).Build())) -} - -func (r *resp3) Keys(ctx context.Context, pattern string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Keys().Pattern(pattern).Build())) -} - -func (r *resp3) Migrate(ctx context.Context, host, port, key string, db int, timeout time.Duration) StatusCmd { - iport, err := parseInt(port) - if err != nil { - return newStatusCmdWithError(err) - } - var migratePort = r.cmd.B().Migrate().Host(host).Port(iport) - if len(key) > 0 { - return newStatusCmd(r.cmd.Do(ctx, migratePort.Key().DestinationDb(int64(db)).Timeout(formatSec(timeout)).Build())) - } - return newStatusCmd(r.cmd.Do(ctx, migratePort.Empty().DestinationDb(int64(db)).Timeout(formatSec(timeout)).Build())) -} - -func (r *resp3) Move(ctx context.Context, key string, db int) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Move().Key(key).Db(int64(db)).Build())) -} - -func (r *resp3) ObjectRefCount(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().ObjectRefcount().Key(key).Build())) -} - -func (r *resp3) ObjectEncoding(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ObjectEncoding().Key(key).Build())) -} - -func (r *resp3) ObjectIdleTime(ctx context.Context, key string) DurationCmd { - return newDurationCmd(r.cmd.Do(ctx, r.cmd.B().ObjectIdletime().Key(key).Build()), time.Second) -} - -func (r *resp3) Persist(ctx context.Context, key string) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Persist().Key(key).Build())) -} - -func (r *resp3) PExpire(ctx context.Context, key string, expiration time.Duration) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Pexpire().Key(key).Milliseconds(formatMs(expiration)).Build())) -} - -func (r *resp3) PExpireAt(ctx context.Context, key string, tm time.Time) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Pexpireat().Key(key).MillisecondsTimestamp(tm.UnixNano()/int64(time.Millisecond)).Build())) -} - -func (r *resp3) getPTTLCompleted(key string) rueidis.Completed { - return r.cmd.B().Pttl().Key(key).Build() -} - -func (r *resp3) PTTL(ctx context.Context, key string) DurationCmd { - return newDurationCmd(r.cmd.Do(ctx, r.getPTTLCompleted(key)), time.Millisecond) -} - -func (r *resp3Cache) PTTL(ctx context.Context, key string) DurationCmd { - return newDurationCmd(r.Do(ctx, r.resp.getPTTLCompleted(key)), time.Millisecond) -} - -func (r *resp3) RandomKey(ctx context.Context) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Randomkey().Build())) -} - -func (r *resp3) Rename(ctx context.Context, key, newkey string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Rename().Key(key).Newkey(newkey).Build())) -} - -func (r *resp3) RenameNX(ctx context.Context, key, newkey string) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Renamenx().Key(key).Newkey(newkey).Build())) -} - -func (r *resp3) Restore(ctx context.Context, key string, ttl time.Duration, value string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Restore().Key(key).Ttl(formatMs(ttl)).SerializedValue(value).Build())) -} - -func (r *resp3) RestoreReplace(ctx context.Context, key string, ttl time.Duration, value string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Restore().Key(key).Ttl(formatMs(ttl)).SerializedValue(value).Replace().Build())) -} - -func (r *resp3) getScanArgs(cursor uint64, match string, count int64) rueidis.Arbitrary { - cmd := r.cmd.B().Arbitrary(SCAN, str(cursor)) - if len(match) > 0 { - cmd = cmd.Args(MATCH, match) - } - if count > 0 { - cmd = cmd.Args(COUNT, str(count)) - } - return cmd -} - -func (r *resp3) Scan(ctx context.Context, cursor uint64, match string, count int64) ScanCmd { - return newScanCmd(r.cmd.Do(ctx, r.getScanArgs(cursor, match, count).ReadOnly())) -} - -func (r *resp3) ScanType(ctx context.Context, cursor uint64, match string, count int64, keyType string) ScanCmd { - args := r.getScanArgs(cursor, match, count) - if len(keyType) > 0 { - args = args.Args(TYPE, keyType) - } - return newScanCmd(r.cmd.Do(ctx, args.ReadOnly())) -} - -func (r *resp3) getSortArgs(key string, sort Sort) rueidis.Arbitrary { - arbitrary := r.cmd.B().Arbitrary(SORT).Keys(key) - if len(sort.By) > 0 { - arbitrary = arbitrary.Args(BY, sort.By) - } - if sort.Offset != 0 || sort.Count != 0 { - arbitrary = arbitrary.Args(LIMIT, str(sort.Offset), str(sort.Count)) - } - for _, g := range sort.Get { - arbitrary = arbitrary.Args(GET, g) - } - if len(sort.Order) > 0 { - arbitrary = arbitrary.Args(sort.Order) - } - if sort.Alpha { - arbitrary = arbitrary.Args(ALPHA) - } - return arbitrary -} - -func (r *resp3) Sort(ctx context.Context, key string, sort Sort) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getSortArgs(key, sort).Build())) -} - -func (r *resp3Cache) Sort(ctx context.Context, key string, sort Sort) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getSortArgs(key, sort).Build())) -} - -func (r *resp3) SortStore(ctx context.Context, key, store string, sort Sort) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getSortArgs(key, sort).Args(STORE, store).Build())) -} - -func (r *resp3) SortInterfaces(ctx context.Context, key string, sort Sort) SliceCmd { - return newSliceCmd(r.cmd.Do(ctx, r.getSortArgs(key, sort).Build())) -} - -func (r *resp3Cache) SortInterfaces(ctx context.Context, key string, sort Sort) SliceCmd { - return newSliceCmd(r.Do(ctx, r.resp.getSortArgs(key, sort).Build())) -} - -func (r *resp3) Touch(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Touch().Key(keys...).Build())) -} - -func (r *resp3) getTTLCompleted(key string) rueidis.Completed { - return r.cmd.B().Ttl().Key(key).Build() -} - -func (r *resp3) TTL(ctx context.Context, key string) DurationCmd { - return newDurationCmd(r.cmd.Do(ctx, r.getTTLCompleted(key)), time.Second) -} - -func (r *resp3Cache) TTL(ctx context.Context, key string) DurationCmd { - return newDurationCmd(r.Do(ctx, r.resp.getTTLCompleted(key)), time.Second) -} - -func (r *resp3) getTypeCompleted(key string) rueidis.Completed { - return r.cmd.B().Type().Key(key).Build() -} - -func (r *resp3) Type(ctx context.Context, key string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.getTypeCompleted(key))) -} - -func (r *resp3Cache) Type(ctx context.Context, key string) StatusCmd { - return newStatusCmd(r.Do(ctx, r.resp.getTypeCompleted(key))) -} - -func (r *resp3) Unlink(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Unlink().Key(keys...).Build())) -} - -func (r *resp3) GeoAdd(ctx context.Context, key string, geoLocation ...GeoLocation) IntCmd { - cmd := r.cmd.B().Geoadd().Key(key).LongitudeLatitudeMember() - for _, loc := range geoLocation { - cmd = cmd.LongitudeLatitudeMember(loc.Longitude, loc.Latitude, loc.Name) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) getGeoDistCompleted(key string, member1, member2, unit string) rueidis.Completed { - var completed rueidis.Completed - var geodistMember2 = r.cmd.B().Geodist().Key(key).Member1(member1).Member2(member2) - switch strings.ToUpper(unit) { - case M: - completed = geodistMember2.M().Build() - case MI: - completed = geodistMember2.Mi().Build() - case FT: - completed = geodistMember2.Ft().Build() - case KM, EMPTY: - completed = geodistMember2.Km().Build() - default: - panic(fmt.Sprintf("invalid unit %s", unit)) - } - return completed -} - -func (r *resp3) GeoDist(ctx context.Context, key string, member1, member2, unit string) FloatCmd { - return newFloatCmd(r.cmd.Do(ctx, r.getGeoDistCompleted(key, member1, member2, unit))) -} - -func (r *resp3Cache) GeoDist(ctx context.Context, key string, member1, member2, unit string) FloatCmd { - return newFloatCmd(r.Do(ctx, r.resp.getGeoDistCompleted(key, member1, member2, unit))) -} - -func (r *resp3) getGeoHashCompleted(key string, members ...string) rueidis.Completed { - return r.cmd.B().Geohash().Key(key).Member(members...).Build() -} - -func (r *resp3) GeoHash(ctx context.Context, key string, members ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getGeoHashCompleted(key, members...))) -} - -func (r *resp3Cache) GeoHash(ctx context.Context, key string, members ...string) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getGeoHashCompleted(key, members...))) -} - -func (r *resp3) getGeoPosCompleted(key string, members ...string) rueidis.Completed { - return r.cmd.B().Geopos().Key(key).Member(members...).Build() -} - -func (r *resp3) GeoPos(ctx context.Context, key string, members ...string) GeoPosCmd { - return newGeoPosCmd(r.cmd.Do(ctx, r.getGeoPosCompleted(key, members...))) -} - -func (r *resp3Cache) GeoPos(ctx context.Context, key string, members ...string) GeoPosCmd { - return newGeoPosCmd(r.Do(ctx, r.resp.getGeoPosCompleted(key, members...))) -} - -func (r *resp3) getGeoRadiusCompleted(key string, longitude, latitude float64, q GeoRadiusQuery) rueidis.Completed { - return r.cmd.B().Arbitrary(GEORADIUS_RO).Keys(key).Args(str(longitude), str(latitude)).Args(getGeoRadiusQueryArgs(q)...).Build() -} - -func (r *resp3) GeoRadius(ctx context.Context, key string, longitude, latitude float64, q GeoRadiusQuery) GeoLocationCmd { - if len(q.Store) > 0 || len(q.StoreDist) > 0 { - return newGeoLocationCmdWithError(errGeoRadiusNotSupportStore) - } - return newGeoLocationCmd(r.cmd.Do(ctx, r.getGeoRadiusCompleted(key, longitude, latitude, q)), q) -} - -func (r *resp3Cache) GeoRadius(ctx context.Context, key string, longitude, latitude float64, q GeoRadiusQuery) GeoLocationCmd { - if len(q.Store) > 0 || len(q.StoreDist) > 0 { - return newGeoLocationCmdWithError(errGeoRadiusNotSupportStore) - } - return newGeoLocationCmd(r.Do(ctx, r.resp.getGeoRadiusCompleted(key, longitude, latitude, q)), q) -} - -func (r *resp3) GeoRadiusStore(ctx context.Context, key string, longitude, latitude float64, q GeoRadiusQuery) IntCmd { - cmd := r.cmd.B().Arbitrary(GEORADIUS).Keys(key).Args(str(longitude), str(latitude)) - if len(q.Store) == 0 && len(q.StoreDist) == 0 { - return newIntCmdWithError(errGeoRadiusStoreRequiresStore) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Args(getGeoRadiusQueryArgs(q)...).Build())) -} - -func (r *resp3) getGeoRadiusByMemberCompleted(key, member string, q GeoRadiusQuery) rueidis.Completed { - return r.cmd.B().Arbitrary(GEORADIUSBYMEMBER_RO).Keys(key).Args(member).Args(getGeoRadiusQueryArgs(q)...).Build() -} - -func (r *resp3) GeoRadiusByMember(ctx context.Context, key, member string, q GeoRadiusQuery) GeoLocationCmd { - if len(q.Store) > 0 || len(q.StoreDist) > 0 { - return newGeoLocationCmdWithError(errGeoRadiusByMemberNotSupportStore) - } - return newGeoLocationCmd(r.cmd.Do(ctx, r.getGeoRadiusByMemberCompleted(key, member, q)), q) -} - -func (r *resp3Cache) GeoRadiusByMember(ctx context.Context, key, member string, q GeoRadiusQuery) GeoLocationCmd { - if len(q.Store) > 0 || len(q.StoreDist) > 0 { - return newGeoLocationCmdWithError(errGeoRadiusByMemberNotSupportStore) - } - return newGeoLocationCmd(r.Do(ctx, r.resp.getGeoRadiusByMemberCompleted(key, member, q)), q) -} - -func (r *resp3) GeoRadiusByMemberStore(ctx context.Context, key, member string, q GeoRadiusQuery) IntCmd { - cmd := r.cmd.B().Arbitrary(GEORADIUSBYMEMBER).Keys(key).Args(member) - if len(q.Store) == 0 && len(q.StoreDist) == 0 { - return newIntCmdWithError(errGeoRadiusByMemberStoreRequiresStore) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Args(getGeoRadiusQueryArgs(q)...).Build())) -} - -func (r *resp3) getGeoSearchCompleted(key string, q GeoSearchQuery) rueidis.Completed { - return r.cmd.B().Arbitrary(GEOSEARCH).Keys(key).Args(getGeoSearchQueryArgs(q)...).Build() -} - -func (r *resp3) GeoSearch(ctx context.Context, key string, q GeoSearchQuery) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getGeoSearchCompleted(key, q))) -} - -func (r *resp3Cache) GeoSearch(ctx context.Context, key string, q GeoSearchQuery) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getGeoSearchCompleted(key, q))) -} - -func (r *resp3) getGeoSearchLocationCompleted(key string, q GeoSearchLocationQuery) rueidis.Completed { - return r.cmd.B().Arbitrary(GEOSEARCH).Keys(key).Args(getGeoSearchLocationQueryArgs(q)...).Build() -} - -func (r *resp3) GeoSearchLocation(ctx context.Context, key string, q GeoSearchLocationQuery) GeoSearchLocationCmd { - return newGeoSearchLocationCmd(r.cmd.Do(ctx, r.getGeoSearchLocationCompleted(key, q)), q) -} - -func (r *resp3Cache) GeoSearchLocation(ctx context.Context, key string, q GeoSearchLocationQuery) GeoSearchLocationCmd { - return newGeoSearchLocationCmd(r.Do(ctx, r.resp.getGeoSearchLocationCompleted(key, q)), q) -} - -func (r *resp3) GeoSearchStore(ctx context.Context, src, dest string, q GeoSearchStoreQuery) IntCmd { - cmd := r.cmd.B().Arbitrary(GEOSEARCHSTORE).Keys(dest, src).Args(getGeoSearchQueryArgs(q.GeoSearchQuery)...) - if q.StoreDist { - cmd = cmd.Args(STOREDIST) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) HDel(ctx context.Context, key string, fields ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Hdel().Key(key).Field(fields...).Build())) -} - -func (r *resp3) getHExistsCompleted(key, field string) rueidis.Completed { - return r.cmd.B().Hexists().Key(key).Field(field).Build() -} - -func (r *resp3) HExists(ctx context.Context, key, field string) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.getHExistsCompleted(key, field))) -} - -func (r *resp3Cache) HExists(ctx context.Context, key, field string) BoolCmd { - return newBoolCmd(r.Do(ctx, r.resp.getHExistsCompleted(key, field))) -} - -func (r *resp3) getHGetCompleted(key, field string) rueidis.Completed { - return r.cmd.B().Hget().Key(key).Field(field).Build() -} - -func (r *resp3) HGet(ctx context.Context, key, field string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.getHGetCompleted(key, field))) -} - -func (r *resp3Cache) HGet(ctx context.Context, key, field string) StringCmd { - return newStringCmd(r.Do(ctx, r.resp.getHGetCompleted(key, field))) -} - -func (r *resp3) getHGetAllCompleted(key string) rueidis.Completed { - return r.cmd.B().Hgetall().Key(key).Build() -} - -func (r *resp3) HGetAll(ctx context.Context, key string) StringStringMapCmd { - return newStringStringMapCmd(r.cmd.Do(ctx, r.getHGetAllCompleted(key))) -} - -func (r *resp3Cache) HGetAll(ctx context.Context, key string) StringStringMapCmd { - return newStringStringMapCmd(r.Do(ctx, r.resp.getHGetAllCompleted(key))) -} - -func (r *resp3) HIncrBy(ctx context.Context, key, field string, incr int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Hincrby().Key(key).Field(field).Increment(incr).Build())) -} - -func (r *resp3) HIncrByFloat(ctx context.Context, key, field string, incr float64) FloatCmd { - return newFloatCmd(r.cmd.Do(ctx, r.cmd.B().Hincrbyfloat().Key(key).Field(field).Increment(incr).Build())) -} - -func (r *resp3) getHKeysCompleted(key string) rueidis.Completed { - return r.cmd.B().Hkeys().Key(key).Build() -} - -func (r *resp3) HKeys(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getHKeysCompleted(key))) -} - -func (r *resp3Cache) HKeys(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getHKeysCompleted(key))) -} - -func (r *resp3) getHLenCompleted(key string) rueidis.Completed { - return r.cmd.B().Hlen().Key(key).Build() -} - -func (r *resp3) HLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getHLenCompleted(key))) -} - -func (r *resp3Cache) HLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getHLenCompleted(key))) -} - -func (r *resp3) getHMGetCompleted(key string, fields ...string) rueidis.Completed { - return r.cmd.B().Hmget().Key(key).Field(fields...).Build() -} - -func (r *resp3) HMGet(ctx context.Context, key string, fields ...string) SliceCmd { - return newSliceCmd(r.cmd.Do(ctx, r.getHMGetCompleted(key, fields...)), HMGET) -} - -func (r *resp3Cache) HMGet(ctx context.Context, key string, fields ...string) SliceCmd { - return newSliceCmd(r.Do(ctx, r.resp.getHMGetCompleted(key, fields...)), HMGET) -} - -func (r *resp3) HMSet(ctx context.Context, key string, values ...interface{}) BoolCmd { - fv := r.cmd.B().Hset().Key(key).FieldValue() - args := argsToSlice(values) - for i := 0; i < len(args); i += 2 { - fv = fv.FieldValue(args[i], args[i+1]) - } - return newBoolCmd(r.cmd.Do(ctx, fv.Build())) -} - -func (r *resp3) HRandField(ctx context.Context, key string, count int, withValues bool) StringSliceCmd { - h := r.cmd.B().Hrandfield().Key(key).Count(int64(count)) - if withValues { - return flattenStringSliceCmd(r.cmd.Do(ctx, h.Withvalues().Build())) - } - return newStringSliceCmd(r.cmd.Do(ctx, h.Build())) -} - -func (r *resp3) HScan(ctx context.Context, key string, cursor uint64, match string, count int64) ScanCmd { - cmd := r.cmd.B().Arbitrary(HSCAN).Keys(key).Args(str(int64(cursor))) - if match != "" { - cmd = cmd.Args(MATCH, match) - } - if count > 0 { - cmd = cmd.Args(COUNT, str(count)) - } - return newScanCmd(r.cmd.Do(ctx, cmd.ReadOnly())) -} - -func (r *resp3) HSet(ctx context.Context, key string, values ...interface{}) IntCmd { - fv := r.cmd.B().Hset().Key(key).FieldValue() - args := argsToSlice(values) - for i := 0; i < len(args); i += 2 { - fv = fv.FieldValue(args[i], args[i+1]) - } - return newIntCmd(r.cmd.Do(ctx, fv.Build())) -} - -func (r *resp3) HSetNX(ctx context.Context, key, field string, value interface{}) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Hsetnx().Key(key).Field(field).Value(str(value)).Build())) -} - -func (r *resp3) getHValsCompleted(key string) rueidis.Completed { - return r.cmd.B().Hvals().Key(key).Build() -} - -func (r *resp3) HVals(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getHValsCompleted(key))) -} - -func (r *resp3Cache) HVals(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getHValsCompleted(key))) -} - -func (r *resp3) PFAdd(ctx context.Context, key string, els ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Pfadd().Key(key).Element(argsToSlice(els)...).Build())) -} - -func (r *resp3) PFCount(ctx context.Context, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Pfcount().Key(keys...).Build())) -} - -func (r *resp3) PFMerge(ctx context.Context, dest string, keys ...string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Pfmerge().Destkey(dest).Sourcekey(keys...).Build())) -} - -func (r *resp3) BLMove(ctx context.Context, source, destination, srcpos, destpos string, timeout time.Duration) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(BLMOVE).Keys(source, destination). - Args(srcpos, destpos, str(float64(formatSec(timeout)))).Blocking())) -} - -func (r *resp3) BLPop(ctx context.Context, timeout time.Duration, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Blpop().Key(keys...).Timeout(float64(formatSec(timeout))).Build())) -} - -func (r *resp3) BRPop(ctx context.Context, timeout time.Duration, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Brpop().Key(keys...).Timeout(float64(formatSec(timeout))).Build())) -} - -func (r *resp3) BRPopLPush(ctx context.Context, source, destination string, timeout time.Duration) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Brpoplpush().Source(source).Destination(destination).Timeout(float64(formatSec(timeout))).Build())) -} - -func (r *resp3) getLIndexCompleted(key string, index int64) rueidis.Completed { - return r.cmd.B().Lindex().Key(key).Index(index).Build() -} - -func (r *resp3) LIndex(ctx context.Context, key string, index int64) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.getLIndexCompleted(key, index))) -} - -func (r *resp3Cache) LIndex(ctx context.Context, key string, index int64) StringCmd { - return newStringCmd(r.Do(ctx, r.resp.getLIndexCompleted(key, index))) -} - -func (r *resp3) LInsert(ctx context.Context, key, op string, pivot, value interface{}) IntCmd { - var linsertKey = r.cmd.B().Linsert().Key(key) - switch strings.ToUpper(op) { - case BEFORE: - return newIntCmd(r.cmd.Do(ctx, linsertKey.Before().Pivot(str(pivot)).Element(str(value)).Build())) - case AFTER: - return newIntCmd(r.cmd.Do(ctx, linsertKey.After().Pivot(str(pivot)).Element(str(value)).Build())) - default: - panic(fmt.Sprintf("Invalid op argument value: %s", op)) - } -} - -func (r *resp3) LInsertBefore(ctx context.Context, key string, pivot, value interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Linsert().Key(key).Before().Pivot(str(pivot)).Element(str(value)).Build())) -} - -func (r *resp3) LInsertAfter(ctx context.Context, key string, pivot, value interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Linsert().Key(key).After().Pivot(str(pivot)).Element(str(value)).Build())) -} - -func (r *resp3) getLLenCompleted(key string) rueidis.Completed { - return r.cmd.B().Llen().Key(key).Build() -} - -func (r *resp3) LLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getLLenCompleted(key))) -} - -func (r *resp3Cache) LLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getLLenCompleted(key))) -} - -func (r *resp3) LMove(ctx context.Context, source, destination, srcpos, destpos string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(LMOVE).Keys(source, destination).Args(srcpos, destpos).Build())) -} - -func (r *resp3) LPop(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Lpop().Key(key).Build())) -} - -func (r *resp3) LPopCount(ctx context.Context, key string, count int) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Lpop().Key(key).Count(int64(count)).Build())) -} - -func (r *resp3) getLPosCompleted(key string, value string, count int64, args LPosArgs) rueidis.Completed { - arbitrary := r.cmd.B().Arbitrary(LPOS).Keys(key).Args(value) - if count >= 0 { - arbitrary = arbitrary.Args(COUNT, str(count)) - } - if args.Rank != 0 { - arbitrary = arbitrary.Args(RANK, str(args.Rank)) - } - if args.MaxLen != 0 { - arbitrary = arbitrary.Args(MAXLEN, str(args.MaxLen)) - } - return arbitrary.Build() -} - -func (r *resp3) LPos(ctx context.Context, key string, value string, args LPosArgs) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getLPosCompleted(key, value, -1, args))) -} - -func (r *resp3Cache) LPos(ctx context.Context, key string, value string, args LPosArgs) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getLPosCompleted(key, value, -1, args))) -} - -func (r *resp3) LPosCount(ctx context.Context, key string, value string, count int64, args LPosArgs) IntSliceCmd { - return newIntSliceCmd(r.cmd.Do(ctx, r.getLPosCompleted(key, value, count, args))) -} - -func (r *resp3Cache) LPosCount(ctx context.Context, key string, value string, count int64, args LPosArgs) IntSliceCmd { - return newIntSliceCmd(r.Do(ctx, r.resp.getLPosCompleted(key, value, count, args))) -} - -func (r *resp3) LPush(ctx context.Context, key string, values ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Lpush().Key(key).Element(argsToSlice(values)...).Build())) -} - -func (r *resp3) LPushX(ctx context.Context, key string, values ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Lpushx().Key(key).Element(argsToSlice(values)...).Build())) -} - -func (r *resp3) getLRangeCompleted(key string, start, stop int64) rueidis.Completed { - return r.cmd.B().Lrange().Key(key).Start(start).Stop(stop).Build() -} - -func (r *resp3) LRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getLRangeCompleted(key, start, stop))) -} - -func (r *resp3Cache) LRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getLRangeCompleted(key, start, stop))) -} - -func (r *resp3) LRem(ctx context.Context, key string, count int64, value interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Lrem().Key(key).Count(count).Element(str(value)).Build())) -} - -func (r *resp3) LSet(ctx context.Context, key string, index int64, value interface{}) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Lset().Key(key).Index(index).Element(str(value)).Build())) -} - -func (r *resp3) LTrim(ctx context.Context, key string, start, stop int64) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Ltrim().Key(key).Start(start).Stop(stop).Build())) -} - -func (r *resp3) RPop(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Rpop().Key(key).Build())) -} - -func (r *resp3) RPopCount(ctx context.Context, key string, count int) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Rpop().Key(key).Count(int64(count)).Build())) -} - -func (r *resp3) RPopLPush(ctx context.Context, source, destination string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Rpoplpush().Source(source).Destination(destination).Build())) -} - -func (r *resp3) RPush(ctx context.Context, key string, values ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Rpush().Key(key).Element(argsToSlice(values)...).Build())) -} - -func (r *resp3) RPushX(ctx context.Context, key string, values ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Rpushx().Key(key).Element(argsToSlice(values)...).Build())) -} - -type pipelineResp3 struct { - resp *resp3 - mx sync.Mutex - firstError error - res []interface{} -} - -func (r *resp3) Pipeline() Pipeliner { return &pipelineResp3{resp: r} } - -func (p *pipelineResp3) Put(ctx context.Context, cmd Command, keys []string, args ...interface{}) (err error) { - ctx = p.resp.handler.before(ctx, cmd) - var r interface{} - r, err = p.resp.cmd.Do(ctx, p.resp.cmd.B().Arbitrary(cmd.Cmd()...).Keys(keys...).Args(argsToSlice(args)...).Build()).ToAny() - p.mx.Lock() - if err != nil { - p.res = append(p.res, err) - if p.firstError == nil { - p.firstError = err - } - } else { - p.res = append(p.res, r) - } - p.mx.Unlock() - p.resp.handler.after(ctx, err) - return err -} - -func (p *pipelineResp3) Exec(_ context.Context) ([]interface{}, error) { - return p.res, p.firstError -} - -func (r *resp3) Publish(ctx context.Context, channel string, message interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Publish().Channel(channel).Message(str(message)).Build())) -} - -func (r *resp3) PubSubChannels(ctx context.Context, pattern string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().PubsubChannels().Pattern(pattern).Build())) -} - -func (r *resp3) PubSubNumPat(ctx context.Context) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().PubsubNumpat().Build())) -} - -func (r *resp3) PubSubNumSub(ctx context.Context, channels ...string) StringIntMapCmd { - return newStringIntMapCmd(r.cmd.Do(ctx, r.cmd.B().PubsubNumsub().Channel(channels...).Build())) -} - -func (r *resp3) Subscribe(ctx context.Context, channels ...string) PubSub { - return newPubSubResp3(ctx, r.cmd, r.handler, channels...) -} - -type pubSubResp3 struct { - cmd rueidis.DedicatedClient - msgCh chan *Message - handler handler - cancel context.CancelFunc -} - -func newPubSubResp3(ctx context.Context, cmd rueidis.Client, handler handler, channels ...string) PubSub { - // chan size todo, use goredis.ChannelOption? - p := &pubSubResp3{msgCh: make(chan *Message, 100), handler: handler} - p.cmd, p.cancel = cmd.Dedicate() - p.cmd.SetPubSubHooks(rueidis.PubSubHooks{ - OnMessage: func(m rueidis.PubSubMessage) { - p.msgCh <- &Message{ - Channel: m.Channel, - Pattern: m.Pattern, - Payload: m.Message, - } - }, - }) - if len(channels) > 0 { - _ = p.Subscribe(ctx, channels...) - } - return p -} - -func (p *pubSubResp3) Close() error { - close(p.msgCh) - p.cancel() - return nil -} - -func (p *pubSubResp3) PSubscribe(ctx context.Context, patterns ...string) error { - ctx = p.handler.before(ctx, CommandPSubscribe) - err := p.cmd.Do(ctx, p.cmd.B().Psubscribe().Pattern(patterns...).Build()).Error() - p.handler.after(ctx, err) - return err -} - -func (p *pubSubResp3) Subscribe(ctx context.Context, channels ...string) error { - ctx = p.handler.before(ctx, CommandSubscribe) - err := p.cmd.Do(ctx, p.cmd.B().Subscribe().Channel(channels...).Build()).Error() - p.handler.after(ctx, err) - return err -} - -func (p *pubSubResp3) Unsubscribe(ctx context.Context, channels ...string) error { - ctx = p.handler.before(ctx, CommandUnsubscribe) - err := p.cmd.Do(ctx, p.cmd.B().Unsubscribe().Channel(channels...).Build()).Error() - p.handler.after(ctx, err) - return err -} - -func (p *pubSubResp3) PUnsubscribe(ctx context.Context, patterns ...string) error { - ctx = p.handler.before(ctx, CommandPUnsubscribe) - err := p.cmd.Do(ctx, p.cmd.B().Punsubscribe().Pattern(patterns...).Build()).Error() - p.handler.after(ctx, err) - return err -} - -func (p *pubSubResp3) Channel() <-chan *Message { - return p.msgCh -} - -func (r *resp3) CreateScript(string) Scripter { return nil } - -func (r *resp3) Eval(ctx context.Context, script string, keys []string, args ...interface{}) Cmd { - return newCmd(r.cmd.Do(ctx, r.cmd.B().Eval().Script(script).Numkeys(int64(len(keys))).Key(keys...).Arg(argsToSlice(args)...).Build())) -} - -func (r *resp3) EvalSha(ctx context.Context, sha1 string, keys []string, args ...interface{}) Cmd { - return newCmd(r.cmd.Do(ctx, r.cmd.B().Evalsha().Sha1(sha1).Numkeys(int64(len(keys))).Key(keys...).Arg(argsToSlice(args)...).Build())) -} - -func (r *resp3) ScriptExists(ctx context.Context, hashes ...string) BoolSliceCmd { - return newBoolSliceCmd(r.cmd.Do(ctx, r.cmd.B().ScriptExists().Sha1(hashes...).Build())) -} - -func (r *resp3) ScriptFlush(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ScriptFlush().Build())) -} - -func (r *resp3) ScriptKill(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ScriptKill().Build())) -} - -func (r *resp3) ScriptLoad(ctx context.Context, script string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().ScriptLoad().Script(script).Build())) -} - -func (r *resp3) BgRewriteAOF(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Bgrewriteaof().Build())) -} - -func (r *resp3) BgSave(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Bgsave().Build())) -} - -func (r *resp3) Command(ctx context.Context) CommandsInfoCmd { - return newCommandsInfoCmd(r.cmd.Do(ctx, r.cmd.B().Command().Build())) -} - -func (r *resp3) ConfigGet(ctx context.Context, parameter string) SliceCmd { - return newSliceCmdFromMap(r.cmd.Do(ctx, r.cmd.B().ConfigGet().Parameter(parameter).Build())) -} - -func (r *resp3) ConfigResetStat(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ConfigResetstat().Build())) -} - -func (r *resp3) ConfigRewrite(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ConfigRewrite().Build())) -} - -func (r *resp3) ConfigSet(ctx context.Context, parameter, value string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().ConfigSet().ParameterValue().ParameterValue(parameter, value).Build())) -} - -func (r *resp3) DBSize(ctx context.Context) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Dbsize().Build())) -} - -func (r *resp3) FlushAll(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Flushall().Build())) -} - -func (r *resp3) FlushAllAsync(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Flushall().Async().Build())) -} - -func (r *resp3) FlushDB(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Flushdb().Build())) -} - -func (r *resp3) FlushDBAsync(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Flushdb().Async().Build())) -} - -func (r *resp3) Info(ctx context.Context, section ...string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Info().Section(section...).Build())) -} - -func (r *resp3) LastSave(ctx context.Context) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Lastsave().Build())) -} - -func (r *resp3) MemoryUsage(ctx context.Context, key string, samples ...int) IntCmd { - var memoryUsageKey = r.cmd.B().MemoryUsage().Key(key) - switch len(samples) { - case 0: - return newIntCmd(r.cmd.Do(ctx, memoryUsageKey.Build())) - case 1: - return newIntCmd(r.cmd.Do(ctx, memoryUsageKey.Samples(int64(samples[0])).Build())) - default: - panic(errMemoryUsageArgsCount) - } - -} - -func (r *resp3) Save(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Save().Build())) -} - -func (r *resp3) Shutdown(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Shutdown().Build())) -} - -func (r *resp3) ShutdownSave(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Shutdown().Save().Build())) -} - -func (r *resp3) ShutdownNoSave(ctx context.Context) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Shutdown().Nosave().Build())) -} - -func (r *resp3) SlaveOf(ctx context.Context, host, port string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Arbitrary(SLAVEOF).Args(host, port).Build())) -} - -func (r *resp3) Time(ctx context.Context) TimeCmd { - return newTimeCmd(r.cmd.Do(ctx, r.cmd.B().Time().Build())) -} - -func (r *resp3) DebugObject(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().DebugObject().Key(key).Build())) -} - -func (r *resp3) SAdd(ctx context.Context, key string, members ...interface{}) IntCmd { - cmd := r.cmd.B().Sadd().Key(key).Member() - for _, m := range argsToSlice(members) { - cmd = cmd.Member(str(m)) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) getSCardCompleted(key string) rueidis.Completed { - return r.cmd.B().Scard().Key(key).Build() -} - -func (r *resp3) SCard(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getSCardCompleted(key))) -} - -func (r *resp3Cache) SCard(ctx context.Context, key string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getSCardCompleted(key))) -} - -func (r *resp3) SDiff(ctx context.Context, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Sdiff().Key(keys...).Build())) -} - -func (r *resp3) SDiffStore(ctx context.Context, destination string, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Sdiffstore().Destination(destination).Key(keys...).Build())) -} - -func (r *resp3) SInter(ctx context.Context, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Sinter().Key(keys...).Build())) -} - -func (r *resp3) SInterStore(ctx context.Context, destination string, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Sinterstore().Destination(destination).Key(keys...).Build())) -} - -func (r *resp3) getSIsMemberCompleted(key string, member interface{}) rueidis.Completed { - return r.cmd.B().Sismember().Key(key).Member(str(member)).Build() -} - -func (r *resp3) SIsMember(ctx context.Context, key string, member interface{}) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.getSIsMemberCompleted(key, member))) -} - -func (r *resp3Cache) SIsMember(ctx context.Context, key string, member interface{}) BoolCmd { - return newBoolCmd(r.Do(ctx, r.resp.getSIsMemberCompleted(key, member))) -} - -func (r *resp3) getSMIsMemberCompleted(key string, members ...interface{}) rueidis.Completed { - return r.cmd.B().Smismember().Key(key).Member(argsToSlice(members)...).Build() -} - -func (r *resp3) SMIsMember(ctx context.Context, key string, members ...interface{}) BoolSliceCmd { - return newBoolSliceCmd(r.cmd.Do(ctx, r.getSMIsMemberCompleted(key, members...))) -} - -func (r *resp3Cache) SMIsMember(ctx context.Context, key string, members ...interface{}) BoolSliceCmd { - return newBoolSliceCmd(r.Do(ctx, r.resp.getSMIsMemberCompleted(key, members...))) -} - -func (r *resp3) getSMembersCompleted(key string) rueidis.Completed { - return r.cmd.B().Smembers().Key(key).Build() -} - -func (r *resp3) SMembers(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getSMembersCompleted(key))) -} - -func (r *resp3Cache) SMembers(ctx context.Context, key string) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getSMembersCompleted(key))) -} - -func (r *resp3) SMembersMap(ctx context.Context, key string) StringStructMapCmd { - return newStringStructMapCmd(r.cmd.Do(ctx, r.getSMembersCompleted(key))) -} - -func (r *resp3Cache) SMembersMap(ctx context.Context, key string) StringStructMapCmd { - return newStringStructMapCmd(r.Do(ctx, r.resp.getSMembersCompleted(key))) -} - -func (r *resp3) SMove(ctx context.Context, source, destination string, member interface{}) BoolCmd { - return newBoolCmd(r.cmd.Do(ctx, r.cmd.B().Smove().Source(source).Destination(destination).Member(str(member)).Build())) -} - -func (r *resp3) SPop(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Spop().Key(key).Build())) -} - -func (r *resp3) SPopN(ctx context.Context, key string, count int64) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Spop().Key(key).Count(count).Build())) -} - -func (r *resp3) SRandMember(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Srandmember().Key(key).Build())) -} - -func (r *resp3) SRandMemberN(ctx context.Context, key string, count int64) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Srandmember().Key(key).Count(count).Build())) -} - -func (r *resp3) SRem(ctx context.Context, key string, members ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Srem().Key(key).Member(argsToSlice(members)...).Build())) -} - -func (r *resp3) SScan(ctx context.Context, key string, cursor uint64, match string, count int64) ScanCmd { - cmd := r.cmd.B().Arbitrary(SSCAN).Keys(key).Args(str(int64(cursor))) - if match != "" { - cmd = cmd.Args(MATCH, match) - } - if count > 0 { - cmd = cmd.Args(COUNT, str(count)) - } - return newScanCmd(r.cmd.Do(ctx, cmd.ReadOnly())) -} - -func (r *resp3) SUnion(ctx context.Context, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Sunion().Key(keys...).Build())) -} - -func (r *resp3) SUnionStore(ctx context.Context, destination string, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Sunionstore().Destination(destination).Key(keys...).Build())) -} - -func (r *resp3) BZPopMax(ctx context.Context, timeout time.Duration, keys ...string) ZWithKeyCmd { - return newZWithKeyCmd(r.cmd.Do(ctx, r.cmd.B().Bzpopmax().Key(keys...).Timeout(float64(formatSec(timeout))).Build())) -} - -func (r *resp3) BZPopMin(ctx context.Context, timeout time.Duration, keys ...string) ZWithKeyCmd { - return newZWithKeyCmd(r.cmd.Do(ctx, r.cmd.B().Bzpopmin().Key(keys...).Timeout(float64(formatSec(timeout))).Build())) -} - -func (r *resp3) ZAdd(ctx context.Context, key string, members ...Z) IntCmd { - cmd := r.cmd.B().Zadd().Key(key).ScoreMember() - for _, v := range members { - cmd = cmd.ScoreMember(v.Score, str(v.Member)) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) ZAddNX(ctx context.Context, key string, members ...Z) IntCmd { - cmd := r.cmd.B().Zadd().Key(key).Nx().ScoreMember() - for _, v := range members { - cmd = cmd.ScoreMember(v.Score, str(v.Member)) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) ZAddXX(ctx context.Context, key string, members ...Z) IntCmd { - cmd := r.cmd.B().Zadd().Key(key).Xx().ScoreMember() - for _, v := range members { - cmd = cmd.ScoreMember(v.Score, str(v.Member)) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) zAddArgs(ctx context.Context, key string, incr bool, args ZAddArgs, members ...Z) rueidis.RedisResult { - cmd := r.cmd.B().Arbitrary(ZADD).Keys(key) - if args.NX { - cmd = cmd.Args(NX) - } else { - if args.XX { - cmd = cmd.Args(XX) - } - if args.GT { - cmd = cmd.Args(GT) - } else if args.LT { - cmd = cmd.Args(LT) - } - } - if args.Ch { - cmd = cmd.Args(CH) - } - if incr { - cmd = cmd.Args(INCR) - } - for _, v := range members { - cmd = cmd.Args(str(v.Score), str(v.Member)) - } - return r.cmd.Do(ctx, cmd.Build()) -} - -func (r *resp3) ZAddCh(ctx context.Context, key string, members ...Z) IntCmd { - return newIntCmd(r.zAddArgs(ctx, key, false, ZAddArgs{Ch: true}, members...)) -} - -func (r *resp3) ZAddNXCh(ctx context.Context, key string, members ...Z) IntCmd { - return newIntCmd(r.zAddArgs(ctx, key, false, ZAddArgs{NX: true, Ch: true}, members...)) -} - -func (r *resp3) ZAddXXCh(ctx context.Context, key string, members ...Z) IntCmd { - return newIntCmd(r.zAddArgs(ctx, key, false, ZAddArgs{XX: true, Ch: true}, members...)) -} - -func (r *resp3) ZAddArgs(ctx context.Context, key string, args ZAddArgs) IntCmd { - return newIntCmd(r.zAddArgs(ctx, key, false, args, args.Members...)) -} - -func (r *resp3) ZAddArgsIncr(ctx context.Context, key string, args ZAddArgs) FloatCmd { - return newFloatCmd(r.zAddArgs(ctx, key, true, args, args.Members...)) -} - -func (r *resp3) getZCardCompleted(key string) rueidis.Completed { - return r.cmd.B().Zcard().Key(key).Build() -} - -func (r *resp3) ZCard(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZCardCompleted(key))) -} - -func (r *resp3Cache) ZCard(ctx context.Context, key string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getZCardCompleted(key))) -} - -func (r *resp3) getZCount(key, min, max string) rueidis.Completed { - return r.cmd.B().Zcount().Key(key).Min(min).Max(max).Build() -} - -func (r *resp3) ZCount(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZCount(key, min, max))) -} - -func (r *resp3Cache) ZCount(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getZCount(key, min, max))) -} - -func (r *resp3) ZDiff(ctx context.Context, keys ...string) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.cmd.B().Zdiff().Numkeys(int64(len(keys))).Key(keys...).Build())) -} - -func (r *resp3) ZDiffWithScores(ctx context.Context, keys ...string) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.cmd.B().Zdiff().Numkeys(int64(len(keys))).Key(keys...).Withscores().Build())) -} - -func (r *resp3) ZDiffStore(ctx context.Context, destination string, keys ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Zdiffstore().Destination(destination).Numkeys(int64(len(keys))).Key(keys...).Build())) -} - -func (r *resp3) ZIncr(ctx context.Context, key string, member Z) FloatCmd { - return newFloatCmd(r.zAddArgs(ctx, key, true, ZAddArgs{}, member)) -} - -func (r *resp3) ZIncrNX(ctx context.Context, key string, member Z) FloatCmd { - return newFloatCmd(r.zAddArgs(ctx, key, true, ZAddArgs{NX: true}, member)) -} - -func (r *resp3) ZIncrXX(ctx context.Context, key string, member Z) FloatCmd { - return newFloatCmd(r.zAddArgs(ctx, key, true, ZAddArgs{XX: true}, member)) -} - -func (r *resp3) ZIncrBy(ctx context.Context, key string, increment float64, member string) FloatCmd { - return newFloatCmd(r.cmd.Do(ctx, r.cmd.B().Zincrby().Key(key).Increment(increment).Member(member).Build())) -} - -func (r *resp3) fillZInterArbitrary(arbitrary rueidis.Arbitrary, store ZStore) rueidis.Arbitrary { - arbitrary = arbitrary.Args(str(len(store.Keys))).Keys(store.Keys...) - if len(store.Weights) > 0 { - arbitrary = arbitrary.Args(WEIGHTS) - for _, w := range store.Weights { - arbitrary = arbitrary.Args(str(w)) - } - } - if len(store.Aggregate) > 0 { - arbitrary = arbitrary.Args(AGGREGATE, store.Aggregate) - } - return arbitrary -} - -func (r *resp3) ZInter(ctx context.Context, store ZStore) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.fillZInterArbitrary(r.cmd.B().Arbitrary(ZINTER), store).ReadOnly())) -} - -func (r *resp3) ZInterWithScores(ctx context.Context, store ZStore) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.fillZInterArbitrary(r.cmd.B().Arbitrary(ZINTER), store).Args(WITHSCORES).ReadOnly())) -} - -func (r *resp3) ZInterStore(ctx context.Context, destination string, store ZStore) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.fillZInterArbitrary(r.cmd.B().Arbitrary(ZINTERSTORE).Keys(destination), store).Build())) -} - -func (r *resp3) getZLexCountCompleted(key, min, max string) rueidis.Completed { - return r.cmd.B().Zlexcount().Key(key).Min(min).Max(max).Build() -} - -func (r *resp3) ZLexCount(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZLexCountCompleted(key, min, max))) -} - -func (r *resp3Cache) ZLexCount(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getZLexCountCompleted(key, min, max))) -} - -func (r *resp3) getZMScoreCompleted(key string, members ...string) rueidis.Completed { - return r.cmd.B().Zmscore().Key(key).Member(members...).Build() -} - -func (r *resp3) ZMScore(ctx context.Context, key string, members ...string) FloatSliceCmd { - return newFloatSliceCmd(r.cmd.Do(ctx, r.getZMScoreCompleted(key, members...))) -} - -func (r *resp3Cache) ZMScore(ctx context.Context, key string, members ...string) FloatSliceCmd { - return newFloatSliceCmd(r.Do(ctx, r.resp.getZMScoreCompleted(key, members...))) -} - -func (r *resp3) ZPopMax(ctx context.Context, key string, count ...int64) ZSliceCmd { - var resp rueidis.RedisResult - var zpopmaxKey = r.cmd.B().Zpopmax().Key(key) - switch len(count) { - case 0: - resp = r.cmd.Do(ctx, zpopmaxKey.Build()) - case 1: - resp = r.cmd.Do(ctx, zpopmaxKey.Count(count[0]).Build()) - if count[0] > 1 { - return newZSliceCmd(resp) - } - default: - panic(errTooManyArguments) - } - return newZSliceSingleCmd(resp) -} - -func (r *resp3) ZPopMin(ctx context.Context, key string, count ...int64) ZSliceCmd { - var resp rueidis.RedisResult - var zpopminKey = r.cmd.B().Zpopmin().Key(key) - switch len(count) { - case 0: - resp = r.cmd.Do(ctx, zpopminKey.Build()) - case 1: - resp = r.cmd.Do(ctx, zpopminKey.Count(count[0]).Build()) - if count[0] > 1 { - return newZSliceCmd(resp) - } - default: - panic(errTooManyArguments) - } - return newZSliceSingleCmd(resp) -} - -func (r *resp3) ZRandMember(ctx context.Context, key string, count int, withScores bool) StringSliceCmd { - var zrandmemberOptionsCount = r.cmd.B().Zrandmember().Key(key).Count(int64(count)) - if withScores { - return flattenStringSliceCmd(r.cmd.Do(ctx, zrandmemberOptionsCount.Withscores().Build())) - } - return newStringSliceCmd(r.cmd.Do(ctx, zrandmemberOptionsCount.Build())) -} - -func (r *resp3) getZRangeCompleted(key string, start, stop int64) rueidis.Completed { - return r.cmd.B().Zrange().Key(key).Min(str(start)).Max(str(stop)).Build() -} - -func (r *resp3) ZRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRangeCompleted(key, start, stop))) -} - -func (r *resp3Cache) ZRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRangeCompleted(key, start, stop))) -} - -func (r *resp3) getZRangeWithScoresCompleted(key string, start, stop int64) rueidis.Completed { - return r.cmd.B().Zrange().Key(key).Min(str(start)).Max(str(stop)).Withscores().Build() -} - -func (r *resp3) ZRangeWithScores(ctx context.Context, key string, start, stop int64) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.getZRangeWithScoresCompleted(key, start, stop))) -} - -func (r *resp3Cache) ZRangeWithScores(ctx context.Context, key string, start, stop int64) ZSliceCmd { - return newZSliceCmd(r.Do(ctx, r.resp.getZRangeWithScoresCompleted(key, start, stop))) -} - -func (r *resp3) getZRangeByLexCompleted(key string, opt ZRangeBy) rueidis.Completed { - var completed rueidis.Completed - var zrangebylexMax = r.cmd.B().Zrangebylex().Key(key).Min(opt.Min).Max(opt.Max) - if opt.Offset != 0 || opt.Count != 0 { - completed = zrangebylexMax.Limit(opt.Offset, opt.Count).Build() - } else { - completed = zrangebylexMax.Build() - } - return completed -} - -func (r *resp3) ZRangeByLex(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRangeByLexCompleted(key, opt))) -} - -func (r *resp3Cache) ZRangeByLex(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRangeByLexCompleted(key, opt))) -} - -func (r *resp3) getZRangeByScoreCompleted(key string, withScore bool, opt ZRangeBy) rueidis.Completed { - var completed rueidis.Completed - var zrangebyscoreMax = r.cmd.B().Zrangebyscore().Key(key).Min(opt.Min).Max(opt.Max) - if opt.Offset != 0 || opt.Count != 0 { - if withScore { - completed = zrangebyscoreMax.Withscores().Limit(opt.Offset, opt.Count).Build() - } else { - completed = zrangebyscoreMax.Limit(opt.Offset, opt.Count).Build() - } - } else { - if withScore { - completed = zrangebyscoreMax.Withscores().Build() - } else { - completed = zrangebyscoreMax.Build() - } - } - return completed -} - -func (r *resp3) ZRangeByScore(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRangeByScoreCompleted(key, false, opt))) -} - -func (r *resp3Cache) ZRangeByScore(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRangeByScoreCompleted(key, false, opt))) -} - -func (r *resp3) ZRangeByScoreWithScores(ctx context.Context, key string, opt ZRangeBy) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.getZRangeByScoreCompleted(key, true, opt))) -} - -func (r *resp3Cache) ZRangeByScoreWithScores(ctx context.Context, key string, opt ZRangeBy) ZSliceCmd { - return newZSliceCmd(r.Do(ctx, r.resp.getZRangeByScoreCompleted(key, true, opt))) -} - -func (r *resp3) getZRangeArgsArbitrary(arbitrary rueidis.Arbitrary, withScores bool, z ZRangeArgs) rueidis.Arbitrary { - if z.Rev && (z.ByScore || z.ByLex) { - arbitrary = arbitrary.Args(str(z.Stop), str(z.Start)) - } else { - arbitrary = arbitrary.Args(str(z.Start), str(z.Stop)) - } - if z.ByScore { - arbitrary = arbitrary.Args(BYSCORE) - } else if z.ByLex { - arbitrary = arbitrary.Args(BYLEX) - } - if z.Rev { - arbitrary = arbitrary.Args(REV) - } - if z.Offset != 0 || z.Count != 0 { - arbitrary = arbitrary.Args(LIMIT, str(z.Offset), str(z.Count)) - } - if withScores { - arbitrary = arbitrary.Args(WITHSCORES) - } - return arbitrary -} - -func (r *resp3) getZRangeArgsCompleted(withScores bool, z ZRangeArgs) rueidis.Completed { - return r.getZRangeArgsArbitrary(r.cmd.B().Arbitrary(ZRANGE).Keys(z.Key), withScores, z).Build() -} - -func (r *resp3) ZRangeArgs(ctx context.Context, z ZRangeArgs) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRangeArgsCompleted(false, z))) -} - -func (r *resp3Cache) ZRangeArgs(ctx context.Context, z ZRangeArgs) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRangeArgsCompleted(false, z))) -} - -func (r *resp3) ZRangeArgsWithScores(ctx context.Context, z ZRangeArgs) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.getZRangeArgsCompleted(true, z))) -} - -func (r *resp3Cache) ZRangeArgsWithScores(ctx context.Context, z ZRangeArgs) ZSliceCmd { - return newZSliceCmd(r.Do(ctx, r.resp.getZRangeArgsCompleted(true, z))) -} - -func (r *resp3) ZRangeStore(ctx context.Context, dst string, z ZRangeArgs) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZRangeArgsArbitrary(r.cmd.B().Arbitrary(ZRANGESTORE).Keys(dst, z.Key), false, z).Build())) -} - -func (r *resp3) getZRankCompleted(key, member string) rueidis.Completed { - return r.cmd.B().Zrank().Key(key).Member(member).Build() -} - -func (r *resp3) ZRank(ctx context.Context, key, member string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZRankCompleted(key, member))) -} - -func (r *resp3Cache) ZRank(ctx context.Context, key, member string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getZRankCompleted(key, member))) -} - -func (r *resp3) ZRem(ctx context.Context, key string, members ...interface{}) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Zrem().Key(key).Member(argsToSlice(members)...).Build())) -} - -func (r *resp3) ZRemRangeByLex(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Zremrangebylex().Key(key).Min(min).Max(max).Build())) -} - -func (r *resp3) ZRemRangeByRank(ctx context.Context, key string, start, stop int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Zremrangebyrank().Key(key).Start(start).Stop(stop).Build())) -} - -func (r *resp3) ZRemRangeByScore(ctx context.Context, key, min, max string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Zremrangebyscore().Key(key).Min(min).Max(max).Build())) -} - -func (r *resp3) getZRevRangeCompleted(key string, start, stop int64, withScore bool) rueidis.Completed { - var zrevrangeStop = r.cmd.B().Zrevrange().Key(key).Start(start).Stop(stop) - if withScore { - return zrevrangeStop.Withscores().Build() - } - return zrevrangeStop.Build() -} - -func (r *resp3) ZRevRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRevRangeCompleted(key, start, stop, false))) -} - -func (r *resp3Cache) ZRevRange(ctx context.Context, key string, start, stop int64) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRevRangeCompleted(key, start, stop, false))) -} - -func (r *resp3) ZRevRangeWithScores(ctx context.Context, key string, start, stop int64) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.getZRevRangeCompleted(key, start, stop, true))) -} - -func (r *resp3Cache) ZRevRangeWithScores(ctx context.Context, key string, start, stop int64) ZSliceCmd { - return newZSliceCmd(r.Do(ctx, r.resp.getZRevRangeCompleted(key, start, stop, true))) -} - -func (r *resp3) getZRevRangeByLexCompleted(key string, opt ZRangeBy) rueidis.Completed { - var completed rueidis.Completed - var zrevrangebylexMin = r.cmd.B().Zrevrangebylex().Key(key).Max(opt.Max).Min(opt.Min) - if opt.Offset != 0 || opt.Count != 0 { - completed = zrevrangebylexMin.Limit(opt.Offset, opt.Count).Build() - } else { - completed = zrevrangebylexMin.Build() - } - return completed -} - -func (r *resp3) ZRevRangeByLex(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRevRangeByLexCompleted(key, opt))) -} - -func (r *resp3Cache) ZRevRangeByLex(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRevRangeByLexCompleted(key, opt))) -} - -func (r *resp3) getZRevRangeByScoreCompleted(key string, withScore bool, opt ZRangeBy) rueidis.Completed { - var completed rueidis.Completed - var zrevrangebyscoreMin = r.cmd.B().Zrevrangebyscore().Key(key).Max(opt.Max).Min(opt.Min) - if opt.Offset != 0 || opt.Count != 0 { - if withScore { - completed = zrevrangebyscoreMin.Withscores().Limit(opt.Offset, opt.Count).Build() - } else { - completed = zrevrangebyscoreMin.Limit(opt.Offset, opt.Count).Build() - } - } else { - if withScore { - completed = zrevrangebyscoreMin.Withscores().Build() - } else { - completed = zrevrangebyscoreMin.Build() - } - } - return completed -} - -func (r *resp3) ZRevRangeByScore(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getZRevRangeByScoreCompleted(key, false, opt))) -} - -func (r *resp3Cache) ZRevRangeByScore(ctx context.Context, key string, opt ZRangeBy) StringSliceCmd { - return newStringSliceCmd(r.Do(ctx, r.resp.getZRevRangeByScoreCompleted(key, false, opt))) -} - -func (r *resp3) ZRevRangeByScoreWithScores(ctx context.Context, key string, opt ZRangeBy) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.getZRevRangeByScoreCompleted(key, true, opt))) -} - -func (r *resp3Cache) ZRevRangeByScoreWithScores(ctx context.Context, key string, opt ZRangeBy) ZSliceCmd { - return newZSliceCmd(r.Do(ctx, r.resp.getZRevRangeByScoreCompleted(key, true, opt))) -} - -func (r *resp3) getZRevRankCompleted(key, member string) rueidis.Completed { - return r.cmd.B().Zrevrank().Key(key).Member(member).Build() -} - -func (r *resp3) ZRevRank(ctx context.Context, key, member string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getZRevRankCompleted(key, member))) -} - -func (r *resp3Cache) ZRevRank(ctx context.Context, key, member string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getZRevRankCompleted(key, member))) -} - -func (r *resp3) ZScan(ctx context.Context, key string, cursor uint64, match string, count int64) ScanCmd { - cmd := r.cmd.B().Arbitrary(ZSCAN).Keys(key).Args(str(cursor)) - if match != "" { - cmd = cmd.Args(MATCH, match) - } - if count > 0 { - cmd = cmd.Args(COUNT, str(count)) - } - return newScanCmd(r.cmd.Do(ctx, cmd.ReadOnly())) -} - -func (r *resp3) getZScoreCompleted(key, member string) rueidis.Completed { - return r.cmd.B().Zscore().Key(key).Member(member).Build() -} - -func (r *resp3) ZScore(ctx context.Context, key, member string) FloatCmd { - return newFloatCmd(r.cmd.Do(ctx, r.getZScoreCompleted(key, member))) -} - -func (r *resp3Cache) ZScore(ctx context.Context, key, member string) FloatCmd { - return newFloatCmd(r.Do(ctx, r.resp.getZScoreCompleted(key, member))) -} - -func (r *resp3) fillZUnionArbitrary(arbitrary rueidis.Arbitrary, withScore bool, store ZStore) rueidis.Arbitrary { - arbitrary = arbitrary.Args(str(len(store.Keys))).Keys(store.Keys...) - if len(store.Weights) > 0 { - arbitrary = arbitrary.Args(WEIGHTS) - for _, w := range store.Weights { - arbitrary = arbitrary.Args(str(w)) - } - } - if len(store.Aggregate) > 0 { - arbitrary = arbitrary.Args(AGGREGATE, store.Aggregate) - } - if withScore { - arbitrary = arbitrary.Args(WITHSCORES) - } - return arbitrary -} - -func (r *resp3) ZUnion(ctx context.Context, store ZStore) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.fillZUnionArbitrary(r.cmd.B().Arbitrary(ZUNION), false, store).ReadOnly())) -} - -func (r *resp3) ZUnionWithScores(ctx context.Context, store ZStore) ZSliceCmd { - return newZSliceCmd(r.cmd.Do(ctx, r.fillZUnionArbitrary(r.cmd.B().Arbitrary(ZUNION), true, store).ReadOnly())) -} - -func (r *resp3) ZUnionStore(ctx context.Context, dest string, store ZStore) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.fillZUnionArbitrary(r.cmd.B().Arbitrary(ZUNIONSTORE).Keys(dest), false, store).ReadOnly())) -} - -func (r *resp3) XAck(ctx context.Context, stream, group string, ids ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Xack().Key(stream).Group(group).Id(ids...).Build())) -} - -func (r *resp3) XAdd(ctx context.Context, a XAddArgs) StringCmd { - cmd := r.cmd.B().Arbitrary(XADD).Keys(a.Stream) - if a.NoMkStream { - cmd = cmd.Args(NOMKSTREAM) - } - switch { - case a.MaxLen > 0: - if a.Approx { - cmd = cmd.Args(MAXLEN, "~", str(a.MaxLen)) - } else { - cmd = cmd.Args(MAXLEN, str(a.MaxLen)) - } - case len(a.MinID) > 0: - if a.Approx { - cmd = cmd.Args(MINID, "~", a.MinID) - } else { - cmd = cmd.Args(MINID, a.MinID) - } - } - if a.Limit > 0 { - cmd = cmd.Args(LIMIT, str(a.Limit)) - } - if len(a.ID) > 0 { - cmd = cmd.Args(a.ID) - } else { - cmd = cmd.Args("*") - } - return newStringCmd(r.cmd.Do(ctx, cmd.Args(argToSlice(a.Values)...).Build())) -} - -func (r *resp3) getXAutoClaimCompleted(a XAutoClaimArgs, justId bool) rueidis.Completed { - var completed rueidis.Completed - var xautoclaimStart = r.cmd.B().Xautoclaim().Key(a.Stream).Group(a.Group).Consumer(a.Consumer).MinIdleTime(str(formatMs(a.MinIdle))).Start(a.Start) - if a.Count > 0 { - if justId { - completed = xautoclaimStart.Count(a.Count).Justid().Build() - } else { - completed = xautoclaimStart.Count(a.Count).Build() - } - } else { - if justId { - completed = xautoclaimStart.Justid().Build() - } else { - completed = xautoclaimStart.Build() - } - } - return completed -} - -func (r *resp3) XAutoClaim(ctx context.Context, a XAutoClaimArgs) XAutoClaimCmd { - return newXAutoClaimCmd(r.cmd.Do(ctx, r.getXAutoClaimCompleted(a, false))) -} - -func (r *resp3) XAutoClaimJustID(ctx context.Context, a XAutoClaimArgs) XAutoClaimJustIDCmd { - return newXAutoClaimJustIDCmd(r.cmd.Do(ctx, r.getXAutoClaimCompleted(a, true))) -} - -func (r *resp3) getXClaimCompleted(a XClaimArgs, justId bool) rueidis.Completed { - var xclaimId = r.cmd.B().Xclaim().Key(a.Stream).Group(a.Group).Consumer(a.Consumer).MinIdleTime(str(formatMs(a.MinIdle))).Id(a.Messages...) - if justId { - return xclaimId.Justid().Build() - } - return xclaimId.Build() -} - -func (r *resp3) XClaim(ctx context.Context, a XClaimArgs) XMessageSliceCmd { - return newXMessageSliceCmd(r.cmd.Do(ctx, r.getXClaimCompleted(a, false))) -} - -func (r *resp3) XClaimJustID(ctx context.Context, a XClaimArgs) StringSliceCmd { - return newStringSliceCmd(r.cmd.Do(ctx, r.getXClaimCompleted(a, true))) -} - -func (r *resp3) XDel(ctx context.Context, stream string, ids ...string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Xdel().Key(stream).Id(ids...).Build())) -} - -func (r *resp3) XGroupCreate(ctx context.Context, stream, group, start string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().XgroupCreate().Key(stream).Groupname(group).Id(start).Build())) -} - -func (r *resp3) XGroupCreateMkStream(ctx context.Context, stream, group, start string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().XgroupCreate().Key(stream).Groupname(group).Id(start).Mkstream().Build())) -} - -func (r *resp3) XGroupCreateConsumer(ctx context.Context, stream, group, consumer string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().XgroupCreateconsumer().Key(stream).Groupname(group).Consumername(consumer).Build())) -} - -func (r *resp3) XGroupDelConsumer(ctx context.Context, stream, group, consumer string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().XgroupDelconsumer().Key(stream).Groupname(group).Consumername(consumer).Build())) -} - -func (r *resp3) XGroupDestroy(ctx context.Context, stream, group string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().XgroupDestroy().Key(stream).Groupname(group).Build())) -} - -func (r *resp3) XGroupSetID(ctx context.Context, stream, group, start string) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().XgroupSetid().Key(stream).Groupname(group).Id(start).Build())) -} - -func (r *resp3) XInfoConsumers(ctx context.Context, key string, group string) XInfoConsumersCmd { - return newXInfoConsumersCmd(r.cmd.Do(ctx, r.cmd.B().XinfoConsumers().Key(key).Groupname(group).Build()), EMPTY, group) -} - -func (r *resp3) XInfoGroups(ctx context.Context, key string) XInfoGroupsCmd { - return newXInfoGroupsCmd(r.cmd.Do(ctx, r.cmd.B().XinfoGroups().Key(key).Build()), key) -} - -func (r *resp3) XInfoStream(ctx context.Context, key string) XInfoStreamCmd { - return newXInfoStreamCmd(r.cmd.Do(ctx, r.cmd.B().XinfoStream().Key(key).Build()), key) -} - -func (r *resp3) XInfoStreamFull(ctx context.Context, key string, count int) XInfoStreamFullCmd { - return newXInfoStreamFullCmd(r.cmd.Do(ctx, r.cmd.B().XinfoStream().Key(key).Full().Count(int64(count)).Build())) -} - -func (r *resp3) XLen(ctx context.Context, stream string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Xlen().Key(stream).Build())) -} - -func (r *resp3) XPending(ctx context.Context, stream, group string) XPendingCmd { - return newXPendingCmd(r.cmd.Do(ctx, r.cmd.B().Xpending().Key(stream).Group(group).Build())) -} - -func (r *resp3) XPendingExt(ctx context.Context, a XPendingExtArgs) XPendingExtCmd { - cmd := r.cmd.B().Arbitrary(XPENDING).Keys(a.Stream).Args(a.Group) - if a.Idle != 0 { - cmd = cmd.Args(IDLE, str(formatMs(a.Idle))) - } - cmd = cmd.Args(a.Start, a.End, str(a.Count)) - if len(a.Consumer) > 0 { - cmd = cmd.Args(a.Consumer) - } - return newXPendingExtCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) XRange(ctx context.Context, stream, start, stop string) XMessageSliceCmd { - return newXMessageSliceCmd(r.cmd.Do(ctx, r.cmd.B().Xrange().Key(stream).Start(start).End(stop).Build())) -} - -func (r *resp3) XRangeN(ctx context.Context, stream, start, stop string, count int64) XMessageSliceCmd { - return newXMessageSliceCmd(r.cmd.Do(ctx, r.cmd.B().Xrange().Key(stream).Start(start).End(stop).Count(count).Build())) -} - -func (r *resp3) xRead(ctx context.Context, arbitrary rueidis.Arbitrary, a XReadGroupArgs) XStreamSliceCmd { - if a.Count > 0 { - arbitrary = arbitrary.Args(COUNT, str(a.Count)) - } - if a.Block >= 0 { - arbitrary = arbitrary.Args(BLOCK, str(formatMs(a.Block))) - } - if a.NoAck { - arbitrary = arbitrary.Args(NOACK) - } - return newXStreamSliceCmd(r.cmd.Do(ctx, arbitrary.Args(STREAMS).Args(a.Streams...).Build())) -} - -func (r *resp3) XRead(ctx context.Context, a XReadArgs) XStreamSliceCmd { - return r.xRead(ctx, r.cmd.B().Arbitrary(XREAD), XReadGroupArgs{Count: a.Count, Block: a.Block, Streams: a.Streams}) -} - -func (r *resp3) XReadStreams(ctx context.Context, streams ...string) XStreamSliceCmd { - return r.XRead(ctx, XReadArgs{Streams: streams, Block: -1}) -} - -func (r *resp3) XReadGroup(ctx context.Context, a XReadGroupArgs) XStreamSliceCmd { - return r.xRead(ctx, r.cmd.B().Arbitrary(XREADGROUP).Args(GROUP, a.Group, a.Consumer), a) -} - -func (r *resp3) XRevRange(ctx context.Context, stream string, start, stop string) XMessageSliceCmd { - return newXMessageSliceCmd(r.cmd.Do(ctx, r.cmd.B().Xrevrange().Key(stream).End(start).Start(stop).Build())) -} - -func (r *resp3) XRevRangeN(ctx context.Context, stream string, start, stop string, count int64) XMessageSliceCmd { - return newXMessageSliceCmd(r.cmd.Do(ctx, r.cmd.B().Xrevrange().Key(stream).End(start).Start(stop).Count(count).Build())) -} - -func (r *resp3) xTrim(ctx context.Context, key, strategy string, - approx bool, threshold string, limit int64) IntCmd { - cmd := r.cmd.B().Arbitrary(XTRIM).Keys(key).Args(strategy) - if approx { - cmd = cmd.Args("~") - } - cmd = cmd.Args(threshold) - if limit > 0 { - cmd = cmd.Args(LIMIT, str(limit)) - } - return newIntCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) XTrim(ctx context.Context, key string, maxLen int64) IntCmd { - return r.xTrim(ctx, key, MAXLEN, false, str(maxLen), 0) -} - -func (r *resp3) XTrimApprox(ctx context.Context, key string, maxLen int64) IntCmd { - return r.xTrim(ctx, key, MAXLEN, true, str(maxLen), 0) -} - -func (r *resp3) XTrimMaxLen(ctx context.Context, key string, maxLen int64) IntCmd { - return r.xTrim(ctx, key, MAXLEN, false, str(maxLen), 0) -} - -func (r *resp3) XTrimMinID(ctx context.Context, key string, minID string) IntCmd { - return r.xTrim(ctx, key, MINID, false, minID, 0) -} - -func (r *resp3) XTrimMaxLenApprox(ctx context.Context, key string, maxLen, limit int64) IntCmd { - return r.xTrim(ctx, key, MAXLEN, true, str(maxLen), limit) -} - -func (r *resp3) XTrimMinIDApprox(ctx context.Context, key string, minID string, limit int64) IntCmd { - return r.xTrim(ctx, key, MINID, true, minID, limit) -} - -func (r *resp3) Append(ctx context.Context, key, value string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Append().Key(key).Value(value).Build())) -} - -func (r *resp3) Decr(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Decr().Key(key).Build())) -} - -func (r *resp3) DecrBy(ctx context.Context, key string, decrement int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Decrby().Key(key).Decrement(decrement).Build())) -} - -func (r *resp3) getGetCompleted(key string) rueidis.Completed { - return r.cmd.B().Get().Key(key).Build() -} - -func (r *resp3) Get(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.getGetCompleted(key))) -} - -func (r *resp3Cache) Get(ctx context.Context, key string) StringCmd { - return newStringCmd(r.Do(ctx, r.resp.getGetCompleted(key))) -} - -func (r *resp3) GetDel(ctx context.Context, key string) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Getdel().Key(key).Build())) -} - -func (r *resp3) GetEx(ctx context.Context, key string, expiration time.Duration) StringCmd { - var completed rueidis.Completed - var getexKey = r.cmd.B().Getex().Key(key) - if expiration > 0 { - if usePrecise(expiration) { - completed = getexKey.PxMilliseconds(formatMs(expiration)).Build() - } else { - completed = getexKey.ExSeconds(formatSec(expiration)).Build() - } - } else if expiration == 0 { - completed = getexKey.Persist().Build() - } else { - completed = getexKey.Build() - } - return newStringCmd(r.cmd.Do(ctx, completed)) -} - -func (r *resp3) getGetRangeCompleted(key string, start, end int64) rueidis.Completed { - return r.cmd.B().Getrange().Key(key).Start(start).End(end).Build() -} - -func (r *resp3) GetRange(ctx context.Context, key string, start, end int64) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.getGetRangeCompleted(key, start, end))) -} - -func (r *resp3Cache) GetRange(ctx context.Context, key string, start, end int64) StringCmd { - return newStringCmd(r.Do(ctx, r.resp.getGetRangeCompleted(key, start, end))) -} - -func (r *resp3) GetSet(ctx context.Context, key string, value interface{}) StringCmd { - return newStringCmd(r.cmd.Do(ctx, r.cmd.B().Getset().Key(key).Value(str(value)).Build())) -} - -func (r *resp3) Incr(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Incr().Key(key).Build())) -} - -func (r *resp3) IncrBy(ctx context.Context, key string, value int64) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Incrby().Key(key).Increment(value).Build())) -} - -func (r *resp3) IncrByFloat(ctx context.Context, key string, value float64) FloatCmd { - return newFloatCmd(r.cmd.Do(ctx, r.cmd.B().Incrbyfloat().Key(key).Increment(value).Build())) -} - -func (r *resp3) getMGetCompleted(keys ...string) rueidis.Completed { - return r.cmd.B().Mget().Key(keys...).Build() -} - -func (r *resp3) MGet(ctx context.Context, keys ...string) SliceCmd { - return newSliceCmd(r.cmd.Do(ctx, r.getMGetCompleted(keys...))) -} - -func (r *resp3Cache) MGet(ctx context.Context, keys ...string) SliceCmd { - return newSliceCmd(r.Do(ctx, r.resp.getMGetCompleted(keys...))) -} - -func (r *resp3) MSet(ctx context.Context, values ...interface{}) StatusCmd { - kv := r.cmd.B().Mset().KeyValue() - args := argsToSlice(values) - for i := 0; i < len(args); i += 2 { - kv = kv.KeyValue(args[i], args[i+1]) - } - return newStatusCmd(r.cmd.Do(ctx, kv.Build())) -} - -func (r *resp3) MSetNX(ctx context.Context, values ...interface{}) BoolCmd { - kv := r.cmd.B().Msetnx().KeyValue() - args := argsToSlice(values) - for i := 0; i < len(args); i += 2 { - kv = kv.KeyValue(args[i], args[i+1]) - } - return newBoolCmd(r.cmd.Do(ctx, kv.Build())) -} - -func (r *resp3) Set(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { - var completed rueidis.Completed - var setValue = r.cmd.B().Set().Key(key).Value(str(value)) - if expiration > 0 { - if usePrecise(expiration) { - completed = setValue.PxMilliseconds(formatMs(expiration)).Build() - } else { - completed = setValue.ExSeconds(formatSec(expiration)).Build() - } - } else if expiration == KeepTTL { - completed = setValue.Keepttl().Build() - } else { - completed = setValue.Build() - } - return newStatusCmd(r.cmd.Do(ctx, completed)) -} - -func (r *resp3) SetEX(ctx context.Context, key string, value interface{}, expiration time.Duration) StatusCmd { - return newStatusCmd(r.cmd.Do(ctx, r.cmd.B().Setex().Key(key).Seconds(formatSec(expiration)).Value(str(value)).Build())) -} - -func (r *resp3) SetNX(ctx context.Context, key string, value interface{}, expiration time.Duration) BoolCmd { - var resp rueidis.RedisResult - switch expiration { - case 0: - resp = r.cmd.Do(ctx, r.cmd.B().Setnx().Key(key).Value(str(value)).Build()) - case KeepTTL: - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Nx().Keepttl().Build()) - default: - if usePrecise(expiration) { - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Nx().PxMilliseconds(formatMs(expiration)).Build()) - } else { - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Nx().ExSeconds(formatSec(expiration)).Build()) - } - } - return newBoolCmd(resp) -} - -func (r *resp3) SetXX(ctx context.Context, key string, value interface{}, expiration time.Duration) BoolCmd { - var resp rueidis.RedisResult - switch expiration { - case 0: - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Xx().Build()) - case KeepTTL: - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Xx().Keepttl().Build()) - default: - if usePrecise(expiration) { - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Xx().PxMilliseconds(formatMs(expiration)).Build()) - } else { - resp = r.cmd.Do(ctx, r.cmd.B().Set().Key(key).Value(str(value)).Xx().ExSeconds(formatSec(expiration)).Build()) - } - } - return newBoolCmd(resp) -} - -func (r *resp3) SetArgs(ctx context.Context, key string, value interface{}, a SetArgs) StatusCmd { - cmd := r.cmd.B().Arbitrary(SET).Keys(key).Args(str(value)) - if a.KeepTTL { - cmd = cmd.Args(KEEPTTL) - } - if !a.ExpireAt.IsZero() { - cmd = cmd.Args(EXAT, str(a.ExpireAt.Unix())) - } - if a.TTL > 0 { - if usePrecise(a.TTL) { - cmd = cmd.Args(PX, str(formatMs(a.TTL))) - } else { - cmd = cmd.Args(EX, str(formatSec(a.TTL))) - } - } - if len(a.Mode) > 0 { - cmd = cmd.Args(a.Mode) - } - if a.Get { - cmd = cmd.Args(GET) - } - return newStatusCmd(r.cmd.Do(ctx, cmd.Build())) -} - -func (r *resp3) SetRange(ctx context.Context, key string, offset int64, value string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.cmd.B().Setrange().Key(key).Offset(offset).Value(value).Build())) -} - -func (r *resp3) getStrLenCompleted(key string) rueidis.Completed { - return r.cmd.B().Strlen().Key(key).Build() -} - -func (r *resp3) StrLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.cmd.Do(ctx, r.getStrLenCompleted(key))) -} - -func (r *resp3Cache) StrLen(ctx context.Context, key string) IntCmd { - return newIntCmd(r.Do(ctx, r.resp.getStrLenCompleted(key))) -} diff --git a/redis_slot.go b/redis_slot.go index 9c93ada..960d3f4 100644 --- a/redis_slot.go +++ b/redis_slot.go @@ -1,19 +1,17 @@ -package sandwich_redis +package redisson -import "errors" +import "fmt" -type getKeysFunc = func() []string - -func panicIfUseMultipleKeySlots(f getKeysFunc) { +func panicIfUseMultipleKeySlots(command Command, f func() []string) { if f == nil { return } - if err := checkSlots(f()...); err != nil { + if err := checkSlots(command, f()...); err != nil { panic(err) } } -func checkSlots(keys ...string) error { +func checkSlots(command Command, keys ...string) error { if len(keys) <= 1 { return nil } @@ -21,7 +19,7 @@ func checkSlots(keys ...string) error { for k, v := range keys { s := slot(v) if k > 0 && pre != s { - return errors.New("multi key command with different key slots are not allowed") + return fmt.Errorf("[%s]: multiple keys command with different key slots are not allowed", command.String()) } pre = s } diff --git a/util.go b/util.go index 1d3ef95..fa6032c 100644 --- a/util.go +++ b/util.go @@ -1,9 +1,7 @@ -package sandwich_redis +package redisson import ( - "encoding" "fmt" - "github.com/sandwich-go/rueidis" "strconv" "time" ) @@ -96,6 +94,7 @@ const ( PX = "PX" EX = "EX" SERVER = "SERVER" + CLUSTER = "CLUSTER" LADDR = "LADDR" ) @@ -104,32 +103,6 @@ var ( sinceFunc = time.Since ) -func usePrecise(dur time.Duration) bool { - return dur < time.Second || dur%time.Second != 0 -} - -func formatMs(dur time.Duration) int64 { - if dur > 0 && dur < time.Millisecond { - warning(fmt.Sprintf( - "specified duration is %s, but minimal supported value is %s - truncating to 1ms", - dur, time.Millisecond, - )) - return 1 - } - return int64(dur / time.Millisecond) -} - -func formatSec(dur time.Duration) int64 { - if dur > 0 && dur < time.Second { - warning(fmt.Sprintf( - "specified duration is %s, but minimal supported value is %s - truncating to 1s", - dur, time.Second, - )) - return 1 - } - return int64(dur / time.Second) -} - func appendString(s string, ss ...string) []string { sss := make([]string, 0, len(ss)+1) sss = append(sss, s) @@ -158,33 +131,10 @@ func str(arg interface{}) string { return "0" case time.Time: return v.Format(time.RFC3339Nano) - case encoding.BinaryMarshaler: - if data, err := v.MarshalBinary(); err == nil { - return rueidis.BinaryString(data) - } } return fmt.Sprint(arg) } -func intSliceToInt64ToSlice(src []int) []int64 { - dst := make([]int64, 0, len(src)) - for _, v := range src { - dst = append(dst, int64(v)) - } - return dst -} - -func argsToSlice(src []interface{}) []string { - if len(src) == 1 { - return argToSlice(src[0]) - } - dst := make([]string, 0, len(src)) - for _, v := range src { - dst = append(dst, str(v)) - } - return dst -} - func argsToSliceWithValues(src []interface{}) []string { if len(src) == 2 { return argToSlice(src[0]) @@ -223,10 +173,6 @@ func argToSlice(a interface{}) []string { } } -func parseInt(s string) (int64, error) { - return strconv.ParseInt(s, 10, 64) -} - func warning(msg string) { fmt.Println(msg) }