diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 0000000000..aaabe28b98
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1 @@
+src/test/java/io/redis/examples/* @dmaier-redislabs
diff --git a/.github/release-drafter-config.yml b/.github/release-drafter-config.yml
index edc2911f43..4607da071c 100644
--- a/.github/release-drafter-config.yml
+++ b/.github/release-drafter-config.yml
@@ -1,5 +1,7 @@
name-template: '$NEXT_MINOR_VERSION'
tag-template: 'v$NEXT_MINOR_VERSION'
+filter-by-commitish: true
+commitish: master
autolabeler:
- label: 'maintenance'
files:
@@ -35,6 +37,8 @@ categories:
labels:
- 'maintenance'
- 'dependencies'
+ - 'documentation'
+ - 'docs'
- 'testing'
change-template: '- $TITLE (#$NUMBER)'
exclude-labels:
diff --git a/.github/spellcheck-settings.yml b/.github/spellcheck-settings.yml
new file mode 100644
index 0000000000..07b400f063
--- /dev/null
+++ b/.github/spellcheck-settings.yml
@@ -0,0 +1,28 @@
+matrix:
+- name: Markdown
+ expect_match: false
+ apsell:
+ lang: en
+ d: en_US
+ ignore-case: true
+ dictionary:
+ wordlists:
+ - .github/wordlist.txt
+ output: wordlist.dic
+ pipeline:
+ - pyspelling.filters.markdown:
+ markdown_extensions:
+ - markdown.extensions.extra:
+ - pyspelling.filters.html:
+ comments: false
+ attributes:
+ - alt
+ ignores:
+ - ':matches(code, pre)'
+ - code
+ - pre
+ - blockquote
+ - img
+ sources:
+ - '*.md'
+ - 'docs/**'
diff --git a/.github/wordlist.txt b/.github/wordlist.txt
new file mode 100644
index 0000000000..7d0d85f49d
--- /dev/null
+++ b/.github/wordlist.txt
@@ -0,0 +1,311 @@
+!!!Spelling check failed!!!
+APM
+ARGV
+BFCommands
+BitOP
+BitPosParams
+BuilderFactory
+CFCommands
+CMSCommands
+CallNotPermittedException
+CircuitBreaker
+ClientKillParams
+ClusterNode
+ClusterNodes
+ClusterPipeline
+ClusterPubSub
+ConnectionPool
+CoreCommands
+EVAL
+EVALSHA
+Failback
+Failover
+GSON
+GenericObjectPool
+GenericObjectPoolConfig
+GeoAddParams
+GeoRadiusParam
+GeoRadiusStoreParam
+GeoUnit
+GraphCommands
+Grokzen's
+HostAndPort
+HostnameVerifier
+INCR
+IOError
+Instrumentations
+JDK
+JSONArray
+JSONCommands
+Jaeger
+Javadocs
+Jedis
+JedisCluster
+JedisConnectionException
+JedisPool
+JedisPooled
+JedisShardInfo
+ListPosition
+Ludovico
+Magnocavallo
+McCurdy
+NOSCRIPT
+NUMPAT
+NUMPT
+NUMSUB
+OSS
+OpenCensus
+OpenTelemetry
+OpenTracing
+Otel
+POJO
+POJOs
+PubSub
+Queable
+READONLY
+RediSearch
+RediSearchCommands
+RedisBloom
+RedisCluster
+RedisClusterCommands
+RedisClusterException
+RedisClusters
+RedisGraph
+RedisInstrumentor
+RedisJSON
+RedisTimeSeries
+SHA
+SSLParameters
+SSLSocketFactory
+SearchCommands
+SentinelCommands
+SentinelConnectionPool
+ShardInfo
+Sharded
+Solovyov
+SortingParams
+SpanKind
+Specfiying
+StatusCode
+StreamEntryID
+TCP
+TOPKCommands
+Throwable
+TimeSeriesCommands
+URI
+UnblockType
+UnifiedJedis
+Uptrace
+ValueError
+WATCHed
+WatchError
+XTrimParams
+ZAddParams
+ZParams
+aclDelUser
+api
+approximateLength
+arg
+args
+async
+asyncio
+autoclass
+automodule
+backoff
+bdb
+behaviour
+bitcount
+bitop
+bitpos
+bool
+boolean
+booleans
+bysource
+charset
+clientId
+clientKill
+clientUnblock
+clusterCountKeysInSlot
+clusterKeySlot
+configs
+consumerName
+consumername
+cumbersome
+dbIndex
+dbSize
+decr
+decrBy
+del
+destKey
+dev
+dstKey
+dstkey
+eg
+exc
+expireAt
+failback
+failover
+faoliver
+firstName
+firsttimersonly
+fo
+genindex
+geoadd
+georadiusByMemberStore
+georadiusStore
+getbit
+gmail
+groupname
+hdel
+hexists
+hincrBy
+hincrByFloat
+hiredis
+hlen
+hset
+hsetnx
+hstrlen
+http
+idx
+iff
+incr
+incrBy
+incrByFloat
+ini
+json
+keyslot
+keyspace
+keysvalues
+kwarg
+lastName
+lastsave
+linsert
+linters
+llen
+localhost
+lpush
+lpushx
+lrem
+lua
+makeapullrequest
+maxLen
+maxdepth
+maya
+memberCoordinateMap
+mget
+microservice
+microservices
+millisecondsTimestamp
+mset
+msetnx
+multikey
+mykey
+newkey
+nonatomic
+observability
+oldkey
+opentelemetry
+oss
+param
+params
+performant
+pexpire
+pexpireAt
+pfadd
+pfcount
+pmessage
+png
+pre
+psubscribe
+pttl
+pubsub
+punsubscribe
+py
+pypi
+quickstart
+readonly
+readwrite
+redis
+redismodules
+reimplemented
+reinitialization
+renamenx
+replicaof
+repo
+rpush
+rpushx
+runtime
+sadd
+scard
+scoreMembers
+sdiffstore
+sedrik
+setbit
+setnx
+setrange
+sinterstore
+sismember
+slowlogLen
+smove
+sortingParameters
+srcKey
+srcKeys
+srckey
+ssl
+storeParam
+str
+strlen
+stunnel
+subcommands
+sunionstore
+thevalueofmykey
+timeseries
+toctree
+topk
+tox
+triaging
+ttl
+txt
+un
+unblockType
+unicode
+unixTime
+unlink
+untyped
+url
+virtualenv
+waitReplicas
+whenver
+www
+xack
+xdel
+xgroupDelConsumer
+xgroupDestroy
+xlen
+xtrim
+zadd
+zcard
+zcount
+zdiffStore
+zincrby
+zinterstore
+zlexcount
+zpopmax
+zpopmin
+zrandmember
+zrandmemberWithScores
+zrange
+zrangeByLex
+zrangeByScore
+zrangeByScoreWithScores
+zrangeWithScores
+zrem
+zremrangeByLex
+zremrangeByRank
+zremrangeByScore
+zrevrange
+zrevrangeByLex
+zrevrangeByScore
+zrevrangeByScoreWithScores
+zrevrangeWithScores
+zunionstore
diff --git a/.github/workflows/doctests.yml b/.github/workflows/doctests.yml
index 8122b40b20..0062c2da24 100644
--- a/.github/workflows/doctests.yml
+++ b/.github/workflows/doctests.yml
@@ -2,6 +2,10 @@ name: Documentation Tests
on:
push:
+ tags-ignore:
+ - '*'
+ branches:
+ - 'emb-examples'
pull_request:
workflow_dispatch:
@@ -32,4 +36,4 @@ jobs:
distribution: 'temurin'
- name: Run doctests
run: |
- mvn -Pdoctests test
\ No newline at end of file
+ mvn -Pdoctests test
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index e6907dcaef..fd651fa6a4 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -10,15 +10,14 @@ on:
- '**/*.rst'
branches:
- master
- - '[0-9].[0-9]'
- - '[0-9].x'
+ - '[0-9].*'
pull_request:
branches:
- master
- - '[0-9].[0-9]'
- - '[0-9].x'
+ - '[0-9].*'
schedule:
- cron: '0 1 * * *' # nightly build
+ workflow_dispatch:
jobs:
diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml
index 6c8ad1a962..8a409b8331 100644
--- a/.github/workflows/snapshot.yml
+++ b/.github/workflows/snapshot.yml
@@ -6,7 +6,8 @@ on:
push:
branches:
- master
- - '[0-9].[0-9]'
+ - '[0-9].x'
+ workflow_dispatch:
jobs:
diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml
new file mode 100644
index 0000000000..e152841553
--- /dev/null
+++ b/.github/workflows/spellcheck.yml
@@ -0,0 +1,14 @@
+name: spellcheck
+on:
+ pull_request:
+jobs:
+ check-spelling:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Check Spelling
+ uses: rojopolis/spellcheck-github-actions@0.33.1
+ with:
+ config_path: .github/spellcheck-settings.yml
+ task_name: Markdown
diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml
new file mode 100644
index 0000000000..54bf059fba
--- /dev/null
+++ b/.github/workflows/stale-issues.yml
@@ -0,0 +1,25 @@
+name: "Close stale issues"
+on:
+ schedule:
+ - cron: "0 0 * * *"
+
+permissions: {}
+jobs:
+ stale:
+ permissions:
+ issues: write # to close stale issues (actions/stale)
+ pull-requests: write # to close stale PRs (actions/stale)
+
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/stale@v3
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ stale-issue-message: 'This issue is marked stale. It will be closed in 30 days if it is not updated.'
+ stale-pr-message: 'This pull request is marked stale. It will be closed in 30 days if it is not updated.'
+ days-before-stale: 365
+ days-before-close: 30
+ stale-issue-label: "stale"
+ stale-pr-label: "stale"
+ operations-per-run: 10
+ remove-stale-when-updated: false
diff --git a/.github/workflows/version-and-release.yml b/.github/workflows/version-and-release.yml
index 007d8875e8..7c996e5bd5 100644
--- a/.github/workflows/version-and-release.yml
+++ b/.github/workflows/version-and-release.yml
@@ -16,7 +16,7 @@ jobs:
run: |
realversion="${GITHUB_REF/refs\/tags\//}"
realversion="${realversion//v/}"
- echo "::set-output name=VERSION::$realversion"
+ echo "VERSION=$realversion" >> $GITHUB_OUTPUT
- name: Set up publishing to maven central
uses: actions/setup-java@v2
@@ -32,14 +32,14 @@ jobs:
- name: Install gpg key
run: |
- cat <(echo -e "${{ secrets.OSSRH_GPG_SECRET_KEY }}") | gpg --batch --import
+ cat <(echo -e "${{ secrets.OSSH_GPG_SECRET_KEY }}") | gpg --batch --import
gpg --list-secret-keys --keyid-format LONG
- name: Publish
run: |
mvn --no-transfer-progress \
--batch-mode \
- -Dgpg.passphrase='${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}' \
+ -Dgpg.passphrase='${{ secrets.OSSH_GPG_SECRET_KEY_PASSWORD }}' \
-DskipTests deploy -P release
env:
MAVEN_USERNAME: ${{secrets.OSSH_USERNAME}}
diff --git a/Makefile b/Makefile
index 2987ad80dd..6e63f1b6ce 100644
--- a/Makefile
+++ b/Makefile
@@ -209,7 +209,7 @@ daemonize yes
protected-mode no
requirepass cluster
port 7379
-cluster-node-timeout 50
+cluster-node-timeout 15000
pidfile /tmp/redis_cluster_node1.pid
logfile /tmp/redis_cluster_node1.log
save ""
@@ -223,7 +223,7 @@ daemonize yes
protected-mode no
requirepass cluster
port 7380
-cluster-node-timeout 50
+cluster-node-timeout 15000
pidfile /tmp/redis_cluster_node2.pid
logfile /tmp/redis_cluster_node2.log
save ""
@@ -237,7 +237,7 @@ daemonize yes
protected-mode no
requirepass cluster
port 7381
-cluster-node-timeout 50
+cluster-node-timeout 15000
pidfile /tmp/redis_cluster_node3.pid
logfile /tmp/redis_cluster_node3.log
save ""
@@ -251,7 +251,7 @@ daemonize yes
protected-mode no
requirepass cluster
port 7382
-cluster-node-timeout 50
+cluster-node-timeout 15000
pidfile /tmp/redis_cluster_node4.pid
logfile /tmp/redis_cluster_node4.log
save ""
@@ -265,7 +265,7 @@ daemonize yes
protected-mode no
requirepass cluster
port 7383
-cluster-node-timeout 5000
+cluster-node-timeout 15000
pidfile /tmp/redis_cluster_node5.pid
logfile /tmp/redis_cluster_node5.log
save ""
diff --git a/README.md b/README.md
index f0a5d6ae61..4c7c507d21 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.txt)
[![Integration](https://github.com/redis/jedis/actions/workflows/integration.yml/badge.svg?branch=master)](https://github.com/redis/jedis/actions/workflows/integration.yml)
[![codecov](https://codecov.io/gh/redis/jedis/branch/master/graph/badge.svg?token=pAstxAAjYo)](https://codecov.io/gh/redis/jedis)
-[![Discord](https://img.shields.io/discord/697882427875393627?style=flat-square)](https://discord.gg/qRhBuY8Z)
+[![Discord](https://img.shields.io/discord/697882427875393627?style=flat-square)](https://discord.gg/redis)
## What is Jedis?
@@ -14,26 +14,37 @@ Jedis is a Java client for [Redis](https://github.com/redis/redis "Redis") desig
Are you looking for a high-level library to handle object mapping? See [redis-om-spring](https://github.com/redis/redis-om-spring)!
-## Contributing
+## How do I Redis?
-We'd love your contributions!
+[Learn for free at Redis University](https://university.redis.com/)
-**Bug reports** are always welcome! [You can open a bug report on GitHub](https://github.com/redis/jedis/issues/new).
+[Build faster with the Redis Launchpad](https://launchpad.redis.com/)
-You can also **contribute documentation** -- or anything to improve Jedis. Please see
-[contribution guideline](https://github.com/redis/jedis/blob/master/.github/CONTRIBUTING.md) for more details.
+[Try the Redis Cloud](https://redis.com/try-free/)
+
+[Dive in developer tutorials](https://developer.redis.com/)
+
+[Join the Redis community](https://redis.com/community/)
+
+[Work at Redis](https://redis.com/company/careers/jobs/)
## Supported Redis versions
-The most recent version of this library supports redis version [5.0](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES), [6.0](https://github.com/redis/redis/blob/6.0/00-RELEASENOTES), [6.2](https://github.com/redis/redis/blob/6.2/00-RELEASENOTES), and [7.0](https://github.com/redis/redis/blob/7.0/00-RELEASENOTES).
+The most recent version of this library supports redis version
+[5.0](https://github.com/redis/redis/blob/5.0/00-RELEASENOTES),
+[6.0](https://github.com/redis/redis/blob/6.0/00-RELEASENOTES),
+[6.2](https://github.com/redis/redis/blob/6.2/00-RELEASENOTES),
+[7.0](https://github.com/redis/redis/blob/7.0/00-RELEASENOTES) and
+[7.2](https://github.com/redis/redis/blob/7.2/00-RELEASENOTES).
The table below highlights version compatibility of the most-recent library versions and Redis versions. Compatibility means communication features, and Redis command capabilities.
-| Library version | Supported redis versions | JDK Compatibility |
-|-----------------|--------------------------------|-------------------|
-| 3.9+ | 5.0 and 6.2 Family of releases | 8, 11 |
-| >= 4.0 | Version 5.0 to current | 8, 11, 17 |
+| Jedis version | Supported Redis versions | JDK Compatibility |
+|---------------|--------------------------------|-------------------|
+| 3.9+ | 5.0 and 6.2 Family of releases | 8, 11 |
+| >= 4.0 | Version 5.0 to current | 8, 11, 17 |
+| >= 5.0 | Version 6.0 to current | 8, 11, 17 |
## Getting started
@@ -43,7 +54,7 @@ To get started with Jedis, first add it as a dependency in your Java project. If
redis.clients
jedis
- 4.4.3
+ 5.0.0
```
@@ -109,6 +120,13 @@ Now you can use the `JedisCluster` instance and send commands like you would wit
jedis.sadd("planets", "Mars");
```
+## Using Redis modules
+
+Jedis includes support for [Redis modules](https://redis.io/docs/modules/) such as
+[RedisJSON](https://oss.redis.com/redisjson/) and [RediSearch](https://oss.redis.com/redisearch/).
+
+See the [RedisJSON Jedis](docs/redisjson.md) or [RediSearch Jedis](docs/redisearch.md) for details.
+
## Failover
Jedis supports retry and failover for your Redis deployments. This is useful when:
@@ -127,25 +145,26 @@ You can also check the [latest Jedis Javadocs](https://www.javadoc.io/doc/redis.
Some specific use-case examples can be found in [`redis.clients.jedis.examples`
package](src/test/java/redis/clients/jedis/examples/) of the test source codes.
-## Using Redis modules
+## Troubleshooting
-Jedis includes support for [Redis modules](https://redis.io/docs/modules/) such as
-[RedisJSON](https://oss.redis.com/redisjson/) and [RediSearch](https://oss.redis.com/redisearch/).
+If you run into trouble or have any questions, we're here to help!
-See the [RedisJSON Jedis](docs/redisjson.md) or [RediSearch Jedis](docs/redisearch.md) for details.
+Hit us up on the [Redis Discord Server](http://discord.gg/redis) or
+[Jedis GitHub Discussions](https://github.com/redis/jedis/discussions) or
+[Jedis mailing list](http://groups.google.com/group/jedis_redis).
-## Troubleshooting
+## Contributing
-If you run into trouble or have any questions, we're here to help!
+We'd love your contributions!
-Hit us up on the [Redis Discord Server](http://discord.gg/redis) or [open an issue on GitHub](https://github.com/redis/jedis).
+Bug reports are always welcome! [You can open a bug report on GitHub](https://github.com/redis/jedis/issues/new).
-You can also find help on the [Jedis mailing list](http://groups.google.com/group/jedis_redis) or the
-[GitHub Discussions](https://github.com/redis/jedis/discussions).
+You can also contribute documentation -- or anything to improve Jedis. Please see
+[contribution guideline](https://github.com/redis/jedis/blob/master/.github/CONTRIBUTING.md) for more details.
## License
-Jedis is licensed under the [MIT license](https://github.com/redis/jedis/blob/master/LICENSE.txt).
+Jedis is licensed under the [MIT license](https://github.com/redis/jedis/blob/master/LICENSE).
## Sponsorship
diff --git a/docs/breaking-5.md b/docs/breaking-5.md
index 195b08eecc..4a013c3800 100644
--- a/docs/breaking-5.md
+++ b/docs/breaking-5.md
@@ -113,6 +113,8 @@
- `RedisJsonCommands` and `RedisJsonPipelineCommands` interfaces have been moved into `redis.clients.jedis.json.commands` package.
+- `AbortedTransactionException` is removed.
+
- `Queable` class is removed.
- `Params` abstract class is removed.
diff --git a/docs/failover.md b/docs/failover.md
index 8414e41376..38fdc8c97b 100644
--- a/docs/failover.md
+++ b/docs/failover.md
@@ -99,8 +99,8 @@ Jedis uses the following retry settings:
| Max retry attempts | 3 | Maximum number of retry attempts (including the initial call) |
| Retry wait duration | 500 ms | Number of milliseconds to wait between retry attempts |
| Wait duration backoff multiplier | 2 | Exponential backoff factor multiplied against wait duration between retries. For example, with a wait duration of 1 second and a multiplier of 2, the retries would occur after 1s, 2s, 4s, 8s, 16s, and so on. |
-| Retry included exception list | `JedisConnectionException` | A list of `Throwable` classes that count as failures and should be retried. |
-| Retry ignored exception list | Empty list | A list of `Throwable` classes to explicitly ignore for the purposes of retry. |
+| Retry included exception list | [JedisConnectionException] | A list of Throwable classes that count as failures and should be retried. |
+| Retry ignored exception list | null | A list of Throwable classes to explicitly ignore for the purposes of retry. |
To disable retry, set `maxRetryAttempts` to 1.
@@ -116,8 +116,16 @@ Jedis uses the following circuit breaker settings:
| Failure rate threshold | `50.0f` | Percentage of calls within the sliding window that must fail before the circuit breaker transitions to the `OPEN` state. |
| Slow call duration threshold | 60000 ms | Duration threshold above which calls are classified as slow and added to the sliding window. |
| Slow call rate threshold | `100.0f` | Percentage of calls within the sliding window that exceed the slow call duration threshold before circuit breaker transitions to the `OPEN` state. |
-| Circuit breaker included exception list | `JedisConnectionException` | A list of `Throwable` classes that count as failures and add to the failure rate. |
-| Circuit breaker ignored exception list | Empty list | A list of `Throwable` classes to explicitly ignore for failure rate calculations. | |
+| Circuit breaker included exception list | [JedisConnectionException] | A list of Throwable classes that count as failures and add to the failure rate. |
+| Circuit breaker ignored exception list | null | A list of Throwable classes to explicitly ignore for failure rate calculations. | |
+
+### Fallback configuration
+
+Jedis uses the following fallback settings:
+
+| Setting | Default value | Description |
+|-------------------------|-------------------------------------------------------|----------------------------------------------------|
+| Fallback exception list | [CallNotPermittedException, JedisConnectionException] | A list of Throwable classes that trigger fallback. |
### Failover callbacks
diff --git a/docs/jedis-maven.md b/docs/jedis-maven.md
index 1c5b0f2598..6466b1ef3a 100644
--- a/docs/jedis-maven.md
+++ b/docs/jedis-maven.md
@@ -6,7 +6,7 @@
redis.clients
jedis
- 4.3.0
+ 5.0.0
```
@@ -28,7 +28,7 @@ and
redis.clients
jedis
- 4.4.0-SNAPSHOT
+ 5.1.0-SNAPSHOT
```
diff --git a/pom.xml b/pom.xml
index afd13e8c0a..a90614bd36 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
jar
redis.clients
jedis
- 5.0.0-SNAPSHOT
+ 5.2.0-SNAPSHOT
Jedis
Jedis is a blazingly small and sane Redis java client.
https://github.com/redis/jedis
@@ -46,9 +46,11 @@
github
- 1.7.36
redis.clients.jedis
+ 1.7.36
1.7.1
+ 2.16.1
+ 3.2.5
@@ -60,12 +62,12 @@
org.apache.commons
commons-pool2
- 2.11.1
+ 2.12.0
org.json
json
- 20230618
+ 20240205
com.google.code.gson
@@ -73,6 +75,22 @@
2.10.1
+
+
+ com.kohlschutter.junixsocket
+ junixsocket-core
+ 2.9.0
+ pom
+ test
+
+
+
+ org.locationtech.jts
+ jts-core
+ 1.19.0
+ test
+
+
junit
junit
@@ -91,31 +109,26 @@
${slf4j.version}
test
-
- com.kohlschutter.junixsocket
- junixsocket-core
- 2.6.1
- pom
- test
-
org.mockito
mockito-inline
- 3.12.4
+ 4.11.0
test
com.fasterxml.jackson.core
jackson-databind
- 2.14.2
+ ${jackson.version}
test
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
- 2.14.2
+ ${jackson.version}
test
+
+
io.github.resilience4j
resilience4j-all
@@ -158,7 +171,7 @@
org.jacoco
jacoco-maven-plugin
- 0.8.5
+ 0.8.11
@@ -176,7 +189,7 @@
maven-compiler-plugin
- 3.11.0
+ 3.12.1
1.8
@@ -184,7 +197,7 @@
maven-surefire-plugin
- 3.1.2
+ ${maven.surefire.version}
${redis-hosts}
@@ -212,7 +225,7 @@
maven-javadoc-plugin
- 3.5.0
+ 3.6.3
false
@@ -313,7 +326,7 @@
maven-surefire-plugin
- 3.1.2
+ ${maven.surefire.version}
**/examples/*Example.java
diff --git a/src/main/java/redis/clients/jedis/AbstractPipeline.java b/src/main/java/redis/clients/jedis/AbstractPipeline.java
new file mode 100644
index 0000000000..f4eb0335dc
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/AbstractPipeline.java
@@ -0,0 +1,26 @@
+package redis.clients.jedis;
+
+import java.io.Closeable;
+
+public abstract class AbstractPipeline extends PipeliningBase implements Closeable {
+
+ protected AbstractPipeline(CommandObjects commandObjects) {
+ super(commandObjects);
+ }
+
+ @Override
+ public abstract void close();
+
+ /**
+ * Synchronize pipeline by reading all responses.
+ */
+ public abstract void sync();
+
+ public Response publish(String channel, String message) {
+ return appendCommand(commandObjects.publish(channel, message));
+ }
+
+ public Response publish(byte[] channel, byte[] message) {
+ return appendCommand(commandObjects.publish(channel, message));
+ }
+}
diff --git a/src/main/java/redis/clients/jedis/AbstractTransaction.java b/src/main/java/redis/clients/jedis/AbstractTransaction.java
new file mode 100644
index 0000000000..2a551224fa
--- /dev/null
+++ b/src/main/java/redis/clients/jedis/AbstractTransaction.java
@@ -0,0 +1,39 @@
+package redis.clients.jedis;
+
+import java.io.Closeable;
+import java.util.List;
+
+public abstract class AbstractTransaction extends PipeliningBase implements Closeable {
+
+ protected AbstractTransaction() {
+ super(new CommandObjects());
+ }
+
+ protected AbstractTransaction(CommandObjects commandObjects) {
+ super(commandObjects);
+ }
+
+ public abstract void multi();
+
+ /**
+ * Must be called before {@link AbstractTransaction#multi() MULTI}.
+ */
+ public abstract String watch(final String... keys);
+
+ /**
+ * Must be called before {@link AbstractTransaction#multi() MULTI}.
+ */
+ public abstract String watch(final byte[]... keys);
+
+ public abstract String unwatch();
+
+ @Override public abstract void close();
+
+ public abstract List