diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000000..0953611722
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,44 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open
+and welcoming community, we pledge to respect all people who contribute through reporting
+issues, posting feature requests, updating documentation, submitting pull requests or
+patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for
+everyone, regardless of level of experience, gender, gender identity and expression,
+sexual orientation, disability, personal appearance, body size, race, ethnicity, age,
+religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic addresses,
+ without explicit permission
+* Other unethical or unprofessional conduct
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments,
+commits, code, wiki edits, issues, and other contributions that are not aligned to this
+Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors
+that they deem inappropriate, threatening, offensive, or harmful.
+
+By adopting this Code of Conduct, project maintainers commit themselves to fairly and
+consistently applying these principles to every aspect of managing this project. Project
+maintainers who do not follow or enforce the Code of Conduct may be permanently removed
+from the project team.
+
+This Code of Conduct applies both within project spaces and in public spaces when an
+individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by
+contacting a project maintainer at lettuce-redis-client-users@googlegroups.com. All complaints will
+be reviewed and investigated and will result in a response that is deemed necessary and
+appropriate to the circumstances. Maintainers are obligated to maintain confidentiality
+with regard to the reporter of an incident.
+
+This Code of Conduct is adapted from the
+[Contributor Covenant](https://contributor-covenant.org), version 1.3.0, available at
+[contributor-covenant.org/version/1/3/0/](https://contributor-covenant.org/version/1/3/0/).
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index e1b11de6e6..814158f34f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,21 +1,82 @@
-# Contributing to lettuce
+# Contributing to Lettuce
-If you would like to contribute code you can do so through GitHub by forking the repository and sending a pull request.
+Lettuce is released under the Apache 2.0 license. If you would like to contribute something, or simply want to hack on the code this document should help you get started.
-When submitting code, please make every effort to follow existing conventions and style in order to keep the code as readable as possible.
-Formatting settings are provided for Eclipse in https://github.com/mp911de/lettuce/blob/master/formatting.xml
+## Code of Conduct
+
+This project adheres to the Contributor Covenant [code of
+conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to lettuce-redis-client-users@googlegroups.com.
+
+## Using GitHub Issues
+
+We use GitHub issues to track bugs and enhancements. If you have a general usage question please ask on [Stack Overflow](https://stackoverflow.com).
+The Lettuce team and the broader community monitor the [`lettuce`](https://stackoverflow.com/tags/lettuce) tag.
+
+If you are reporting a bug, please help to speed up problem diagnosis by providing as much information as possible.
+Ideally, that would include a small sample project that reproduces the problem.
+
+## Quickstart
+
+For the impatient, if you want to submit a quick pull request:
+
+* Don't create a pull request upfront. Create a feature request ticket first, so we can discuss your idea.
+* Upon agreeing the feature is a good fit for Lettuce, please:
+ * Make sure there is a ticket in GitHub issues.
+ * Make sure you use the code formatters provided here and have them applied to your changes. Don’t submit any formatting related changes.
+ * Make sure you submit test cases (unit or integration tests) that back your changes.
+ * Try to reuse existing test sample code (domain classes). Try not to amend existing test cases but create new ones dedicated to the changes you’re making to the codebase. Try to test as locally as possible but potentially also add integration tests.
+
+When submitting code, please make every effort to follow existing conventions and style in order to keep the code as readable as possible. Formatting changes create a lot of noise and reduce the likelyhood of merging the pull request.
+Formatting settings are provided for Eclipse in https://github.com/lettuce-io/lettuce-core/blob/master/formatting.xml
## Bugreports
If you report a bug, please ensure to specify the following:
-* lettuce version (e.g. 3.2.Final)
-* Contextual information (what were you trying to do using lettuce)
-* Simplest possible steps to reproduce
- * JUnit tests to reproduce are great but not obligatory
+* Check GitHub issues whether someone else already filed a ticket. If not, then feel free to create another one.
+* Comments on closed tickets are typically a bad idea as there's little attention on closed tickets. Please create a new one.
+* Lettuce version (e.g. 3.2.Final).
+* Contextual information (what were you trying to do using Lettuce).
+* Simplest possible steps to reproduce:
+ * Ideally, a [Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve).
+ * JUnit tests to reproduce are great but not obligatory.
+
+## Features
+
+If you want to request a feature, please ensure to specify the following:
+
+* What do you want to achieve?
+* Contextual information (what were you trying to do using Lettuce).
+* Ideally, but not required: Describe your idea how you would implement it.
+
+## Questions
+
+If you have a question, then check one of the following places first as GitHub issues are for bugs and feature requests. Typically, forums, chats, and mailing lists are the best place to ask your question as you can expect to get an answer faster there:
+
+**Checkout the docs**
+
+* [Reference documentation](https://lettuce.io/docs/)
+* [Wiki](https://github.com/lettuce-io/lettuce-core/wiki)
+* [Javadoc](https://lettuce.io/core/release/api/)
+
+**Communication**
+
+* Google Group/Mailing List (General discussion, announcements and releases): [lettuce-redis-client-users](https://groups.google.com/d/forum/lettuce-redis-client-users) or [lettuce-redis-client-users@googlegroups.com](mailto:lettuce-redis-client-users@googlegroups.com)
+* Stack Overflow (Questions): [Questions about Lettuce](https://stackoverflow.com/questions/tagged/lettuce)
+* Gitter (General discussion): [![Join the chat at https://gitter.im/lettuce-io/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/lettuce-io/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+### Building from Source
+
+Lettuce source can be built from the command line using Maven on JDK 1.8 or above.
+
+The project can be built from the root directory using the standard Maven command:
-## License
+```bash
+ $ mvn clean test
+```
-By contributing your code, you agree to license your contribution under the terms of [Apache License 2.0] (http://www.apache.org/licenses/LICENSE-2.0).
+You can run a full build including integration tests using the `make` command:
-All files are released with the Apache 2.0 license.
\ No newline at end of file
+```bash
+ $ make test
+```
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 3ad4440d1a..0000000000
--- a/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-Make sure that:
-
-- [ ] You have read the [contribution guidelines](https://github.com/mp911de/lettuce/blob/master/.github/CONTRIBUTING.md).
-- [ ] You specify the lettuce version and environment so it's obvious which version is affected
-- [ ] You provide a reproducible test case (either descriptive of as JUnit test) if it's a bug or the expected behavior differs from the actual behavior.
-
-
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
new file mode 100644
index 0000000000..8a7be54c99
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -0,0 +1,52 @@
+---
+name: 🐛 Bug Report
+about: If something isn't working as expected 🤔.
+labels: 'type: bug'
+---
+
+## Bug Report
+
+
+
+#### Current Behavior
+
+
+
+
+Stack trace
+
+```java
+// your stack trace here;
+```
+
+
+
+#### Input Code
+
+
+
+
+Input Code
+
+```java
+// your code here;
+```
+
+
+
+#### Expected behavior/code
+
+
+
+#### Environment
+
+- Lettuce version(s): [e.g. 5.0.0.RELEASE, 4.2.2.Final]
+- Redis version: [e.g. 4.0.9]
+
+#### Possible Solution
+
+
+
+#### Additional context
+
+
diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md
new file mode 100644
index 0000000000..e8a75fd03c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Feature_request.md
@@ -0,0 +1,26 @@
+---
+name: 🚀 Feature Request
+about: I have a suggestion (and may want to implement it 🙂)!
+labels: 'type: enhancement'
+---
+
+## Feature Request
+
+
+
+#### Is your feature request related to a problem? Please describe
+
+A clear and concise description of what the problem is. Ex. I have an issue when [...]
+
+#### Describe the solution you'd like
+
+A clear and concise description of what you want to happen. Add any considered drawbacks.
+
+#### Describe alternatives you've considered
+
+A clear and concise description of any alternative solutions or features you've considered.
+
+#### Teachability, Documentation, Adoption, Migration Strategy
+
+If you can, explain how users will be able to use this and possibly write out a version the docs.
+Maybe a screenshot or design?
diff --git a/.github/ISSUE_TEMPLATE/Help_us.md b/.github/ISSUE_TEMPLATE/Help_us.md
new file mode 100644
index 0000000000..ec438fda1b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Help_us.md
@@ -0,0 +1,15 @@
+---
+name: 🤝 Support us on Lettuce
+about: If you would like to support our efforts in maintaining this community-driven project 🙌!
+
+---
+
+Help support Lettuce!
+
+Lettuce has always been a community project, not really backed or owned by any single (or group) of companies. While some maintainers used to work at companies supporting open source no one was working on it full time and there certainly isn't a huge company or team anywhere doing all this work.
+
+---
+
+As a group of volunteers you can help us in a few ways
+
+- Giving developer time on the project. (Message us on [Twitter](https://twitter.com/LettuceDriver) or [Gitter](https://gitter.im/lettuce-io/Lobby) for guidance). Companies should be paying their employees to contribute back to the open source projects they use everyday.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000000..7f4b5ba46b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,4 @@
+contact_links:
+ - name: Questions
+ url: https://gitter.im/lettuce-io/Lobby
+ about: Please ask questions on Gitter or StackOverflow.
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 1d1ad1830a..be6b012783 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -3,10 +3,11 @@ Thank you for proposing a pull request. This template will guide you through the
-->
Make sure that:
-- [ ] You have read the [contribution guidelines](https://github.com/mp911de/lettuce/blob/master/.github/CONTRIBUTING.md).
-- [ ] You use the code formatters provided [here](https://github.com/mp911de/lettuce/blob/master/formatting.xml) and have them applied to your changes. Don’t submit any formatting related changes.
+- [ ] You have read the [contribution guidelines](https://github.com/lettuce-io/lettuce-core/blob/master/.github/CONTRIBUTING.md).
+- [ ] You have created a feature request first to discuss your contribution intent. Please reference the feature request ticket number in the pull request.
+- [ ] You use the code formatters provided [here](https://github.com/lettuce-io/lettuce-core/blob/master/formatting.xml) and have them applied to your changes. Don’t submit any formatting related changes.
- [ ] You submit test cases (unit or integration tests) that back your changes.
\ No newline at end of file
+-->
diff --git a/.gitignore b/.gitignore
index b1c53c7797..76866d2b7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
target/
*.rdb
*.aof
-
-
atlassian-ide-plugin.xml
*.iml
@@ -14,8 +13,4 @@ work/
.settings
dependency-reduced-pom.xml
.idea
-.vagrant
-Vagrantfile
-CluTest.java
-
-CluTest.java
+.flattened-pom.xml
diff --git a/.travis.yml b/.travis.yml
index a6f794fe99..3b53e9645a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,26 +1,67 @@
+dist: xenial
+
+os: linux
+
language: java
-jdk:
- - oraclejdk8
-env:
- matrix:
- - PROFILE=netty-40
- - PROFILE=netty-41
-sudo: false
-before_install:
- - if [[ ! -f stunnel.tar.gz ]]; then wget -O stunnel.tar.gz ftp://ftp.stunnel.org/stunnel/archive/5.x/stunnel-5.33.tar.gz; fi
- - if [[ ! -f ./stunnel-5.33/configure ]]; then tar -xzf stunnel.tar.gz; fi
- - if [[ ! -f ./stunnel-5.33/src/stunnel ]]; then cd ./stunnel-5.33; ./configure; make; cd ..; fi
- - export PATH="$PATH:$(pwd)/stunnel-5.33/src"
-install: make prepare ssl-keys
-script: make test-coveralls PROFILE=${PROFILE}
+
+jobs:
+ include:
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - REDIS=unstable
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - PROFILE=jmh
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - REDIS=6.0
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - REDIS=5.0
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - REDIS=4.0
+ - jdk: openjdk8
+ env:
+ - JDK='OpenJDK 8'
+ - REDIS=3.2
+ - env: JDK='OpenJDK 12'
+ before_install: wget https://github.com/sormuras/bach/raw/master/install-jdk.sh && . ./install-jdk.sh -f 12
+ - env: JDK='OpenJDK 13'
+ before_install: wget https://github.com/sormuras/bach/raw/master/install-jdk.sh && . ./install-jdk.sh -f 13
+ - env: JDK='OpenJDK 14'
+ before_install: wget https://github.com/sormuras/bach/raw/master/install-jdk.sh && . ./install-jdk.sh -f 14
+ - env: JDK='OpenJDK EA'
+ before_install: wget https://github.com/sormuras/bach/raw/master/install-jdk.sh && . ./install-jdk.sh
+ allow_failures:
+ - env: JDK='OpenJDK EA'
+
+install:
+ - if [[ ! -f downloads/stunnel-5.56.tar.gz ]]; then wget -O downloads/stunnel-5.56.tar.gz ftp://ftp.stunnel.org/stunnel/archive/5.x/stunnel-5.56.tar.gz; fi
+ - if [[ ! -f ./stunnel-5.56/configure ]]; then tar -xzf downloads/stunnel-5.56.tar.gz; fi
+ - if [[ ! -f ./stunnel-5.56/src/stunnel ]]; then cd ./stunnel-5.56; ./configure; make; cd ..; fi
+ - export PATH="$PATH:$(pwd)/stunnel-5.56/src"
+ - make prepare ssl-keys
+
+script: make test-coverage PROFILE=${PROFILE:-ci}
+
+after_success:
+ - bash <(curl -s https://codecov.io/bash)
+
cache:
directories:
- '$HOME/.m2/repository'
- - '$TRAVIS_BUILD_DIR/stunnel-5.33'
+ - 'downloads'
+ - 'stunnel-5.56'
+
notifications:
webhooks:
urls:
- - https://webhooks.gitter.im/e/c34b69f37ca13d2f8642
+ - https://webhooks.gitter.im/e/7c2a962829d225c47a31
on_success: change # options: [always|never|change] default: always
on_failure: always # options: [always|never|change] default: always
- on_start: false # default: false
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 3ddbc22034..dfe1ddcee9 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,12 @@
+SHELL := /bin/bash
PATH := ./work/redis-git/src:${PATH}
ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
STUNNEL_BIN := $(shell which stunnel)
BREW_BIN := $(shell which brew)
YUM_BIN := $(shell which yum)
APT_BIN := $(shell which apt-get)
-PROFILE ?= netty-41
+PROFILE ?= ci
+REDIS ?= unstable
define REDIS_CLUSTER_CONFIG1
c2043458aa5646cee429fdd5e3c18220dddf2ce5 127.0.0.1:7380 master - 1434887920102 1434887920002 0 connected 12000-16383
@@ -39,32 +41,32 @@ vars currentEpoch 3 lastVoteEpoch 0
endef
define REDIS_CLUSTER_CONFIG8
-c2043458aa5646cee429fdd5e3c18220dddf2ce5 127.0.0.1:7580 master - 0 1434887920102 0 connected
-1c541b6daf98719769e6aacf338a7d81f108a180 127.0.0.1:7581 master - 0 1434887920102 3 connected 10001-16384
-2c07344ffa94ede5ea57a2367f190af6144c1adb 127.0.0.1:7582 myself,master - 0 0 2 connected 0-10000
-27f88788f03a86296b7d860152f4ae24ee59c8c9 127.0.0.1:7579 master - 0 1434887920102 1 connected
+c2043458aa5646cee429fdd5e3c18220dddf2ce5 127.0.0.1:7580 master - 1434887920102 1434887920002 0 connected 10001-16383
+27f88788f03a86296b7d860152f4ae24ee59c8c9 127.0.0.1:7579 myself,master - 0 0 1 connected 0-10000
+2c07344ffa94ede5ea57a2367f190af6144c1adb 127.0.0.1:7582 slave c2043458aa5646cee429fdd5e3c18220dddf2ce5 1434887920102 1434887920002 2 connected
+1c541b6daf98719769e6aacf338a7d81f108a180 127.0.0.1:7581 slave 27f88788f03a86296b7d860152f4ae24ee59c8c9 1434887920102 1434887920002 3 connected
vars currentEpoch 3 lastVoteEpoch 0
endef
define REDIS_CLUSTER_CONFIG_SSL_1
-27f88788f03a86296b7d860152f4ae24ee59c8c9 127.0.0.1:7479@17479 myself,master - 0 1434887920102 1 connected 0-10000
-1c541b6daf98719769e6aacf338a7d81f108a180 127.0.0.1:7480@17480 slave 27f88788f03a86296b7d860152f4ae24ee59c8c9 0 1434887920102 3 connected
-2c07344ffa94ede5ea57a2367f190af6144c1adb 127.0.0.1:7481@17481 master - 0 0 2 connected 10001-16384
-vars currentEpoch 3 lastVoteEpoch 0
+cf2354ef19ee813a962350b51438314aebce1fe2 127.0.0.1:7479@17479 myself,master - 0 1578163609000 0 connected 0-10000
+cac8e053dd6f85fab470be57d29dcbac2a4b85c4 127.0.0.1:7480@17480 slave cf2354ef19ee813a962350b51438314aebce1fe2 0 1578163609301 1 connected
+6554e5b1b158dccd4b1d9ca294a3e46a2d3e556d 127.0.0.1:7481@17481 master - 0 1578163609301 2 connected 10001-16383
+vars currentEpoch 2 lastVoteEpoch 0
endef
define REDIS_CLUSTER_CONFIG_SSL_2
-27f88788f03a86296b7d860152f4ae24ee59c8c9 127.0.0.1:7479@17479 master - 0 1434887920102 1 connected 0-10000
-1c541b6daf98719769e6aacf338a7d81f108a180 127.0.0.1:7480@17480 myself,slave 27f88788f03a86296b7d860152f4ae24ee59c8c9 0 1434887920102 3 connected
-2c07344ffa94ede5ea57a2367f190af6144c1adb 127.0.0.1:7481@17481 master - 0 0 2 connected 10001-16384
-vars currentEpoch 3 lastVoteEpoch 0
+cf2354ef19ee813a962350b51438314aebce1fe2 127.0.0.1:7479@17479 master - 0 1578163609245 0 connected 0-10000
+cac8e053dd6f85fab470be57d29dcbac2a4b85c4 127.0.0.1:7480@17480 myself,slave cf2354ef19ee813a962350b51438314aebce1fe2 0 1578163609000 1 connected
+6554e5b1b158dccd4b1d9ca294a3e46a2d3e556d 127.0.0.1:7481@17481 master - 0 1578163609245 2 connected 10001-16383
+vars currentEpoch 2 lastVoteEpoch 0
endef
define REDIS_CLUSTER_CONFIG_SSL_3
-27f88788f03a86296b7d860152f4ae24ee59c8c9 127.0.0.1:7479@17479 master - 0 1434887920102 1 connected 0-10000
-1c541b6daf98719769e6aacf338a7d81f108a180 127.0.0.1:7480@17480 slave 27f88788f03a86296b7d860152f4ae24ee59c8c9 0 1434887920102 3 connected
-2c07344ffa94ede5ea57a2367f190af6144c1adb 127.0.0.1:7481@17481 myself,master - 0 0 2 connected 10001-16384
-vars currentEpoch 3 lastVoteEpoch 0
+cac8e053dd6f85fab470be57d29dcbac2a4b85c4 127.0.0.1:7480@17480 slave cf2354ef19ee813a962350b51438314aebce1fe2 0 1578163609279 1 connected
+cf2354ef19ee813a962350b51438314aebce1fe2 127.0.0.1:7479@17479 master - 0 1578163609279 0 connected 0-10000
+6554e5b1b158dccd4b1d9ca294a3e46a2d3e556d 127.0.0.1:7481@17481 myself,master - 0 1578163609000 2 connected 10001-16383
+vars currentEpoch 2 lastVoteEpoch 0
endef
@@ -120,8 +122,8 @@ work/sentinel-%.conf:
@echo logfile $(shell pwd)/work/redis-sentinel-$*.log >> $@
@echo sentinel monitor mymaster 127.0.0.1 6482 1 >> $@
- @echo sentinel down-after-milliseconds mymaster 100 >> $@
- @echo sentinel failover-timeout mymaster 100 >> $@
+ @echo sentinel down-after-milliseconds mymaster 200 >> $@
+ @echo sentinel failover-timeout mymaster 200 >> $@
@echo sentinel parallel-syncs mymaster 1 >> $@
@echo unixsocket $(ROOT_DIR)/work/socket-$* >> $@
@echo unixsocketperm 777 >> $@
@@ -148,7 +150,7 @@ work/cluster-node-7385.conf:
@echo appendonly no >> $@
@echo unixsocket $(ROOT_DIR)/work/socket-7385 >> $@
@echo cluster-enabled yes >> $@
- @echo cluster-node-timeout 50 >> $@
+ @echo cluster-node-timeout 150 >> $@
@echo cluster-config-file $(shell pwd)/work/cluster-node-config-7385.conf >> $@
@echo requirepass foobared >> $@
@@ -163,7 +165,7 @@ work/cluster-node-7479.conf:
@echo save \"\" >> $@
@echo appendonly no >> $@
@echo cluster-enabled yes >> $@
- @echo cluster-node-timeout 50 >> $@
+ @echo cluster-node-timeout 150 >> $@
@echo cluster-config-file $(shell pwd)/work/cluster-node-config-7479.conf >> $@
@echo cluster-announce-port 7443 >> $@
@echo requirepass foobared >> $@
@@ -179,7 +181,7 @@ work/cluster-node-7480.conf:
@echo save \"\" >> $@
@echo appendonly no >> $@
@echo cluster-enabled yes >> $@
- @echo cluster-node-timeout 50 >> $@
+ @echo cluster-node-timeout 150 >> $@
@echo cluster-config-file $(shell pwd)/work/cluster-node-config-7480.conf >> $@
@echo cluster-announce-port 7444 >> $@
@echo requirepass foobared >> $@
@@ -195,7 +197,7 @@ work/cluster-node-7481.conf:
@echo save \"\" >> $@
@echo appendonly no >> $@
@echo cluster-enabled yes >> $@
- @echo cluster-node-timeout 50 >> $@
+ @echo cluster-node-timeout 150 >> $@
@echo cluster-config-file $(shell pwd)/work/cluster-node-config-7481.conf >> $@
@echo cluster-announce-port 7445 >> $@
@echo requirepass foobared >> $@
@@ -213,11 +215,11 @@ work/cluster-node-%.conf:
@echo client-output-buffer-limit pubsub 256k 128k 5 >> $@
@echo unixsocket $(ROOT_DIR)/work/socket-$* >> $@
@echo cluster-enabled yes >> $@
- @echo cluster-node-timeout 50 >> $@
+ @echo cluster-node-timeout 150 >> $@
@echo cluster-config-file $(shell pwd)/work/cluster-node-config-$*.conf >> $@
work/cluster-node-%.pid: work/cluster-node-%.conf work/redis-git/src/redis-server
- work/redis-git/src/redis-server $<
+ work/redis-git/src/redis-server $< || true
cluster-start: work/cluster-node-7379.pid work/cluster-node-7380.pid work/cluster-node-7381.pid work/cluster-node-7382.pid work/cluster-node-7383.pid work/cluster-node-7384.pid work/cluster-node-7385.pid work/cluster-node-7479.pid work/cluster-node-7480.pid work/cluster-node-7481.pid work/cluster-node-7582.pid
@@ -228,10 +230,10 @@ cluster-start: work/cluster-node-7379.pid work/cluster-node-7380.pid work/cluste
work/stunnel.conf:
@mkdir -p $(@D)
- @echo cert=$(ROOT_DIR)/work/cert.pem >> $@
- @echo key=$(ROOT_DIR)/work/key.pem >> $@
- @echo capath=$(ROOT_DIR)/work/cert.pem >> $@
- @echo cafile=$(ROOT_DIR)/work/cert.pem >> $@
+ @echo cert=$(ROOT_DIR)/work/ca/certs/localhost.cert.pem >> $@
+ @echo key=$(ROOT_DIR)/work/ca/private/localhost.decrypted.key.pem >> $@
+ @echo capath=$(ROOT_DIR)/work/ca/certs/ca.cert.pem >> $@
+ @echo cafile=$(ROOT_DIR)/work/ca/certs/ca.cert.pem >> $@
@echo delay=yes >> $@
@echo pid=$(ROOT_DIR)/work/stunnel.pid >> $@
@echo foreground = no >> $@
@@ -240,25 +242,56 @@ work/stunnel.conf:
@echo accept = 127.0.0.1:6443 >> $@
@echo connect = 127.0.0.1:6479 >> $@
- @echo [stunnel-2] >> $@
+ @echo [foo-host] >> $@
@echo accept = 127.0.0.1:6444 >> $@
@echo connect = 127.0.0.1:6479 >> $@
- @echo cert=$(ROOT_DIR)/work/localhost.pem >> $@
- @echo capath=$(ROOT_DIR)/work/localhost.pem >> $@
- @echo cafile=$(ROOT_DIR)/work/localhost.pem >> $@
-
+ @echo cert=$(ROOT_DIR)/work/ca/certs/foo-host.cert.pem >> $@
+ @echo key=$(ROOT_DIR)/work/ca/private/foo-host.decrypted.key.pem >> $@
+
@echo [ssl-cluster-node-1] >> $@
@echo accept = 127.0.0.1:7443 >> $@
@echo connect = 127.0.0.1:7479 >> $@
-
+
@echo [ssl-cluster-node-2] >> $@
@echo accept = 127.0.0.1:7444 >> $@
- @echo connect = 127.0.0.1:7480 >> $@
-
+ @echo connect = 127.0.0.1:7480 >> $@
+
@echo [ssl-cluster-node-3] >> $@
@echo accept = 127.0.0.1:7445 >> $@
@echo connect = 127.0.0.1:7481 >> $@
-
+
+ @echo [ssl-sentinel-1] >> $@
+ @echo accept = 127.0.0.1:26822 >> $@
+ @echo connect = 127.0.0.1:26379 >> $@
+
+ @echo [ssl-sentinel-2] >> $@
+ @echo accept = 127.0.0.1:26823 >> $@
+ @echo connect = 127.0.0.1:26380 >> $@
+
+ @echo [ssl-sentinel-3] >> $@
+ @echo accept = 127.0.0.1:26824 >> $@
+ @echo connect = 127.0.0.1:26381 >> $@
+
+ @echo [ssl-sentinel-master] >> $@
+ @echo accept = 127.0.0.1:6925 >> $@
+ @echo connect = 127.0.0.1:6482 >> $@
+
+ @echo [ssl-sentinel-slave] >> $@
+ @echo accept = 127.0.0.1:6926 >> $@
+ @echo connect = 127.0.0.1:6482 >> $@
+
+ @echo [stunnel-client-cert] >> $@
+ @echo accept = 127.0.0.1:6445 >> $@
+ @echo connect = 127.0.0.1:6479 >> $@
+ @echo verify=2 >> $@
+
+ @echo [stunnel-master-slave-node-1] >> $@
+ @echo accept = 127.0.0.1:8443 >> $@
+ @echo connect = 127.0.0.1:6482 >> $@
+
+ @echo [stunnel-master-slave-node-2] >> $@
+ @echo accept = 127.0.0.1:8444 >> $@
+ @echo connect = 127.0.0.1:6483 >> $@
work/stunnel.pid: work/stunnel.conf ssl-keys
which stunnel4 >/dev/null 2>&1 && stunnel4 $(ROOT_DIR)/work/stunnel.conf || stunnel $(ROOT_DIR)/work/stunnel.conf
@@ -301,35 +334,25 @@ cleanup: stop
# SSL Keys
# - remove Java keystore as becomes stale
##########
-work/key.pem work/cert.pem:
- @mkdir -p $(@D)
- openssl genrsa -out work/key.pem 4096
- openssl req -new -x509 -key work/key.pem -out work/cert.pem -days 365 -subj "/O=lettuce/ST=Some-State/C=DE/CN=lettuce-test"
- openssl req -new -x509 -key work/key.pem -out work/localhost.pem -days 365 -subj "/O=lettuce/ST=Some-State/C=DE/CN=localhost"
- chmod go-rwx work/key.pem
- chmod go-rwx work/cert.pem
- chmod go-rwx work/localhost.pem
- - rm -f work/keystore.jks
- - rm -f work/keystore-localhost.jks
-
work/keystore.jks:
@mkdir -p $(@D)
- $$JAVA_HOME/bin/keytool -importcert -keystore work/keystore.jks -file work/cert.pem -noprompt -storepass changeit
- $$JAVA_HOME/bin/keytool -importcert -keystore work/keystore-localhost.jks -file work/localhost.pem -noprompt -storepass different
+ - rm -f work/*.jks
+ - rm -Rf work/ca
+ src/test/bash/create_certificates.sh
-ssl-keys: work/key.pem work/cert.pem work/keystore.jks
+ssl-keys: work/keystore.jks
stop:
pkill stunnel || true
pkill redis-server && sleep 1 || true
pkill redis-sentinel && sleep 1 || true
-test-coveralls: start
- mvn -B -DskipTests=false clean compile test jacoco:report coveralls:report -P$(PROFILE)
+test-coverage: start
+ mvn -B -DskipITs=false clean compile verify jacoco:report -P$(PROFILE)
$(MAKE) stop
test: start
- mvn -B -DskipTests=false clean compile test -P$(PROFILE)
+ mvn -B -DskipITs=false clean compile verify -P$(PROFILE)
$(MAKE) stop
prepare: stop
@@ -365,8 +388,9 @@ endif
endif
work/redis-git/src/redis-cli work/redis-git/src/redis-server:
- [ ! -e work/redis-git ] && git clone https://github.com/antirez/redis.git --branch unstable --single-branch work/redis-git && cd work/redis-git|| true
- [ -e work/redis-git ] && cd work/redis-git && git fetch && git merge origin/master || true
+ [ -d "work/redis-git" ] && cd work/redis-git && git reset --hard || \
+ git clone https://github.com/antirez/redis.git work/redis-git
+ cd work/redis-git && git checkout -q $(REDIS) && git pull origin $(REDIS)
$(MAKE) -C work/redis-git clean
$(MAKE) -C work/redis-git -j4
@@ -380,8 +404,3 @@ release:
mvn release:perform -Psonatype-oss-release
ls target/checkout/target/*-bin.zip | xargs gpg -b -a
ls target/checkout/target/*-bin.tar.gz | xargs gpg -b -a
- cd target/checkout && mvn site:site && mvn -o scm-publish:publish-scm -Dgithub.site.upload.skip=false
-
-apidocs:
- mvn site:site
- ./apidocs.sh
diff --git a/README.md b/README.md
index 0a10f778bf..5e6bf25472 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,45 @@
-lettuce - Advanced Java Redis client
+ Lettuce - Advanced Java Redis client
===============================
-[![Build Status](https://travis-ci.org/mp911de/lettuce.svg)](https://travis-ci.org/mp911de/lettuce) [![Coverage Status](https://img.shields.io/coveralls/mp911de/lettuce.svg)](https://coveralls.io/r/mp911de/lettuce) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/biz.paluch.redis/lettuce/badge.svg)](https://maven-badges.herokuapp.com/maven-central/biz.paluch.redis/lettuce)
+[![Build Status](https://travis-ci.org/lettuce-io/lettuce-core.svg)](https://travis-ci.org/lettuce-io/lettuce-core) [![codecov](https://codecov.io/gh/lettuce-io/lettuce-core/branch/master/graph/badge.svg)](https://codecov.io/gh/lettuce-io/lettuce-core)
+ [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.lettuce/lettuce-core)
Lettuce is a scalable thread-safe Redis client for synchronous,
asynchronous and reactive usage. Multiple threads may share one connection if they avoid blocking and transactional
operations such as `BLPOP` and `MULTI`/`EXEC`.
-lettuce is built with [netty](https://github.com/netty/netty).
+Lettuce is built with [netty](https://github.com/netty/netty).
Supports advanced Redis features such as Sentinel, Cluster, Pipelining, Auto-Reconnect and Redis data models.
-This version of lettuce has been tested against the latest Redis source-build.
+This version of Lettuce has been tested against the latest Redis source-build.
-* lettuce 3.x works with Java 6, 7 and 8, lettuce 4.x requires Java 8
-* [synchronous](https://github.com/mp911de/lettuce/wiki/Basic-usage), [asynchronous](https://github.com/mp911de/lettuce/wiki/Asynchronous-API-%284.0%29) and [reactive](https://github.com/mp911de/lettuce/wiki/Reactive-API-%284.0%29) usage
-* [Redis Sentinel](https://github.com/mp911de/lettuce/wiki/Redis-Sentinel)
-* [Redis Cluster](https://github.com/mp911de/lettuce/wiki/Redis-Cluster)
-* [SSL](https://github.com/mp911de/lettuce/wiki/SSL-Connections) and [Unix Domain Socket](https://github.com/mp911de/lettuce/wiki/Unix-Domain-Sockets) connections
-* [Streaming API](https://github.com/mp911de/lettuce/wiki/Streaming-API)
-* [CDI](https://github.com/mp911de/lettuce/wiki/CDI-Support) and [Spring](https://github.com/mp911de/lettuce/wiki/Spring-Support) integration
-* [Codecs](https://github.com/mp911de/lettuce/wiki/Codecs) (for UTF8/bit/JSON etc. representation of your data)
-* multiple [Command Interfaces](https://github.com/mp911de/lettuce/wiki/Command-Interfaces-%284.0%29)
+* [synchronous](https://github.com/lettuce-io/lettuce-core/wiki/Basic-usage), [asynchronous](https://github.com/lettuce-io/lettuce-core/wiki/Asynchronous-API-%284.0%29) and [reactive](https://github.com/lettuce-io/lettuce-core/wiki/Reactive-API-%285.0%29) usage
+* [Redis Sentinel](https://github.com/lettuce-io/lettuce-core/wiki/Redis-Sentinel)
+* [Redis Cluster](https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster)
+* [SSL](https://github.com/lettuce-io/lettuce-core/wiki/SSL-Connections) and [Unix Domain Socket](https://github.com/lettuce-io/lettuce-core/wiki/Unix-Domain-Sockets) connections
+* [Streaming API](https://github.com/lettuce-io/lettuce-core/wiki/Streaming-API)
+* [CDI](https://github.com/lettuce-io/lettuce-core/wiki/CDI-Support) and [Spring](https://github.com/lettuce-io/lettuce-core/wiki/Spring-Support) integration
+* [Codecs](https://github.com/lettuce-io/lettuce-core/wiki/Codecs) (for UTF8/bit/JSON etc. representation of your data)
+* multiple [Command Interfaces](https://github.com/lettuce-io/lettuce-core/wiki/Command-Interfaces-%284.0%29)
+* Compatible with Java 8 and 9 (implicit automatic module w/o descriptors)
-See the [Wiki](https://github.com/mp911de/lettuce/wiki) for more docs.
+See the [reference documentation](https://lettuce.io/docs/) and [Wiki](https://github.com/lettuce-io/lettuce-core/wiki) for more details.
Communication
---------------
-* Google Group: [lettuce-redis-client-users](https://groups.google.com/d/forum/lettuce-redis-client-users) or lettuce-redis-client-users@googlegroups.com
-* [![Join the chat at https://gitter.im/mp911de/lettuce](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mp911de/lettuce?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-* [Github Issues](https://github.com/mp911de/lettuce/issues)
+* Google Group/Mailing List (General discussion, announcements and releases): [lettuce-redis-client-users](https://groups.google.com/d/forum/lettuce-redis-client-users) or lettuce-redis-client-users@googlegroups.com
+* Stack Overflow (Questions): [https://stackoverflow.com/questions/tagged/lettuce](https://stackoverflow.com/questions/tagged/lettuce)
+* Gitter (General discussion): [![Join the chat at https://gitter.im/lettuce-io/Lobby](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/lettuce-io/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+* Twitter: [@LettuceDriver](https://twitter.com/LettuceDriver)
+* [GitHub Issues](https://github.com/lettuce-io/lettuce-core/issues) (Bug reports, feature requests)
Documentation
---------------
-* [Wiki](https://github.com/mp911de/lettuce/wiki)
+* [Reference documentation](https://lettuce.io/docs/)
+* [Wiki](https://github.com/lettuce-io/lettuce-core/wiki)
* [Javadoc](http://redis.paluch.biz/docs/api/releases/latest/)
@@ -44,76 +48,47 @@ Binaries/Download
Binaries and dependency information for Maven, Ivy, Gradle and others can be found at http://search.maven.org.
-Releases of lettuce are available in the maven central repository. Take also a look at the [Download](https://github.com/mp911de/lettuce/wiki/Download) page in the [Wiki](https://github.com/mp911de/lettuce/wiki).
+Releases of lettuce are available in the Maven Central repository. Take also a look at the [Releases](https://github.com/lettuce-io/lettuce-core/releases).
Example for Maven:
```xml
- biz.paluch.redis
- lettuce
+ io.lettuce
+ lettuce-core
x.y.z
```
-Shaded JAR-File (packaged dependencies and relocated to the `com.lambdaworks` package to prevent version conflicts)
+If you'd rather like the latest snapshots of the upcoming major version, use our Maven snapshot repository and declare the appropriate dependency version.
```xml
- biz.paluch.redis
- lettuce
- x.y.z
- shaded
-
-
- io.reactivex
- rxjava
-
-
- org.latencyutils
- LatencyUtils
-
-
- io.netty
- netty-common
-
-
- io.netty
- netty-transport
-
-
- io.netty
- netty-handler
-
-
- io.netty
- netty-codec
-
-
- com.google.guava
- guava
-
-
- io.netty
- netty-transport-native-epoll
-
-
- org.apache.commons
- commons-pool2
-
-
+ io.lettuce
+ lettuce-core
+ x.y.z.BUILD-SNAPSHOT
-```
-or snapshots at https://oss.sonatype.org/content/repositories/snapshots/
+
+
+ sonatype-snapshots
+ Sonatype Snapshot Repository
+ https://oss.sonatype.org/content/repositories/snapshots/
+
+ true
+
+
+
+```
Basic Usage
-----------
```java
-RedisClient client = RedisClient.create("redis://localhost")
-RedisStringsConnection connection = client.connect()
-String value = connection.get("key")
+RedisClient client = RedisClient.create("redis://localhost");
+StatefulRedisConnection connection = client.connect();
+RedisStringCommands sync = connection.sync();
+String value = sync.get("key");
```
Each Redis command is implemented by one or more methods with names identical
@@ -121,7 +96,7 @@ to the lowercase Redis command name. Complex commands with multiple modifiers
that change the result type include the CamelCased modifier as part of the
command name, e.g. zrangebyscore and zrangebyscoreWithScores.
-See [Basic usage](https://github.com/mp911de/lettuce/wiki/Basic-usage) for further details.
+See [Basic usage](https://github.com/lettuce-io/lettuce-core/wiki/Basic-usage) for further details.
Asynchronous API
------------------------
@@ -138,7 +113,7 @@ set.get() == "OK"
get.get() == "value"
```
-See [Asynchronous API](https://github.com/mp911de/lettuce/wiki/Asynchronous-API-%284.0%29) for further details.
+See [Asynchronous API](https://github.com/lettuce-io/lettuce-core/wiki/Asynchronous-API-%284.0%29) for further details.
Reactive API
------------------------
@@ -146,22 +121,22 @@ Reactive API
```java
StatefulRedisConnection connection = client.connect();
RedisStringReactiveCommands reactive = connection.reactive();
-Observable set = reactive.set("key", "value")
-Observable get = reactive.get("key")
+Mono set = reactive.set("key", "value");
+Mono get = reactive.get("key");
set.subscribe();
-get.toBlocking().single() == "value"
+get.block() == "value"
```
-See [Reactive API](https://github.com/mp911de/lettuce/wiki/Reactive-API-%284.0%29) for further details.
+See [Reactive API](https://github.com/lettuce-io/lettuce-core/wiki/Reactive-API-%285.0%29) for further details.
Pub/Sub
-------
```java
RedisPubSubCommands connection = client.connectPubSub().sync();
-connection.addListener(new RedisPubSubListener() { ... })
+connection.getStatefulConnection().addListener(new RedisPubSubListener() { ... })
connection.subscribe("channel")
```
@@ -169,12 +144,12 @@ Building
-----------
Lettuce is built with Apache Maven. The tests require multiple running Redis instances for different test cases which
-are configured using a ```Makefile```. All tests run against Redis branch 3.0
+are configured using a ```Makefile```. Tests run by default against Redis `unstable`.
To build:
```
-$ git clone https://github.com/mp911de/lettuce.git
+$ git clone https://github.com/lettuce-io/lettuce-core.git
$ cd lettuce/
$ make prepare ssl-keys
$ make test
@@ -189,17 +164,16 @@ $ make test
Bugs and Feedback
-----------
-For bugs, questions and discussions please use the [Github Issues](https://github.com/mp911de/lettuce/issues).
+For bugs, questions and discussions please use the [GitHub Issues](https://github.com/lettuce-io/lettuce-core/issues).
License
-------
-* [Apache License 2.0] (http://www.apache.org/licenses/LICENSE-2.0)
+* [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
* Fork of https://github.com/wg/lettuce
Contributing
-------
Github is for social coding: if you want to write code, I encourage contributions through pull requests from forks of this repository.
-Create Github tickets for bugs and new features and comment on the ones that you are interested in and take a look into [CONTRIBUTING.md](https://github.com/mp911de/lettuce/blob/master/.github/CONTRIBUTING.md)
-
+Create Github tickets for bugs and new features and comment on the ones that you are interested in and take a look into [CONTRIBUTING.md](https://github.com/lettuce-io/lettuce-core/blob/master/.github/CONTRIBUTING.md)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 8eb845b561..3f94f5ec51 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,290 +1,165 @@
-lettuce 4.2.0 RELEASE NOTES
-===========================
+Lettuce 6.0.0 M1 RELEASE NOTES
+==============================
-That's the zero behind 4.2? Well, that's to not break OSGi support. Now let's
-talk about the more interesting things. Lettuce 4.2.0 is a major release and
-completes development of several notable enhancements.
+The Lettuce team is delighted to announce the availability of the first Lettuce 6 milestone.
-This release comes with SSL support, Publish/Subscribe and adaptive topology
-refreshing for Redis Cluster. It features a major refactoring of the command
-handling and several improvements for Cloud-based Redis services and
-improvements to the Master/Slave API.
+Lettuce 6 aligns with Redis 6 in terms of API and protocol changes. Both protocols, RESP and RESP3 are supported side-by-side defaulting to RESP.
-The usage of Guava was reduced for the most parts. Only the `LoadingCache`,
-`InetAddresses` and `HostAndPort` components are still in use. A future lettuce
-5.0 version will eliminate the use of Guava completely.
+Most notable changes that ship with this release are
-**Important note for users of connection-pooling and latency tracking**
+* RESP3 support
+* ACL Authentication with username/password
+* Asynchronous Cluster Topology Refresh
+* API cleanups/Breaking Changes
-Dependencies were streamlined with this release. Apache's `commons-pool2` and
-`latencyutils` are now _optional_ dependencies. If you use connection-pooling or
-latency tracking, please include these dependencies explicitly otherwise these
-features will be disabled.
+We're working towards the next milestone and looking at further Redis 6 features such as client-side caching how these can be incorporated into Lettuce. The release date of Lettuce 6 depends on Redis 6 availability.
-Lettuce 4.2.0 was verified with several Cloud-based Redis services. It works
-with different AWS ElastiCache usage patterns and is known to work with the
-Azure Redis Cluster service supporting SSL and authentication (see below).
+Thanks to all contributors who made Lettuce 6.0.0.M1 possible.
+Lettuce requires a minimum of Java 8 to build and run and is compatible with Java 14. It is tested continuously against the latest Redis source-build.
-lettuce 4.2.0 is fully binary compatible with the last release and can be used
-as a drop-in replacement for 4.1.x. This update is strongly recommended for
-lettuce 4.x users as it fixes some critical connection synchronization bugs.
+If you need any support, meet Lettuce at
-Thanks to all contributors that made lettuce 4.2.0 possible.
-
-lettuce 4.2.0 requires Java 8 and cannot be used with Java 6 or 7.
-
-
-Redis Cluster Publish/Subscribe
--------------------------------
-Redis Cluster
-provides Publish/Subscribe features to broadcast messages across the cluster.
-Using the standalone client allows using Publish/Subscribe with Redis Cluster
-but comes with the limitation of high-availability/failover.
-
-If a node goes down, the connection is lost until the node is available again.
-lettuce addresses this issue with Redis Cluster Publish/Subscribe and provides a
-failover mechanism.
-
-Publish/Subscribe messages and subscriptions are operated on the default cluster
-connection. The default connection is established with the node with the least
-client connections to achieve a homogeneous connection distribution. It also
-uses the cluster topology to failover if the currently connected node is down.
+* Google Group (General discussion, announcements, and releases): https://groups.google.com/d/forum/lettuce-redis-client-users
+or lettuce-redis-client-users@googlegroups.com
+* Stack Overflow (Questions): https://stackoverflow.com/questions/tagged/lettuce
+* Join the chat at https://gitter.im/lettuce-io/Lobby for general discussion
+* GitHub Issues (Bug reports, feature requests): https://github.com/lettuce-io/lettuce-core/issues
+* Documentation: https://lettuce.io/core/6.0.0.M1/reference/
+* Javadoc: https://lettuce.io/core/6.0.0.M1/api/
-Publishing a message using the regular cluster connection is still possible
-(since 4.0). The regular cluster connection calculates a slot-hash from the
-channel (which is the key in this case). Publishing always connects to the
-master node which is responsible for the slot although `PUBLISH` is not affected
-by the keyspace/slot-hash rule.
+RESP3 Support
+-------------
-Read more: https://github.com/mp911de/lettuce/wiki/Pub-Sub-%284.0%29
+Redis 6 ships with support for a new protocol version. RESP3 brings support for additional data types to distinguish better between responses. The following response types were introduced with RESP3:
+* Null: a single `null` value replacing RESP v2 `*-1` and `$-1` null values.
+* Double: a floating-point number.
+* Boolean: `true` or `false`.
+* Blob error: binary-safe error code and message.
+* Verbatim string: a binary-safe string that is typically used as user message without any escaping or filtering.
+* Map: an ordered collection of key-value pairs. Keys and values can be any other RESP3 type.
+* Set: an unordered collection of N other types.
+* Attribute: Like the Map type, but the client should keep reading the reply ignoring the attribute type, and return it to the client as additional information.
+* Push: Out-of-band data.
+* Streamed strings: A large response using chunked transfer.
+* Hello: Like the Map type, but is sent only when the connection between the client and the server is established, in order to welcome the client with different information like the name of the server, its version, and so forth.
+* Big number: a large number non-representable by the Number type
-Redis Cluster and SSL
----------------------
-Redis introduces an option to announce a specific IP address/port using
-`cluster-announce-ip` and `cluster-announce-port`. This is useful for
-Docker and NAT'ed setups. Furthermore, you can "hide" your Redis Cluster nodes
-behind any other proxy like `stunnel`. A Redis Cluster node will announce the
-specified port/IP which can map to `stunnel`, and you get an SSL-protected
-Redis Cluster. Please note that `cluster-announce-ip` is not part of Redis 3.2
-but will be released in future versions.
+Lettuce supports all response types except attributes. Push messages are only supported for Pub/Sub messages.
-Redis Cluster SSL works pretty much the same as Redis Standalone with SSL. You
-can configure SSL and other SSL/TLS options using `RedisURI`.
+The protocol version can be changed through `ClientOptions` which disables protocol discovery:
```java
-RedisURI redisURI = RedisURI.Builder.redis(host(), 7443)
- .withSsl(true)
- .withVerifyPeer(false)
- .build();
-
-RedisClusterClient redisClusterClient = RedisClusterClient.create(redisURI);
-StatefulRedisClusterConnection connection = redisClusterClient.connect();
+ClientOptions options = ClientOptions.builder().protocolVersion(ProtocolVersion.RESP2).build();
```
-You should disable the `verifyPeer` option if the SSL endpoints cannot provide a
-valid certificate. When creating a `RedisClusterClient` using
-`RedisClusterClientFactoryBean` the `verifyPeer` option is disabled by default.
-
-Lettuce was successfully tested with Azure Redis with SSL and authentication.
-
-Read more: https://github.com/mp911de/lettuce/wiki/Redis-Cluster-%284.0%29
+Future versions are going to discover the protocol version as part of the connection handshake and use the newest available protocol version.
+ACL Authentication
+------------------
-Redis Cluster Topology Discovery and Refreshing
-----------------------------------------------
-The lettuce Redis Cluster Client
-allows regular topology updates. lettuce 4.2.0 improves the existing topology
-updates with adaptive refreshing and dynamic/static topology discovery.
-
-Adaptive refresh initiates topology view updates based on events happened during
-Redis Cluster operations. Adaptive triggers lead to an immediate topology
-refresh. Adaptive updates are rate-limited using a timeout since events can
-happen on a large scale. Adaptive refresh triggers are disabled by default and
-can be enabled selectively:
-
-* `MOVED_REDIRECT`
-* `ASK_REDIRECT`
-* `PERSISTENT_RECONNECTS`
-
-Dynamic/static topology discovery sources are the second change to topology
-refresh. lettuce uses by default dynamic discovery. Dynamic discovery retrieves
-the initial topology from the seed nodes and determines additional nodes to
-request their topology view. That is to reduce split-brain views by choosing the
-view which is shared by the majority of cluster nodes.
-
-Dynamic topology discovery also provides latency data and client count for each
-node in the cluster. These details are useful for calculating the nearest node
-or the least used node.
-
-Dynamic topology discovery can get expensive when running large Redis Clusters
-as all nodes from the topology are queried for their view. Static topology
-refresh sources limit the nodes to the initial seed node set. Limiting nodes is
-friendly to large clusters but it will provide latency and client count only for
-the seed nodes.
-
-Read more: https://github.com/mp911de/lettuce/wiki/Client-options#adaptive-cluster-topology-refresh
-
-
-Redis Modules
--------------
+Redis 6 supports authentication using username and password. Lettuce's `RedisURI` adapts to this change by allowing to specify a username:
-Redis module support is a very young feature. lettuce provides a custom command
-API to dispatch own commands. `StatefulConnection` already allows sending of
-commands but requires wrapping of commands into the appropriate synchronization
-wrapper (Future, Reactive, Fire+Forget).
+`redis://username:password@host:port/database`
-lettuce provides with 4.2.0 `dispatch(…)` methods on each API type to provide a
-simpler interface.
+Using RESP3 or PING on connect authenticates the connection during the handshake phase. Already connected connections may switch the user context by issuing an `AUTH` command with username and password:
```java
-RedisCodec codec = new Utf8StringCodec();
-
-String response = redis.dispatch(CommandType.SET,
- new StatusOutput<>(codec),
- new CommandArgs<>(codec)
- .addKey(key)
- .addValue(value));
+StatefulRedisConnection connection = client.connect();
+RedisCommands commands = connection.sync();
+commands.auth("username", "password");
```
-Calls to `dispatch(…)` on the synchronous API are blocking calls, calls on the
-asynchronous API return a `RedisFuture` and calls on the Reactive API return
-an `Observable` which flat-maps collection responses.
-
-Using `dispatch(…)` allows to invoke arbitrary commands and works together
-within transactions and Redis Cluster. Exposing this API also allows choosing a
-different `RedisCodec` for particular operations.
-
-Read more: https://github.com/mp911de/lettuce/wiki/Custom-commands%2C-outputs-and-command-mechanics
-
-
-CommandHandler refactoring
---------------------------
-Command sending, buffering, encoding and receiving was refactored on a large scale.
-Command encoding is performed in a separate handler and outside of `CommandHandler`.
-It does not longer allocate an additional buffer to encode its arguments, but
-arguments are directly written to the command buffer that is used to encode
-single command/batch of commands. Fewer memory allocations help improving
-performance and do not duplicate data.
-
-Synchronization and locking were reworked as well. The critical path used for
-writing commands is no longer locked exclusively but uses a shared locking with
-almost lock-free synchronization.
-
-
-Improvements to Master/Slave connections
-----------------------------------------
-lettuce introduced with 4.1 a Master/Slave API which is now more dynamic. It's
-no longer required to connect to a Master node when using Master/Slave without
-Sentinel as the Master/Slave API will discover the master by itself. Providing
-one seed node enables dynamic lookup. The API is internally prepared for dynamic
-updates which are used with Redis Sentinel.
-
-A Sentinel-managed Master/Slave setup discovers configuration changes based on
-Sentinel events and updates its topology accordingly.
+Asynchronous Cluster Topology Refresh
+-------------------------------------
-Another change is the broader support of AWS ElastiCache Master/Slave setups.
-AWS ElastiCache allows various patterns for usage. One of them is the automatic
-failover. AWS ElastiCache exposes a connection point hostname and updates the
-DNS record to point to the current master node. Since the JVM has a built-in
-cache it's not trivial to adjust the DNS lookup and caching to the special needs
-which are valid only for AWS ElastiCache connections. lettuce exposes a DNS
-Lookup API that defaults to the JVM lookup. Lettuce ships also with
-`DirContextDnsResolver` that allows own DNS lookups using either the
-system-configured DNS or external DNS servers. This implementation comes without
-caching and is suitable for AWS ElastiCache.
+Cluster Topology Refresh was in Lettuce 4 and 5 a blocking and fully synchronous task that required a worker thread. A side-effect of the topology refresh was that command timeouts could be delayed as the worker thread pool was used for timeout tasks and the topology refresh. Lettuce 6 ships with a fully non-blocking topology refresh mechanism which is basically a reimplementation of the previous refresh mechanism but using non-blocking components instead.
-Another pattern is using AWS ElastiCache slaves. Before 4.2.0, a static setup
-was required. Clients had to point to the appropriate node. The Master/Slave API
-allows specifying a set of nodes which form a static Master/Slave setup. Lettuce
-discovers the roles from the provided nodes and routes read/write commands
-according to `ReadFrom` settings.
+API cleanups/Breaking Changes
+-----------------------------
-Read more: https://github.com/mp911de/lettuce/wiki/Master-Slave
+With this release, we took the opportunity to introduce a series of changes that put the API into a cleaner shape.
-
-If you need any support, meet lettuce at:
-
-* Google Group: https://groups.google.com/d/forum/lettuce-redis-client-users
-* Gitter: https://gitter.im/mp911de/lettuce
-* Github Issues: https://github.com/mp911de/lettuce/issues
-
-
-Commands
---------
-* Add support for CLUSTER BUMPEPOCH command #179
-* Support extended MIGRATE syntax #197
-* Add support for GEORADIUS STORE and STOREDIST options #199
-* Support SCAN in RedisCluster #201
-* Add support for BITFIELD command #206
-* Add zadd method accepting ScoredValue #210
-* Add support for SPOP key count #235
-* Add support for GEOHASH command #239
-* Add simple interface for custom command invocation for sync/async/reactive APIs #245
+* Script Commands: `eval`, `digest`, `scriptLoad` methods now only accept `String` and `byte[]` argument types. Previously `digest` and `scriptLoad` accepted the script contents as Codec value type which caused issues especially when marshalling values using JSON or Java Serialization. The script charset can be configured via `ClientOptions` (`ClientOptions.builder().scriptCharset(StandardCharsets.US_ASCII).build();`), defaulting to UTF-8.
+* Connection: Removal of deprecated timeout methods accepting `TimeUnit`. Use methods accepting `Duration` instead.
+* Async Commands: `RedisAsyncCommands.select(…)` and `.auth(…)` methods return now futures instead if being blocking methods.
+* Asynchronous API Usage: Connection and Queue failures now no longer throw an exception but properly associate the failure with the Future handle.
+* Master/Replica API: Move implementation classes from `io.lettuce.core.masterslave` to `io.lettuce.core.masterreplica` package.
+* Internal: Removal of the internal `LettuceCharsets` utility class.
+* Internal: Reduced visibility of several `protected` fields in `AbstractRedisClient` (`eventLoopGroups`, `genericWorkerPool`, `timer`, `clientResources`, `clientOptions`, `defaultTimeout`).
+* Internal: Consolidation of Future synchronization utilities (`LettuceFutures`, `RefreshFutures`, `Futures`).
Enhancements
------------
-* Cluster pub/sub and resilient subscriptions #138 (Thanks to @jpennell)
-* Reactive API: Emit items during command processing #178
-* Allow configuration of max redirect count for cluster connections #191
-* Improve SCAN API #208
-* Support Redis Cluster with SSL #209
-* Improve CommandHandler locking #211
-* Improve command encoding of singular commands and command batches #212 (Thanks to @cwolfinger)
-* Add log statement for resolved address #218 (Thanks to @mzapletal)
-* Apply configured password/database number in MasterSlave connection #220
-* Improve command draining in flushCommands #228 (Thanks to @CodingFabian)
-* Support dynamic master/slave connections #233
-* Expose DNS Resolver #236
-* Make latencyutils and commons-pool2 dependencies optional #237
-* Support adaptive cluster topology refreshing and static refresh sources #240 (Thanks to @RahulBabbar)
-* Add static builder() methods to builders enhancement #248
-* Add factory for reconnection delay enhancement #250
-* Add integer cache for CommandArgs enhancement #251
+* Use channel thread to enqueue commands #617
+* Redesign connection activation #697
+* Add support for RESP3 #964
+* Consolidate Future utils #1039
+* Make RedisAsyncCommands.select() and auth() async #1118 (Thanks to @ikkyuland)
+* Allow client to pick a specific TLS version and introduce PEM-based configuration #1167 (Thanks to @amohtashami12307)
+* Optimization of BITFIELD args generation #1175 (Thanks to @ianpojman)
+* Add mutate() to SocketOptions #1193
+* Add CLIENT ID command #1197
+* Lettuce not able to reconnect automatically to SSL+authenticated ElastiCache node #1201 (Thanks to @chadlwilson)
+* Add support for AUTH with user + password introduced in Redis 6 #1202 (Thanks to @tgrall)
+* HMSET deprecated in version 4.0.0 #1217 (Thanks to @hodur)
+* Allow selection of Heap or Direct buffers for CommandHandler.buffer #1223 (Thanks to @dantheperson)
+* Support JUSTID flag of XCLAIM command #1233 (Thanks to @christophstrobl)
+* Add support for KEEPTTL with SET #1234
+* Add support for RxJava 3 #1235
+* Retrieve username from URI when RedisURI is built from URL #1242 (Thanks to @gkorland)
+* Introduce ThreadFactoryProvider to DefaultEventLoopGroupProvider for easier customization #1243 (Thanks to @apilling6317)
Fixes
-----
-* pfmerge invokes PFADD instead of PFMERGE #158 (Thanks to @christophstrobl)
-* Fix NPE in when command output is null #187 (Thanks to @rovarghe)
-* Set interrupted bit after catching InterruptedException #192
-* Lettuce fails sometimes at shutdown: DefaultClientResources.shutdown #194
-* Extensive calls to PooledClusterConnectionProvider.closeStaleConnections #195
-* Shared resources are closed altough still users are present #196
-* Lettuce 4.1 does not repackage new dependencies #198 (Thanks to @ CodingFabian)
-* Fix NPE in CommandHandler.write (Thanks to @cinnom) #213
-* Gracefully shutdown DefaultCommandLatencyCollector.PAUSE_DETECTOR #223 (Thanks to @sf-git and @johnou)
-* RedisClient.connect(RedisURI) fails for unix socket based URIs #229 (Thanks to @nivekastoreth)
-* HdrHistogram and LatencyUtils are not included in binary distribution #231
-* Cache update in Partitions is not thread-safe #234
-* GEORADIUSBYMEMBER, GEORADIUS and GEOPOS run into NPE when using Redis Transactions #241
-* LettuceFutures.awaitAll throws RedisCommandInterruptedException when awaiting failed commands #242
-* Fix command sequence on connection activation #253 (Thanks to @long-xuan-nguyen)
-* Cluster topology refresh: Failed connections are not closed bug #255
-* Cluster topology refresh tries to connect twice for failed connection attempts #256
-* Connection lifecycle state DISCONNECTED is considered a connected sate #257
-* Writing commands while a disconnect is in progress leads to a race-condition #258
-* Canceled commands lead to connection desynchronization #262 (Thanks to @long-xuan-nguyen)
+* Commands Timeout ignored/not working during refresh #1107 (Thanks to @pendula95)
+* StackOverflowError in RedisPublisher #1140 (Thanks to @csunwold)
+* Incorrect access on io.lettuce.core.ReadFrom.isOrderSensitive() #1145 (Thanks to @orclev)
+* Consider ReadFrom.isOrderSensitive() in cluster scan command #1146
+* Improve log message for nodes that cannot be reached during reconnect/topology refresh #1152 (Thanks to @drewcsillag)
+* BoundedAsyncPool doesn't work with a negative maxTotal #1181 (Thanks to @sguillope)
+* TLS setup fails to a master reported by sentinel #1209 (Thanks to @ae6rt)
+* Lettuce metrics creates lots of long arrays, and gives out of memory error. #1210 (Thanks to @omjego)
+* CommandSegments.StringCommandType does not implement hashCode()/equals() #1211
+* Unclear documentation about quiet time for RedisClient#shutdown #1212 (Thanks to @LychakGalina)
+* StreamReadOutput in Lettuce 6 creates body entries containing the stream id #1216
+* Write race condition while migrating/importing a slot #1218 (Thanks to @phyok)
+* randomkey return V not K #1240 (Thanks to @hosunrise)
+* ConcurrentModificationException iterating over partitions #1252 (Thanks to @johnny-costanzo)
+* Replayed activation commands may fail because of their execution sequence #1255 (Thanks to @robertvazan)
+* Fix infinite command timeout #1260
+* Connection leak using pingBeforeActivateConnection when PING fails #1262 (Thanks to @johnny-costanzo)
+* Lettuce blocked when connecting to Redis #1269 (Thanks to @jbyjby1)
+* Stream commands are not considered for ReadOnly routing #1271 (Thanks to @redviper)
Other
-------
-* Switch remaining tests to AssertJ #13
-* Promote 4.x branch to main branch #155
-* Add Wiki documentation for disconnectedBehavior option in ClientOptions #188
-* Switch travis-ci to container build #203
-* Refactor Makefile #207
-* Code cleanups #215
-* Reduce Google Guava usage #217
-* Improve contribution assets #219
-* Ensure OSGi compatibility #232
-* Upgrade netty to 4.0.36.Final #238
-
-lettuce requires a minimum of Java 8 to build and run. It is tested continuously
-against the latest Redis source-build.
-
-If you need any support, meet lettuce at
-
-* Google Group: https://groups.google.com/d/forum/lettuce-redis-client-users
-or lettuce-redis-client-users@googlegroups.com
-* Join the chat at https://gitter.im/mp911de/lettuce
-* Github Issues: https://github.com/mp911de/lettuce/issues
-* Wiki: https://github.com/mp911de/lettuce/wiki
\ No newline at end of file
+-----
+* Refactor script content argument types to String and byte[] instead of V (value type) #1010 (Thanks to @danielsomekh)
+* Render Redis.toString() to a Redis URI #1040
+* Pass Allocator as RedisStateMachine constructor argument #1053
+* Simplify condition to invoke "resolveCodec" method in AnnotationRedisCodecResolver #1149 (Thanks to @machi1990)
+* Encode database in RedisURI in path when possible #1155
+* Remove LettuceCharsets #1156
+* Move SocketAddress resolution from RedisURI to SocketAddressResolver #1157
+* Remove deprecated timeout methods accepting TimeUnit #1158
+* Upgrade to RxJava 2.2.13 #1162
+* Add ByteBuf.touch(…) to aid buffer leak investigation #1164
+* Add warning log if MasterReplica(…, Iterable) contains multiple Sentinel URIs #1165
+* Adapt GEOHASH tests to 10 chars #1196
+* Migrate Master/Replica support to the appropriate package #1199
+* Disable RedisURIBuilderUnitTests failing on Windows OS #1204 (Thanks to @kshchepanovskyi)
+* Provide a default port(DEFAULT_REDIS_PORT) to RedisURI's Builder #1205 (Thanks to @hepin1989)
+* Update code for pub/sub to listen on the stateful connection object. #1207 (Thanks to @judepereira)
+* Un-deprecate ClientOptions.pingBeforeActivateConnection #1208
+* Use consistently a shutdown timeout of 2 seconds in all AbstractRedisClient.shutdown methods #1214
+* Upgrade dependencies (netty to 4.1.49.Final) #1161, #1224, #1225, #1239, #1259
+* RedisURI class does not parse password when using redis-sentinel #1232 (Thanks to @kyrogue)
+* Reduce log level to DEBUG for native library logging #1238 (Thanks to @DevJoey)
+* Reduce visibility of fields in AbstractRedisClient #1241
+* Upgrade to stunnel 5.56 #1246
+* Add build profiles for multiple Java versions #1247
+* Replace outdated Sonatype parent POM with plugin definitions #1258
+* Upgrade to RxJava 3.0.2 #1261
+* Enable Sentinel tests after Redis fixes RESP3 handshake #1266
+* Consolidate exception translation and bubbling #1275
+* Reduce min thread count to 2 #1278
diff --git a/formatting.xml b/formatting.xml
index ff57cdcb77..4128eb0641 100644
--- a/formatting.xml
+++ b/formatting.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/pom.xml b/pom.xml
index 39a4341d7e..b5cd481738 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,325 +1,819 @@
4.0.0
-
- org.sonatype.oss
- oss-parent
- 9
-
-
- biz.paluch.redis
- lettuce
- 4.3.0-SNAPSHOT
+ io.lettuce
+ lettuce-core
+ 6.0.0.BUILD-SNAPSHOT
jar
- lettuce
- http://github.com/mp911de/lettuce/wiki
+ Lettuce
+
Advanced and thread-safe Java Redis client for synchronous, asynchronous, and
reactive usage. Supports Cluster, Sentinel, Pipelining, Auto-Reconnect, Codecs
and much more.
+ http://github.com/lettuce-io/lettuce-core
+
+
+ lettuce.io
+ https://lettuce.io
+
+
Apache License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
+ https://www.apache.org/licenses/LICENSE-2.0.txt
repo
Travis CI
- https://travis-ci.org/mp911de/lettuce
+ https://travis-ci.org/lettuce-io/lettuce-core
Github
- https://github.com/mp911de/lettuce/issues
+ https://github.com/lettuce-io/lettuce-core/issues
-
- will
- Will Glozer
-
mp911de
Mark Paluch
+
+ will
+ Will Glozer
+
+ 3.16.1
+ 2.0.SP1
+ 5.11.2
+ 3.10
+ 2.8.0
+ 1.3.2
+ 3.1.0
+ 4.13
+ 5.6.2
+ 2.2
+ 2.1.12
+ 2.0.3
+ 2.13.3
+ 3.3.3
+ 4.1.50.Final
+ 2.0.16
+ 3.3.6.RELEASE
+ 1.3.8
+ 1.2.1
+ 2.2.19
+ 3.0.4
+ 1.0.3
+ 1.7.25
+ 4.3.26.RELEASE
+
UTF-8
-
- true
- true
- true
- 4.2.2.Final
- 3.5.0.Final
- 4.1.4.Final
+ true
+
- scm:git:https://github.com/mp911de/lettuce.git
- scm:git:https://github.com/mp911de/lettuce.git
- http://github.com/mp911de/lettuce
-
-
-
- 3.0
-
+ scm:git:https://github.com/lettuce-io/lettuce-core.git
+ scm:git:https://github.com/lettuce-io/lettuce-core.git
+ http://github.com/lettuce-io/lettuce-core
+ HEAD
+
+
+
+
+ sonatype-nexus-snapshots
+ Sonatype Nexus Snapshots
+ https://oss.sonatype.org/content/repositories/snapshots/
+
+
+ sonatype-nexus-staging
+ Nexus Release Repository
+ https://oss.sonatype.org/service/local/staging/deploy/maven2/
+
+
+
+
+
+
+
+ io.netty
+ netty-bom
+ ${netty.version}
+ pom
+ import
+
+
+
+ org.springframework
+ spring-framework-bom
+ ${spring.version}
+ pom
+ import
+
+
+
+ io.zipkin.brave
+ brave-bom
+ ${brave.version}
+ pom
+ import
+
+
+
+ org.junit
+ junit-bom
+ ${junit5.version}
+ pom
+ import
+
+
+
+ org.apache.logging.log4j
+ log4j-bom
+ ${log4j2-version}
+ pom
+ import
+
+
+
+
-
+
- io.reactivex
- rxjava
- 1.1.9
+ io.netty
+ netty-common
-
io.netty
- netty-common
- ${netty-version}
+ netty-handler
io.netty
netty-transport
- ${netty-version}
- io.netty
- netty-handler
- ${netty-version}
+ io.projectreactor
+ reactor-core
+ ${reactor.version}
+
+
+
+
- io.netty
- netty-transport-native-epoll
- ${netty-version}
- linux-x86_64
- provided
+ org.apache.commons
+ commons-pool2
+ ${commons-pool.version}
true
io.netty
netty-tcnative
- 1.1.33.Fork20
+ 2.0.30.Final
${os.detected.classifier}
- provided
+ true
+
+
+
+
+
+ io.netty
+ netty-transport-native-epoll
+ linux-x86_64
true
- com.google.guava
- guava
- 18.0
+ io.netty
+ netty-transport-native-kqueue
+ osx-x86_64
+ true
+
+
- org.apache.commons
- commons-pool2
- 2.4.2
+ io.zipkin.brave
+ brave
true
org.latencyutils
LatencyUtils
- 2.0.3
+ ${latencyutils.version}
+ true
+
+
+
+ org.hdrhistogram
+ HdrHistogram
+ ${hdr-histogram-version}
+ true
+
+
+
+
+
+ io.reactivex
+ rxjava
+ ${rxjava.version}
+ true
+
+
+
+ io.reactivex
+ rxjava-reactive-streams
+ ${rxjava-reactive-streams.version}
+ true
+
+
+
+ io.reactivex.rxjava2
+ rxjava
+ ${rxjava2.version}
true
-
+
+ io.reactivex.rxjava3
+ rxjava
+ ${rxjava3.version}
+ true
+
org.springframework
spring-beans
- 4.2.4.RELEASE
- provided
+ true
+
+
+ commons-logging
+ commons-logging
+
+
org.springframework
spring-context
- 4.2.4.RELEASE
- provided
+ true
- javax.inject
- javax.inject
- 1
- provided
+ javax.enterprise
+ cdi-api
+ ${cdi-api.version}
+ true
- javax.enterprise
- cdi-api
- 1.0
- provided
+ javax.inject
+ javax.inject
+ 1
+ true
com.google.code.findbugs
jsr305
- 3.0.1
- provided
+ 3.0.2
true
+
+
- junit
- junit
- 4.12
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
test
-
+
- com.googlecode.multithreadedtc
- multithreadedtc
- 1.01
+ org.hamcrest
+ hamcrest-library
+ ${hamcrest-library.version}
test
- org.mockito
- mockito-core
- 1.10.19
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
test
- com.google.code.tempus-fugit
- tempus-fugit
- 1.1
+ com.github.javaparser
+ javaparser-core
+ 3.6.3
+ test
+
+
+
+
+
+ org.apache.openwebbeans
+ openwebbeans-se
+ ${openwebbeans.version}
test
- org.apache.openwebbeans.test
- cditest-owb
- 1.2.8
+ javax.annotation
+ javax.annotation-api
+ ${javax.annotation-api.version}
test
javax.servlet
javax.servlet-api
- 3.1.0
+ ${javax.servlet-api.version}
test
+
+
- org.assertj
- assertj-core
- 3.2.0
+ junit
+ junit
+ ${junit4.version}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-params
test
+
+
org.apache.logging.log4j
log4j-core
- 2.6.2
test
org.apache.logging.log4j
log4j-slf4j-impl
- 2.6.2
test
- org.springframework
- spring-test
- 4.2.4.RELEASE
+ org.slf4j
+ jcl-over-slf4j
+ ${slf4j.version}
+ test
+
+
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.version}
+ test
+
+
+
+ com.googlecode.multithreadedtc
+ multithreadedtc
+ 1.01
+ test
+
+
+
+ org.reactivestreams
+ reactive-streams-tck
+ ${reactive-streams-tck.version}
+ test
+
+
+
+ io.projectreactor
+ reactor-test
+ ${reactor.version}
test
org.springframework
- spring-expression
- 4.2.4.RELEASE
+ spring-core
test
- org.hamcrest
- hamcrest-library
- 1.3
+ org.springframework
+ spring-aop
test
- com.github.javaparser
- javaparser-core
- 2.3.0
+ org.springframework
+ spring-test
test
- org.apache.commons
- commons-lang3
- 3.4
+ org.springframework
+ spring-expression
+ ${spring.version}
test
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ 1.6.2
+
+
+
+
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+ 1.2.2
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 3.3.0
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.2.0
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+ 1.6
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.2.0
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+ 2.5.3
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M4
+
+
+ org.apache.maven.surefire
+ surefire-junit-platform
+ 3.0.0-M4
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+ 3.0.0-M4
+
+
+ org.apache.maven.surefire
+ surefire-junit-platform
+ 3.0.0-M4
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+ 3.2.1
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ 3.1.0
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.0.0
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.5
+
+
+
+ net.nicoulaj.maven.plugins
+ checksum-maven-plugin
+ 1.9
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+
+
+ flatten
+ process-resources
+
+ flatten
+
+
+ true
+ oss
+
+ remove
+ remove
+ remove
+ remove
+
+
+
+
+ flatten-clean
+ clean
+
+ clean
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ -Xlint:all,-deprecation,-unchecked
+ -Xlint:none
+ true
+ false
+
+ 1.8
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ true
+ true
+
+
+ lettuce.core
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ 4
+
+
+ **/*UnitTests
+ **/*Tests
+
+
+ **/*Test
+ **/*IntegrationTests
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-failsafe-plugin
+
+
+ 4
+
+
+ **/*IntegrationTests
+ **/*Test
+
+
+ **/*UnitTests
+
+
+
+
+
+ integration-test
+
+ integration-test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-release-plugin
+
+ sonatype-oss-release,documentation
+ deploy
+ true
+ @{project.version}
+
+
+
+
+ org.apache.maven.plugins
+ maven-source-plugin
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+
+ org.jacoco
+ jacoco-maven-plugin
+
+
+ prepare-agent
+
+ prepare-agent
+
+
+
+
+
+
+
+
- netty-40
-
- 4.0.40.Final
-
-
-
- netty-41
+ ci
+
sonatype-oss-release
+
+
org.apache.maven.plugins
- maven-assembly-plugin
- 2.4
+ maven-javadoc-plugin
- src
- package
+ attach-javadocs
- single
+ jar
+
+
+
+
+ public
+ true
+
+ src/main/javadoc/stylesheet.css
+
+ https://netty.io/4.1/api/
+ https://commons.apache.org/proper/commons-pool/api-2.7.0/
+ http://reactivex.io/RxJava/1.x/javadoc/
+ http://reactivex.io/RxJava/javadoc/
+ https://projectreactor.io/docs/core/release/api/
+ https://docs.spring.io/spring/docs/current/javadoc-api/
+
+ none
+ true
+
+
+ generated
+ a
+ Generated class:
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-gpg-plugin
+
+
+ sign-artifacts
+ verify
+
+ sign
-
- ${project.artifactId}-${project.version}
-
- src/assembly/src.xml
-
- gnu
- false
-
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
bin
- ${project.artifactId}-${project.version}
src/assembly/bin.xml
@@ -335,9 +829,8 @@
- net.ju-n.maven.plugins
+ net.nicoulaj.maven.plugins
checksum-maven-plugin
- 1.2
MD5
@@ -377,39 +870,47 @@
+
+
jmh
org.openjdk.jmh
jmh-core
- 1.11.3
+ 1.21
test
org.openjdk.jmh
jmh-generator-annprocess
- 1.11.3
+ 1.21
test
-
-
- src/test/resources
-
-
+
+ maven-surefire-plugin
+
+ true
+
+
+
+ maven-failsafe-plugin
+
+ true
+
+
org.codehaus.mojo
build-helper-maven-plugin
- 1.7
add-source
- generate-sources
+ generate-test-sources
add-test-source
@@ -427,7 +928,7 @@
run-benchmarks
- process-test-resources
+ test
exec
@@ -435,10 +936,25 @@
java
test
+ -Xmx2G
-classpath
org.openjdk.jmh.Main
.*
+ -tu
+ ns
+ -f
+ 1
+ -wi
+ 10
+ -w
+ 1
+ -r
+ 1
+ -i
+ 10
+ -bm
+ avgt
@@ -447,265 +963,156 @@
-
-
+
-
-
- kr.motd.maven
- os-maven-plugin
- 1.4.0.Final
-
-
+ no-install
-
+
+ true
+ true
+
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.1
-
- -Xlint:all,-deprecation,-unchecked
- -Xlint:none
- true
- false
-
- 1.8
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+ false
+
+
+
+
+
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- 2.9.1
-
-
- attach-javadocs
-
- jar
-
-
-
-
- public
-
- http://netty.io/4.0/api/
- http://commons.apache.org/proper/commons-pool/api-2.4.2/
- http://docs.guava-libraries.googlecode.com/git/javadoc/
- http://reactivex.io/RxJava/javadoc/
-
- -Xdoclint:all -Xdoclint:-html -Xdoclint:-syntax
-
-
- generated
- a
- Generated class:
-
-
-
-
+
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.17
-
-
- 4
-
-
-
+ documentation
-
- org.apache.maven.plugins
- maven-release-plugin
- 2.5
-
- sonatype-oss-release
- -DskipSigning=false
- deploy
- true
- @{project.version}
-
-
+
-
- org.apache.maven.plugins
- maven-gpg-plugin
- 1.5
-
- ${skipSigning}
-
-
-
- sign-artifacts
- verify
-
- sign
-
-
-
-
+
-
- org.apache.maven.plugins
- maven-source-plugin
- 2.3
-
-
- attach-sources
-
- jar
-
-
-
-
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
-
- org.eluder.coveralls
- coveralls-maven-plugin
- 3.1.0
-
+
+ rename-reference-docs
+ process-resources
+
+
+
+
+
+
+ run
+
+
-
- org.jacoco
- jacoco-maven-plugin
- 0.7.5.201505241946
-
-
- prepare-agent
-
- prepare-agent
-
-
-
-
+
+
-
- org.apache.maven.plugins
- maven-site-plugin
- 3.4
-
- false
-
-
-
- org.apache.maven.doxia
- doxia-module-markdown
- 1.6
-
-
- org.apache.maven.scm
- maven-scm-provider-gitexe
- 1.9
-
-
-
+
+ org.asciidoctor
+ asciidoctor-maven-plugin
+ 2.0.0-RC.1
+
+
+ org.asciidoctor
+ asciidoctorj-pdf
+ 1.5.0-beta.5
+
+
+
-
- org.apache.maven.plugins
- maven-scm-publish-plugin
- 1.1
-
- gh-pages
- ${project.build.directory}/site
- ${github.site.upload.skip}
- true
- scm:git:ssh://git@github.com/mp911de/redis.paluch.biz.git
- apidocs/**
-
-
+
+ html
+ generate-resources
+
+ process-asciidoc
+
+
+ html5
+ ${project.build.directory}/site/reference/html
+
+ book
+
+ true
+ true
+ stylesheets
+ golo.css
+
+
+
+
+
+ pdf
+ generate-resources
+
+ process-asciidoc
+
+
+ pdf
+
+
+
+
-
- org.apache.maven.plugins
- maven-shade-plugin
- 2.3
-
-
- package
-
- shade
-
-
-
- com.google.guava:guava
-
- com/google/common/escape/**
- com/google/common/eventbus/**
- com/google/common/hash/**
- com/google/common/html/**
- com/google/common/math/**
- com/google/common/xml/**
-
-
-
-
-
-
- rx
- com.lambdaworks.rx
-
-
-
- com.google
- com.lambdaworks.com.google
-
-
-
- org.HdrHistogram
- com.lambdaworks.org.HdrHistogram
-
-
-
- org.LatencyUtils
- com.lambdaworks.org.LatencyUtils
-
-
-
- org.apache.commons.pool2
- com.lambdaworks.org.apache.commons.pool2
-
-
-
- io
- com.lambdaworks.io
-
-
- false
- true
+ src/main/asciidoc
+ index.asciidoc
+ book
+
+ ${project.version}
+ true
+ 3
+ true
+ https://raw.githubusercontent.com/wiki/lettuce-io/lettuce-core/
+
+
+
+ font
+ coderay
+
-
-
-
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ docs
+ package
+
+ single
+
+
+
+ src/assembly/docs.xml
+
+ gnu
+ true
+
+
+
+
+
+
+
+
+
+
-
-
-
- org.apache.maven.plugins
- maven-project-info-reports-plugin
- 2.7
-
-
-
- index
- plugin-management
- distribution-management
- dependency-info
- dependencies
- scm
- issue-tracking
- cim
- dependency-management
- project-team
- summary
-
-
-
-
-
-
diff --git a/prepare-apidocs-upload.sh b/prepare-apidocs-upload.sh
deleted file mode 100755
index 90e5448c8c..0000000000
--- a/prepare-apidocs-upload.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-VERSION=$(xpath -e "/project/version" pom.xml 2>/dev/null | sed 's///g;s/<\/version>//g')
-
-if [[ "" == "${VERSION}" ]]
-then
- echo "Cannot determine version"
- exit 1
-fi
-
-BASE=target/redis.paluch.biz
-TARGET_BASE=/docs/api/releases/
-
-git clone https://github.com/mp911de/redis.paluch.biz.git ${BASE}
-cd ${BASE} && git checkout gh-pages && cd ../..
-
-if [[ ${VERSION} == *"SNAPSHOT"* ]]
-then
- TARGET_BASE=/docs/api/snapshots/
-fi
-
-TARGET_DIR=${BASE}${TARGET_BASE}${VERSION}
-
-mkdir -p ${TARGET_DIR}
-
-cp -R target/site/apidocs/* ${TARGET_DIR}
-
-cd ${BASE}
-git add .
-git commit -m "Generated API docs"
-
diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml
index a65ed2ad90..2365757bfb 100644
--- a/src/assembly/bin.xml
+++ b/src/assembly/bin.xml
@@ -12,27 +12,17 @@
- biz.paluch.redis:lettuce:jar:${project.version}
- biz.paluch.redis:lettuce:jar:shaded:${project.version}
+ io.lettuce:lettuce-core:jar:${project.version}
-
false
true
true
- io.netty:netty-transport-native-epoll
-
- provided
- dependencies
- false
-
-
-
- io.reactivex:*
io.netty:*
- com.google.guava:*
+ io.projectreactor:*
+ org.reactivestreams:reactive-streams:*
org.apache.commons:*
org.latencyutils:*
org.hdrhistogram:*
@@ -42,9 +32,9 @@
- biz.paluch.redis:lettuce:*:javadoc
+ io.lettuce:lettuce-core:*:javadoc
- apidocs
+ docs/apidocs
true
false
true
@@ -59,5 +49,9 @@
RELEASE-NOTES.md
+
+ ${project.build.directory}/site/reference
+ docs/reference
+
diff --git a/src/assembly/docs.xml b/src/assembly/docs.xml
new file mode 100644
index 0000000000..60d345f53e
--- /dev/null
+++ b/src/assembly/docs.xml
@@ -0,0 +1,17 @@
+
+
+ docs
+
+ zip
+
+ /
+
+
+ ${project.build.directory}/site/reference/html
+
+ true
+
+
+
diff --git a/src/assembly/src.xml b/src/assembly/src.xml
deleted file mode 100644
index 739ade2591..0000000000
--- a/src/assembly/src.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
- src
-
- zip
- tar.gz
-
- ${project.version}-${project.version}-src
-
-
- src/main/java
- /
- true
-
-
- src/main/resources
- /
- true
-
-
-
\ No newline at end of file
diff --git a/src/main/asciidoc/advanced-usage.asciidoc b/src/main/asciidoc/advanced-usage.asciidoc
new file mode 100644
index 0000000000..1b46f997a4
--- /dev/null
+++ b/src/main/asciidoc/advanced-usage.asciidoc
@@ -0,0 +1,50 @@
+:auto-reconnect-link: <>
+:client-options-link: <>
+:client-resources-link: <>
+
+:custom-commands-command-output-link: <>
+:custom-commands-command-exec-model-link: <>
+
+[[advanced-usage]]
+== Advanced usage
+
+[[client-resources]]
+=== Configuring Client resources
+include::{ext-doc}/Configuring-Client-resources.asciidoc[leveloffset=+2]
+
+[[client-options]]
+=== Client Options
+include::{ext-doc}/Client-Options.asciidoc[leveloffset=+2]
+
+[[ssl]]
+=== SSL Connections
+include::{ext-doc}/SSL-Connections.asciidoc[leveloffset=+2]
+
+[[native-transports]]
+=== Native Transports
+include::{ext-doc}/Native-Transports.asciidoc[leveloffset=+2]
+
+[[unix-domain-sockets]]
+=== Unix Domain Sockets
+include::{ext-doc}/Unix-Domain-Sockets.asciidoc[leveloffset=+2]
+
+[[streaming-api]]
+=== Streaming API
+include::{ext-doc}/Streaming-API.asciidoc[leveloffset=+1]
+
+[[events]]
+=== Events
+include::{ext-doc}/Connection-Events.asciidoc[leveloffset=+2]
+
+=== Pipelining and command flushing
+include::{ext-doc}/Pipelining-and-command-flushing.asciidoc[leveloffset=+2]
+
+=== Connection Pooling
+include::{ext-doc}/Connection-Pooling-5.1.asciidoc[leveloffset=+2]
+
+=== Custom commands
+include::{ext-doc}/Custom-commands%2C-outputs-and-command-mechanics.asciidoc[leveloffset=+2]
+
+[[command-execution-reliability]]
+=== Command execution reliability
+include::{ext-doc}/Command-execution-reliability.asciidoc[leveloffset=+2]
diff --git a/src/main/asciidoc/faq.asciidoc b/src/main/asciidoc/faq.asciidoc
new file mode 100644
index 0000000000..1793a75438
--- /dev/null
+++ b/src/main/asciidoc/faq.asciidoc
@@ -0,0 +1,5 @@
+:client-options-link: <>
+
+[[faq]]
+== Frequently Asked Questions
+include::{ext-doc}/Frequently-Asked-Questions.asciidoc[leveloffset=+1]
diff --git a/src/main/asciidoc/getting-started.asciidoc b/src/main/asciidoc/getting-started.asciidoc
new file mode 100644
index 0000000000..6cbfcec23a
--- /dev/null
+++ b/src/main/asciidoc/getting-started.asciidoc
@@ -0,0 +1,34 @@
+:ssl-link: <>
+:uds-link: <>
+:native-transport-link: <>
+:basic-synchronous-link: <>
+:asynchronous-api-link: <>
+:reactive-api-link: <>
+:asynchronous-link: <>
+:reactive-link: <>
+
+[[getting-started]]
+== Getting Started
+include::{ext-doc}/Getting-started-%285.0%29.asciidoc[leveloffset=+1]
+
+[[connecting-redis]]
+== Connecting Redis
+include::{ext-doc}/Redis-URI-and-connection-details.asciidoc[]
+
+[[basic-usage]]
+=== Basic Usage
+include::{ext-doc}/Basic-usage.asciidoc[leveloffset=+1]
+
+[[asynchronous-api]]
+=== Asynchronous API
+include::{ext-doc}/Asynchronous-API.asciidoc[leveloffset=+2]
+
+[[reactive-api]]
+=== Reactive API
+include::{ext-doc}/Reactive-API-%285.0%29.asciidoc[leveloffset=+2]
+
+=== Publish/Subscribe
+include::{ext-doc}/Pub-Sub.asciidoc[leveloffset=+1]
+
+=== Transactions/Multi
+include::{ext-doc}/Transactions.asciidoc[leveloffset=+1]
diff --git a/src/main/asciidoc/ha-sharding.asciidoc b/src/main/asciidoc/ha-sharding.asciidoc
new file mode 100644
index 0000000000..2036343b95
--- /dev/null
+++ b/src/main/asciidoc/ha-sharding.asciidoc
@@ -0,0 +1,27 @@
+:redis-sentinel-link: <>
+:master-replica-api-link: <>
+:cco-up-to-5-times: <>
+:cco-link: <>
+:cco-periodic-link: <>
+:cco-adaptive-link: <>
+
+[[ha-sharding]]
+== High-Availability and Sharding
+
+[[master-slave]]
+[[master-replica]]
+=== Master/Replica
+include::{ext-doc}/Master-Replica.asciidoc[leveloffset=+2]
+
+[[redis-sentinel]]
+=== Redis Sentinel
+include::{ext-doc}/Redis-Sentinel.asciidoc[leveloffset=+2]
+
+[[redis-cluster]]
+=== Redis Cluster
+include::{ext-doc}/Redis-Cluster.asciidoc[leveloffset=+2]
+
+[[readfrom-settings]]
+=== ReadFrom Settings
+include::{ext-doc}/ReadFrom-Settings.asciidoc[leveloffset=+2]
+
diff --git a/src/main/asciidoc/images/apple-touch-icon-144.png b/src/main/asciidoc/images/apple-touch-icon-144.png
new file mode 100644
index 0000000000..8adb9fff09
Binary files /dev/null and b/src/main/asciidoc/images/apple-touch-icon-144.png differ
diff --git a/src/main/asciidoc/images/apple-touch-icon-180.png b/src/main/asciidoc/images/apple-touch-icon-180.png
new file mode 100644
index 0000000000..d0928b5316
Binary files /dev/null and b/src/main/asciidoc/images/apple-touch-icon-180.png differ
diff --git a/src/main/asciidoc/images/lettuce-green-text@2x.png b/src/main/asciidoc/images/lettuce-green-text@2x.png
new file mode 100644
index 0000000000..adff15525a
Binary files /dev/null and b/src/main/asciidoc/images/lettuce-green-text@2x.png differ
diff --git a/src/main/asciidoc/images/touch-icon-192x192.png b/src/main/asciidoc/images/touch-icon-192x192.png
new file mode 100644
index 0000000000..450da57d8a
Binary files /dev/null and b/src/main/asciidoc/images/touch-icon-192x192.png differ
diff --git a/src/main/asciidoc/index-docinfo.html b/src/main/asciidoc/index-docinfo.html
new file mode 100644
index 0000000000..d47a3c38a1
--- /dev/null
+++ b/src/main/asciidoc/index-docinfo.html
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/asciidoc/index.asciidoc b/src/main/asciidoc/index.asciidoc
new file mode 100644
index 0000000000..d469f672fa
--- /dev/null
+++ b/src/main/asciidoc/index.asciidoc
@@ -0,0 +1,33 @@
+= Lettuce Reference Guide
+Mark Paluch ;
+:ext-doc: https://raw.githubusercontent.com/wiki/lettuce-io/lettuce-core
+{version}
+:doctype: book
+:icons: font
+:toc:
+:sectnums:
+:sectanchors:
+:docinfo:
+ifdef::backend-pdf[]
+:title-logo-image: images/lettuce-green-text@2x.png
+endif::[]
+
+ifdef::backend-html5[]
+image::lettuce-green-text@2x.png[width=50%,link=https://lettuce.io]
+endif::[]
+
+include::overview.asciidoc[]
+
+include::new-features.adoc[leveloffset=+1]
+
+include::getting-started.asciidoc[]
+
+include::ha-sharding.asciidoc[]
+
+include::redis-command-interfaces.asciidoc[]
+
+include::advanced-usage.asciidoc[]
+
+include::integration-extension.asciidoc[]
+
+include::faq.asciidoc[]
diff --git a/src/main/asciidoc/integration-extension.asciidoc b/src/main/asciidoc/integration-extension.asciidoc
new file mode 100644
index 0000000000..b66fccd3cc
--- /dev/null
+++ b/src/main/asciidoc/integration-extension.asciidoc
@@ -0,0 +1,15 @@
+[[integration-extension]]
+== Integration and Extension
+
+[[codecs]]
+=== Codecs
+include::{ext-doc}/Codecs.asciidoc[leveloffset=+1]
+
+[[cdi-support]]
+=== CDI Support
+include::{ext-doc}/CDI-Support.asciidoc[leveloffset=+1]
+
+[[spring-support]]
+=== Spring Support
+include::{ext-doc}/Spring-Support.asciidoc[leveloffset=+1]
+
diff --git a/src/main/asciidoc/new-features.adoc b/src/main/asciidoc/new-features.adoc
new file mode 100644
index 0000000000..e26e4cf222
--- /dev/null
+++ b/src/main/asciidoc/new-features.adoc
@@ -0,0 +1,58 @@
+[[new-features]]
+= New & Noteworthy
+
+[[new-features.6-0-0]]
+== What's new in Lettuce 6.0
+
+* Support for RESP3 usage with Redis 6 along with RESP2/RESP3 handshake and protocol version discovery.
+* ACL authentication using username and password or password-only authentication.
+* Cluster topology refresh is now non-blocking.
+* RxJava 3 support.
+* Refined Scripting API accepting the Lua script either as `byte[]` or `String`.
+* Connection and Queue failures now no longer throw an exception but properly associate the failure with the Future handle.
+* Removal of deprecated API including timeout methods accepting `TimeUnit`.
+Use methods accepting `Duration` instead.
+* Lots of internal refinements.
+
+[[new-features.5-3-0]]
+== What's new in Lettuce 5.3
+
+* Improved SSL configuration supporting Cipher suite selection and PEM-encoded certificates.
+* Fixed method signature for `randomkey()`.
+* Un-deprecated `ClientOptions.pingBeforeActivateConnection` to allow connection verification during connection handshake.
+
+[[new-features.5-2-0]]
+== What's new in Lettuce 5.2
+
+* Allow randomization of read candidates using Redis Cluster.
+* SSL support for Redis Sentinel.
+
+[[new-features.5-1-0]]
+== What's new in Lettuce 5.1
+
+* Add support for `ZPOPMIN`, `ZPOPMAX`, `BZPOPMIN`, `BZPOPMAX` commands.
+* Add support for Redis Command Tracing through Brave, see <>.
+* Add support for https://redis.io/topics/streams-intro[Redis Streams].
+* Asynchronous `connect()` for Master/Replica connections.
+* <> through `AsyncConnectionPoolSupport` and `AsyncPool`.
+* Dedicated exceptions for Redis `LOADING`, `BUSY`, and `NOSCRIPT` responses.
+* Commands in at-most-once mode (auto-reconnect disabled) are now canceled already on disconnect.
+* Global command timeouts (also for reactive and asynchronous API usage) configurable through <>.
+* Host and port mappers for Lettuce usage behind connection tunnels/proxies through `SocketAddressResolver`, see <>.
+* `SCRIPT LOAD` dispatch to all cluster nodes when issued through `RedisAdvancedClusterCommands`.
+* Reactive `ScanStream` to iterate over the keyspace using `SCAN` commands.
+* Transactions using Master/Replica connections are bound to the master node.
+
+[[new-features.5-0-0]]
+== What's new in Lettuce 5.0
+
+* New artifact coordinates: `io.lettuce:lettuce-core` and packages moved from `com.lambdaworks.redis` to `io.lettuce.core`.
+* <> now Reactive Streams-based using https://projectreactor.io/[Project Reactor].
+* <> supporting dynamic command invocation and Redis Modules.
+* Enhanced, immutable Key-Value objects.
+* Asynchronous Cluster connect.
+* Native transport support for Kqueue on macOS systems.
+* Removal of support for Guava.
+* Removal of deprecated `RedisConnection` and `RedisAsyncConnection` interfaces.
+* Java 9 compatibility.
+* HTML and PDF reference documentation along with a new project website: https://lettuce.io.
diff --git a/src/main/asciidoc/overview.asciidoc b/src/main/asciidoc/overview.asciidoc
new file mode 100644
index 0000000000..fed5868d26
--- /dev/null
+++ b/src/main/asciidoc/overview.asciidoc
@@ -0,0 +1,75 @@
+[[overview]]
+== Overview
+
+This document is the reference guide for Lettuce. It explains how to use Lettuce, its concepts, semantics, and the syntax.
+
+You can read this reference guide in a linear fashion, or you can skip sections if something does not interest you.
+
+This section provides some basic introduction to Redis. The rest of the document refers only to Lettuce features and assumes the user is familiar with Redis concepts.
+
+[[overview.redis]]
+=== Knowing Redis
+NoSQL stores have taken the storage world by storm. It is a vast domain with a plethora of solutions, terms and patterns (to make things worse even the term itself has multiple http://www.google.com/search?q=nosql+acronym[meanings]). While some of the principles are common, it is crucial that the user is familiar to some degree with Redis. The best way to get acquainted to this solutions is to read their documentation and follow their documentation - it usually doesn't take more then 5-10 minutes to go through them and if you are coming from an RDMBS-only background many times these exercises can be an eye opener.
+
+The jumping off ground for learning about Redis is http://www.redis.io/[redis.io]. Here is a list of other useful resources:
+
+* The http://try.redis.io/[interactive tutorial] introduces Redis.
+* The http://redis.io/commands[command references] explains Redis commands and contains links to getting started guides, reference documentation and tutorials.
+
+=== Project Reactor
+
+https://projectreactor.io[Reactor] is a highly optimized reactive library for building efficient, non-blocking
+applications on the JVM based on the https://github.com/reactive-streams/reactive-streams-jvm[Reactive Streams Specification].
+Reactor based applications can sustain very high throughput message rates and operate with a very low memory footprint,
+making it suitable for building efficient event-driven applications using the microservices architecture.
+
+Reactor implements two publishers https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html[Flux] and
+https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html[Mono], both of which support non-blocking back-pressure.
+This enables exchange of data between threads with well-defined memory usage, avoiding unnecessary intermediate buffering or blocking.
+
+=== Non-blocking API for Redis
+
+Lettuce is a scalable thread-safe Redis client based on http://netty.io[netty] and Reactor. Lettuce provides <>, <> and <> APIs to interact with Redis.
+
+[[overview.requirements]]
+=== Requirements
+
+Lettuce 4.x and 5.x binaries require JDK level 8.0 and above.
+
+In terms of http://redis.io/[Redis], at least 2.6.
+
+=== Additional Help Resources
+
+Learning a new framework is not always straight forward. In this section, we try to provide what we think is an easy to follow guide for starting with Lettuce. However, if you encounter issues or you are just looking for an advice, feel free to use one of the links below:
+
+[[overview.support]]
+==== Support
+
+There are a few support options available:
+
+ * Lettuce on Stackoverflow http://stackoverflow.com/questions/tagged/lettuce[Stackoverflow] is a tag for all Lettuce users to share information and help each other. Note that registration is needed *only* for posting.
+ * Get in touch with the community on https://gitter.im/lettuce-io/Lobby[Gitter].
+ * Google Group: https://groups.google.com/d/forum/lettuce-redis-client-users[lettuce-redis-client-users] or mailto:lettuce-redis-client-users@googlegroups.com[lettuce-redis-client-users@googlegroups.com].
+ * Report bugs (or ask questions) in Github issues https://github.com/lettuce-io/lettuce-core/issues.
+
+[[overview.development]]
+==== Following Development
+
+For information on the Lettuce source code repository, nightly builds and snapshot artifacts please see the https://lettuce.io[Lettuce homepage]. You can help make lettuce best serve the needs of the lettuce community by interacting with developers through the Community on http://stackoverflow.com/questions/tagged/lettuce[Stackoverflow]. To follow developer activity look for the mailing list information on the https://lettuce.io[lettuce homepage]. If you encounter a bug or want to suggest an improvement, please create a ticket on the lettuce issue https://github.com/lettuce-io/lettuce-core/issues[tracker].
+
+==== Project Metadata
+
+* Version Control – https://github.com/lettuce-io/lettuce-core
+* Releases and Binary Packages – https://github.com/lettuce-io/lettuce-core/releases
+* Issue tracker – https://github.com/lettuce-io/lettuce-core/issues
+* Release repository – https://repo1.maven.org/maven2/ (Maven Central)
+* Snapshot repository – https://oss.sonatype.org/content/repositories/snapshots/ (OSS Sonatype Snapshots)
+
+=== Where to go from here
+ * Head to <> if you feel like jumping straight into the code.
+ * Go to <> for Master/Replica, Redis Sentinel and Redis Cluster topics.
+ * In order to dig deeper into the core features of Reactor:
+ ** If you’re looking for client configuration options, performance related behavior and how to use various transports, go to <>.
+ ** See <> for extending Lettuce with codecs or integrate it in your CDI/Spring application.
+ ** You want to know more about *at-least-once* and *at-most-once*? Take a look into <>.
+
diff --git a/src/main/asciidoc/redis-command-interfaces.asciidoc b/src/main/asciidoc/redis-command-interfaces.asciidoc
new file mode 100644
index 0000000000..ae5b750bf6
--- /dev/null
+++ b/src/main/asciidoc/redis-command-interfaces.asciidoc
@@ -0,0 +1,4 @@
+
+[[redis-command-interfaces]]
+include::{ext-doc}/Redis-Command-Interfaces.asciidoc[leveloffset=+1]
+
diff --git a/src/main/asciidoc/stylesheets/golo.css b/src/main/asciidoc/stylesheets/golo.css
new file mode 100644
index 0000000000..5114f5e871
--- /dev/null
+++ b/src/main/asciidoc/stylesheets/golo.css
@@ -0,0 +1,2005 @@
+/*
+ * Copyright 2017-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@import url('https://fonts.googleapis.com/css?family=Raleway:300:400:700');
+@import url(https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/1.6.2/semantic.min.css);
+
+
+#header .details br+span.author:before {
+ content: "\00a0\0026\00a0";
+ color: rgba(0,0,0,.85);
+}
+
+#header .details br+span.email:before {
+ content: "(";
+}
+
+#header .details br+span.email:after {
+ content: ")";
+}
+
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+/* ========================================================================== HTML5 display definitions ========================================================================== */
+/** Correct `block` display not defined in IE 8/9. */
+@import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/3.2.1/css/font-awesome.css);
+
+article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {
+ display: block;
+}
+
+/** Correct `inline-block` display not defined in IE 8/9. */
+audio, canvas, video {
+ display: inline-block;
+}
+
+/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */
+[hidden], template {
+ display: none;
+}
+
+script {
+ display: none !important;
+}
+
+/* ========================================================================== Base ========================================================================== */
+/** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/** Remove default margin. */
+body {
+ margin: 0;
+}
+
+/* ========================================================================== Links ========================================================================== */
+/** Remove the gray background color from active links in IE 10. */
+a {
+ background: transparent;
+}
+
+/** Address `outline` inconsistency between Chrome and other browsers. */
+a:focus {
+ outline: thin dotted;
+}
+
+/** Improve readability when focused and also mouse hovered in all browsers. */
+a:active, a:hover {
+ outline: 0;
+}
+
+/* ========================================================================== Typography ========================================================================== */
+/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */
+h1 {
+ font-size: 2em;
+ margin: 1.2em 0;
+}
+
+/** Address styling not present in IE 8/9, Safari 5, and Chrome. */
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */
+b, strong {
+ font-weight: bold;
+}
+
+/** Address styling not present in Safari 5 and Chrome. */
+dfn {
+ font-style: italic;
+}
+
+/** Address differences between Firefox and other browsers. */
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/** Address styling not present in IE 8/9. */
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/** Correct font family set oddly in Safari 5 and Chrome. */
+code, kbd, pre, samp {
+ font-family: Menlo, Monaco, 'Liberation Mono', Consolas, monospace;
+ font-size: 1em;
+}
+
+/** Improve readability of pre-formatted text in all browsers. */
+pre {
+ white-space: pre-wrap;
+}
+
+/** Set consistent quote types. */
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+/** Address inconsistent and variable font size in all browsers. */
+small {
+ font-size: 80%;
+}
+
+/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */
+sub, sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* ========================================================================== Embedded content ========================================================================== */
+/** Remove border when inside `a` element in IE 8/9. */
+img {
+ border: 0;
+}
+
+/** Correct overflow displayed oddly in IE 9. */
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* ========================================================================== Figures ========================================================================== */
+/** Address margin not present in IE 8/9 and Safari 5. */
+figure {
+ margin: 0;
+}
+
+/* ========================================================================== Forms ========================================================================== */
+/** Define consistent border, margin, and padding. */
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */
+button, input, select, textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */
+button, input {
+ line-height: normal;
+}
+
+/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */
+button, select {
+ text-transform: none;
+}
+
+/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */
+button, html input[type="button"], input[type="reset"], input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/** Re-set default cursor for disabled elements. */
+button[disabled], html input[disabled] {
+ cursor: default;
+}
+
+/** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */
+input[type="checkbox"], input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */
+input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/** Remove inner padding and border in Firefox 4+. */
+button::-moz-focus-inner, input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */
+textarea {
+ overflow: auto; /* 1 */
+ vertical-align: top; /* 2 */
+}
+
+/* ========================================================================== Tables ========================================================================== */
+/** Remove most spacing between table cells. */
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+meta.foundation-mq-small {
+ font-family: "only screen and (min-width: 768px)";
+ width: 768px;
+}
+
+meta.foundation-mq-medium {
+ font-family: "only screen and (min-width:1280px)";
+ width: 1280px;
+}
+
+meta.foundation-mq-large {
+ font-family: "only screen and (min-width:1440px)";
+ width: 1440px;
+}
+
+*, *:before, *:after {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+html, body {
+ font-size: 100%;
+}
+
+body {
+ background: white;
+ color: #34302d;
+ padding: 0;
+ margin: 0;
+ font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.8em;
+ position: relative;
+ cursor: auto;
+}
+
+#content, #content p {
+ line-height: 1.8em;
+ margin-top: 1.5em;
+}
+
+#content li p {
+ margin-top: 0.25em;
+}
+
+a:hover {
+ cursor: pointer;
+}
+
+img, object, embed {
+ max-width: 100%;
+ height: auto;
+}
+
+object, embed {
+ height: 100%;
+}
+
+img {
+ -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object {
+ max-width: none !important;
+}
+
+.left {
+ float: left !important;
+}
+
+.right {
+ float: right !important;
+}
+
+.text-left {
+ text-align: left !important;
+}
+
+.text-right {
+ text-align: right !important;
+}
+
+.text-center {
+ text-align: center !important;
+}
+
+.text-justify {
+ text-align: justify !important;
+}
+
+.hide {
+ display: none;
+}
+
+.antialiased, body {
+ -webkit-font-smoothing: antialiased;
+}
+
+img {
+ display: inline-block;
+ vertical-align: middle;
+}
+
+textarea {
+ height: auto;
+ min-height: 50px;
+}
+
+select {
+ width: 100%;
+}
+
+p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p {
+ font-size: 1.21875em;
+}
+
+.subheader, #content #toctitle, .admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .mathblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title, .tableblock > caption {
+ color: #6db33f;
+ font-weight: 300;
+ margin-top: 0.2em;
+ margin-bottom: 0.5em;
+}
+
+/* Typography resets */
+div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td {
+ margin: 0;
+ padding: 0;
+ direction: ltr;
+}
+
+/* Default Link Styles */
+a {
+ color: #6db33f;
+ line-height: inherit;
+ text-decoration: none;
+}
+
+a:hover, a:focus {
+ color: #6db33f;
+ text-decoration: underline;
+}
+
+a img {
+ border: none;
+}
+
+/* Default paragraph styles */
+p {
+ font-family: inherit;
+ font-weight: normal;
+ font-size: 1em;
+ margin-bottom: 1.25em;
+ text-rendering: optimizeLegibility;
+}
+
+p aside {
+ font-size: 0.875em;
+ font-style: italic;
+}
+
+/* Default header styles */
+h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {
+ font-family: "Raleway", Arial, sans-serif;
+ font-weight: normal;
+ font-style: normal;
+ color: #34302d;
+ text-rendering: optimizeLegibility;
+ margin-top: 1.6em;
+ margin-bottom: 0.6em;
+}
+
+h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small {
+ font-size: 60%;
+ color: #6db33f;
+ line-height: 0;
+}
+
+h1 {
+ font-size: 2.125em;
+ line-height: 2em;
+}
+
+h2 {
+ font-size: 1.6875em;
+ line-height: 1.5em;
+}
+
+h3, #toctitle, .sidebarblock > .content > .title {
+ font-size: 1.375em;
+ line-height: 1.3em;
+}
+
+h4 {
+ font-size: 1.125em;
+}
+
+h5 {
+ font-size: 1.125em;
+}
+
+h6 {
+ font-size: 1em;
+}
+
+hr {
+ border: solid #dcd2c9;
+ border-width: 1px 0 0;
+ clear: both;
+ margin: 1.25em 0 1.1875em;
+ height: 0;
+}
+
+/* Helpful Typography Defaults */
+em, i {
+ font-style: italic;
+ line-height: inherit;
+}
+
+strong, b {
+ font-weight: bold;
+ line-height: inherit;
+}
+
+small {
+ font-size: 60%;
+ line-height: inherit;
+}
+
+code {
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-weight: bold;
+ color: #305CB5;
+}
+
+/* Lists */
+ul, ol, dl {
+ font-size: 1em;
+ margin-bottom: 1.25em;
+ list-style-position: outside;
+ font-family: inherit;
+}
+
+ul, ol {
+ margin-left: 1.5em;
+}
+
+ul.no-bullet, ol.no-bullet {
+ margin-left: 1.5em;
+}
+
+/* Unordered Lists */
+ul li ul, ul li ol {
+ margin-left: 1.25em;
+ margin-bottom: 0;
+ font-size: 1em; /* Override nested font-size change */
+}
+
+ul.square li ul, ul.circle li ul, ul.disc li ul {
+ list-style: inherit;
+}
+
+ul.square {
+ list-style-type: square;
+}
+
+ul.circle {
+ list-style-type: circle;
+}
+
+ul.disc {
+ list-style-type: disc;
+}
+
+ul.no-bullet {
+ list-style: none;
+}
+
+/* Ordered Lists */
+ol li ul, ol li ol {
+ margin-left: 1.25em;
+ margin-bottom: 0;
+}
+
+/* Definition Lists */
+dl dt {
+ margin-bottom: 0.3125em;
+ font-weight: bold;
+}
+
+dl dd {
+ margin-bottom: 1.25em;
+}
+
+/* Abbreviations */
+abbr, acronym {
+ text-transform: uppercase;
+ font-size: 90%;
+ color: #34302d;
+ border-bottom: 1px dotted #dddddd;
+ cursor: help;
+}
+
+abbr {
+ text-transform: none;
+}
+
+/* Blockquotes */
+blockquote {
+ margin: 0 0 1.25em;
+ padding: 0.5625em 1.25em 0 1.1875em;
+ border-left: 1px solid #dddddd;
+}
+
+blockquote cite {
+ display: block;
+ font-size: 0.8125em;
+ color: #655241;
+}
+
+blockquote cite:before {
+ content: "\2014 \0020";
+}
+
+blockquote cite a, blockquote cite a:visited {
+ color: #655241;
+}
+
+blockquote, blockquote p {
+ color: #34302d;
+}
+
+/* Microformats */
+.vcard {
+ display: inline-block;
+ margin: 0 0 1.25em 0;
+ border: 1px solid #dddddd;
+ padding: 0.625em 0.75em;
+}
+
+.vcard li {
+ margin: 0;
+ display: block;
+}
+
+.vcard .fn {
+ font-weight: bold;
+ font-size: 0.9375em;
+}
+
+.vevent .summary {
+ font-weight: bold;
+}
+
+.vevent abbr {
+ cursor: auto;
+ text-decoration: none;
+ font-weight: bold;
+ border: none;
+ padding: 0 0.0625em;
+}
+
+@media only screen and (min-width: 768px) {
+ h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {
+ }
+
+ h1 {
+ font-size: 2.75em;
+ }
+
+ h2 {
+ font-size: 2.3125em;
+ }
+
+ h3, #toctitle, .sidebarblock > .content > .title {
+ font-size: 1.6875em;
+ }
+
+ h4 {
+ font-size: 1.4375em;
+ }
+}
+
+/* Print styles. Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com)
+*/
+.print-only {
+ display: none !important;
+}
+
+@media print {
+ * {
+ background: transparent !important;
+ color: #000 !important; /* Black prints faster: h5bp.com/s */
+ box-shadow: none !important;
+ text-shadow: none !important;
+ }
+
+ a, a:visited {
+ text-decoration: underline;
+ }
+
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+
+ .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after {
+ content: "";
+ }
+
+ pre, blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+
+ thead {
+ display: table-header-group; /* h5bp.com/t */
+ }
+
+ tr, img {
+ page-break-inside: avoid;
+ }
+
+ img {
+ max-width: 100% !important;
+ }
+
+ @page {
+ margin: 0.5cm;
+ }
+
+ p, h2, h3, #toctitle, .sidebarblock > .content > .title {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2, h3, #toctitle, .sidebarblock > .content > .title {
+ page-break-after: avoid;
+ }
+
+ .hide-on-print {
+ display: none !important;
+ }
+
+ .print-only {
+ display: block !important;
+ }
+
+ .hide-for-print {
+ display: none !important;
+ }
+
+ .show-for-print {
+ display: inherit !important;
+ }
+}
+
+/* Tables */
+table {
+ background: white;
+ margin-bottom: 1.25em;
+ border: solid 1px #34302d;
+}
+
+table thead, table tfoot {
+ font-weight: bold;
+}
+
+table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td {
+ padding: 0.5em 0.625em 0.625em;
+ font-size: inherit;
+ color: #34302d;
+ text-align: left;
+}
+
+table thead tr th {
+ color: white;
+ background: #34302d;
+}
+
+table tr th, table tr td {
+ padding: 0.5625em 0.625em;
+ font-size: inherit;
+ color: #34302d;
+ border: 0 none;
+}
+
+table tr.even, table tr.alt, table tr:nth-of-type(even) {
+ background: #f2F2F2;
+}
+
+table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td {
+ display: table-cell;
+}
+
+.clearfix:before, .clearfix:after, .float-group:before, .float-group:after {
+ content: " ";
+ display: table;
+}
+
+.clearfix:after, .float-group:after {
+ clear: both;
+}
+
+*:not(pre) > code {
+ font-size: inherit;
+ padding: 0;
+ white-space: nowrap;
+ background-color: inherit;
+ border: 0 solid #dddddd;
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+ text-shadow: none;
+}
+
+pre, pre > code {
+ color: black;
+ font-family: monospace, serif;
+ font-weight: normal;
+}
+
+.keyseq {
+ color: #774417;
+}
+
+kbd:not(.keyseq) {
+ display: inline-block;
+ color: #211306;
+ font-size: 0.75em;
+ background-color: #F7F7F7;
+ border: 1px solid #ccc;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset;
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 2px white inset;
+ margin: -0.15em 0.15em 0 0.15em;
+ padding: 0.2em 0.6em 0.2em 0.5em;
+ vertical-align: middle;
+ white-space: nowrap;
+}
+
+.keyseq kbd:first-child {
+ margin-left: 0;
+}
+
+.keyseq kbd:last-child {
+ margin-right: 0;
+}
+
+.menuseq, .menu {
+ color: black;
+}
+
+b.button:before, b.button:after {
+ position: relative;
+ top: -1px;
+ font-weight: normal;
+}
+
+b.button:before {
+ content: "[";
+ padding: 0 3px 0 2px;
+}
+
+b.button:after {
+ content: "]";
+ padding: 0 2px 0 3px;
+}
+
+p a > code:hover {
+ color: #541312;
+}
+
+#header, #content, #footnotes, #footer {
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 0;
+ margin-bottom: 0;
+ max-width: 62.5em;
+ *zoom: 1;
+ position: relative;
+ padding-left: 4em;
+ padding-right: 4em;
+}
+
+#header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after {
+ content: " ";
+ display: table;
+}
+
+#header:after, #content:after, #footnotes:after, #footer:after {
+ clear: both;
+}
+
+#header {
+ margin-bottom: 2.5em;
+}
+
+#header > h1 {
+ color: #34302d;
+ font-weight: 400;
+}
+
+#header span {
+ color: #34302d;
+}
+
+#header #revnumber {
+ text-transform: capitalize;
+}
+
+#header br {
+ display: none;
+}
+
+#header br + span {
+}
+
+#revdate {
+ display: block;
+}
+
+#toc {
+ border-bottom: 1px solid #e6dfd8;
+ padding-bottom: 1.25em;
+}
+
+#toc > ul {
+ margin-left: 0.25em;
+}
+
+#toc ul.sectlevel0 > li > a {
+ font-style: italic;
+}
+
+#toc ul.sectlevel0 ul.sectlevel1 {
+ margin-left: 0;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+#toc ul {
+ list-style-type: none;
+}
+
+#toctitle {
+ color: #385dbd;
+}
+
+@media only screen and (min-width: 768px) {
+ body.toc2 {
+ padding-left: 15em;
+ padding-right: 0;
+ }
+
+ #toc.toc2 {
+ position: fixed;
+ width: 15em;
+ left: 0;
+ border-bottom: 0;
+ z-index: 1000;
+ padding: 1em;
+ height: 100%;
+ top: 0px;
+ background: #F1F1F1;
+ overflow: auto;
+
+ -moz-transition-property: top;
+ -o-transition-property: top;
+ -webkit-transition-property: top;
+ transition-property: top;
+ -moz-transition-duration: 0.4s;
+ -o-transition-duration: 0.4s;
+ -webkit-transition-duration: 0.4s;
+ transition-duration: 0.4s;
+ }
+
+ #reactor-header {
+ position: fixed;
+ top: -75px;
+ left: 0;
+ right: 0;
+ height: 75px;
+
+
+ -moz-transition-property: top;
+ -o-transition-property: top;
+ -webkit-transition-property: top;
+ transition-property: top;
+ -moz-transition-duration: 0.4s;
+ -o-transition-duration: 0.4s;
+ -webkit-transition-duration: 0.4s;
+ transition-duration: 0.4s;
+ }
+
+ body.head-show #toc.toc2 {
+ top: 75px;
+ }
+ body.head-show #reactor-header {
+ top: 0;
+ }
+
+ #toc.toc2 a {
+ color: #34302d;
+ font-family: "Raleway", Arial, sans-serif;
+ }
+
+ #toc.toc2 #toctitle {
+ margin-top: 0;
+ font-size: 1.2em;
+ }
+
+ #toc.toc2 > ul {
+ font-size: .90em;
+ }
+
+ #toc.toc2 ul ul {
+ margin-left: 0;
+ padding-left: 0.4em;
+ }
+
+ #toc.toc2 ul.sectlevel0 ul.sectlevel1 {
+ padding-left: 0;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+
+ body.toc2.toc-right {
+ padding-left: 0;
+ padding-right: 15em;
+ }
+
+ body.toc2.toc-right #toc.toc2 {
+ border-right: 0;
+ border-left: 1px solid #e6dfd8;
+ left: auto;
+ right: 0;
+ }
+}
+
+@media only screen and (min-width: 1280px) {
+ body.toc2 {
+ padding-left: 20em;
+ padding-right: 0;
+ }
+
+ #toc.toc2 {
+ width: 20em;
+ }
+
+ #toc.toc2 #toctitle {
+ font-size: 1.375em;
+ }
+
+ #toc.toc2 > ul {
+ font-size: 0.95em;
+ }
+
+ #toc.toc2 ul ul {
+ padding-left: 1.25em;
+ }
+
+ body.toc2.toc-right {
+ padding-left: 0;
+ padding-right: 20em;
+ }
+}
+
+#content #toc {
+ border-style: solid;
+ border-width: 1px;
+ border-color: #d9d9d9;
+ margin-bottom: 1.25em;
+ padding: 1.25em;
+ background: #f2f2f2;
+ border-width: 0;
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+}
+
+#content #toc > :first-child {
+ margin-top: 0;
+}
+
+#content #toc > :last-child {
+ margin-bottom: 0;
+}
+
+#content #toc a {
+ text-decoration: none;
+}
+
+#content #toctitle {
+ font-weight: bold;
+ font-family: "Raleway", Arial, sans-serif;
+ font-size: 1em;
+ padding-left: 0.125em;
+}
+
+#footer {
+ max-width: 100%;
+ background-color: white;
+ padding: 1.25em;
+ color: #CCC;
+ border-top: 3px solid #F1F1F1;
+}
+
+#footer-text {
+ color: #444;
+ line-height: 1.44;
+}
+
+.sect1 {
+ padding-bottom: 1.25em;
+}
+
+.sect1 + .sect1 {
+ border-top: 1px solid #e6dfd8;
+}
+
+#content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ position: absolute;
+ width: 1em;
+ margin-left: -1em;
+ display: block;
+ text-decoration: none;
+ visibility: hidden;
+ text-align: center;
+ font-weight: normal;
+}
+
+#content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before {
+ content: '\00A7';
+ font-size: .85em;
+ vertical-align: text-top;
+ display: block;
+ margin-top: 0.05em;
+}
+
+#content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover {
+ visibility: visible;
+}
+
+#content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link {
+ color: #34302d;
+ text-decoration: none;
+}
+
+#content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover {
+ color: #34302d;
+}
+
+.imageblock, .literalblock, .listingblock, .mathblock, .verseblock, .videoblock {
+ margin-bottom: 1.25em;
+ margin-top: 1.25em;
+}
+
+.admonitionblock td.content > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .mathblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, .sidebarblock > .title, .tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title {
+ text-align: left;
+ font-weight: bold;
+}
+
+.tableblock > caption {
+ text-align: left;
+ font-weight: bold;
+ white-space: nowrap;
+ overflow: visible;
+ max-width: 0;
+}
+
+table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p {
+ font-size: inherit;
+}
+
+.admonitionblock > table {
+ border: 0;
+ background: none;
+ width: 100%;
+}
+
+.admonitionblock > table td.icon {
+ text-align: center;
+ width: 80px;
+}
+
+.admonitionblock > table td.icon img {
+ max-width: none;
+}
+
+.admonitionblock > table td.icon .title {
+ font-weight: bold;
+ text-transform: uppercase;
+}
+
+.admonitionblock > table td.content {
+ padding-left: 1.125em;
+ padding-right: 1.25em;
+ border-left: 1px solid #dcd2c9;
+ color: #34302d;
+}
+
+.admonitionblock > table td.content > :last-child > :last-child {
+ margin-bottom: 0;
+}
+
+.exampleblock > .content {
+ border-top: 1px solid #6db33f;
+ border-bottom: 1px solid #6db33f;
+ margin-bottom: 1.25em;
+ padding: 1.25em;
+ background: white;
+}
+
+.exampleblock > .content > :first-child {
+ margin-top: 0;
+}
+
+.exampleblock > .content > :last-child {
+ margin-bottom: 0;
+}
+
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6, .exampleblock > .content p {
+ color: #333333;
+}
+
+.exampleblock > .content h1, .exampleblock > .content h2, .exampleblock > .content h3, .exampleblock > .content #toctitle, .sidebarblock.exampleblock > .content > .title, .exampleblock > .content h4, .exampleblock > .content h5, .exampleblock > .content h6 {
+ margin-bottom: 0.625em;
+}
+
+.exampleblock > .content h1.subheader, .exampleblock > .content h2.subheader, .exampleblock > .content h3.subheader, .exampleblock > .content .subheader#toctitle, .sidebarblock.exampleblock > .content > .subheader.title, .exampleblock > .content h4.subheader, .exampleblock > .content h5.subheader, .exampleblock > .content h6.subheader {
+}
+
+.exampleblock.result > .content {
+ -webkit-box-shadow: 0 1px 8px #d9d9d9;
+ box-shadow: 0 1px 8px #d9d9d9;
+}
+
+.sidebarblock {
+ padding: 1.25em 2em;
+ background: #F1F1F1;
+ margin: 2em -2em;
+
+}
+
+.sidebarblock > :first-child {
+ margin-top: 0;
+}
+
+.sidebarblock > :last-child {
+ margin-bottom: 0;
+}
+
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6, .sidebarblock p {
+ color: #333333;
+}
+
+.sidebarblock h1, .sidebarblock h2, .sidebarblock h3, .sidebarblock #toctitle, .sidebarblock > .content > .title, .sidebarblock h4, .sidebarblock h5, .sidebarblock h6 {
+ margin-bottom: 0.625em;
+}
+
+.sidebarblock h1.subheader, .sidebarblock h2.subheader, .sidebarblock h3.subheader, .sidebarblock .subheader#toctitle, .sidebarblock > .content > .subheader.title, .sidebarblock h4.subheader, .sidebarblock h5.subheader, .sidebarblock h6.subheader {
+}
+
+.sidebarblock > .content > .title {
+ color: #6db33f;
+ margin-top: 0;
+ font-size: 1.2em;
+}
+
+.exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+.literalblock pre:not([class]), .listingblock pre:not([class]) {
+ background-color:#f2f2f2;
+}
+
+.literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
+ border-width: 1px;
+ border-style: solid;
+ border-color: rgba(21, 35, 71, 0.1);
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+ padding: 0.8em;
+ word-wrap: break-word;
+}
+
+.literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap {
+ overflow-x: auto;
+ white-space: pre;
+ word-wrap: normal;
+}
+
+.literalblock pre > code, .literalblock pre[class] > code, .listingblock pre > code, .listingblock pre[class] > code {
+ display: block;
+}
+
+@media only screen {
+ .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
+ font-size: 0.72em;
+ }
+}
+
+@media only screen and (min-width: 768px) {
+ .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
+ font-size: 0.81em;
+ }
+}
+
+@media only screen and (min-width: 1280px) {
+ .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] {
+ font-size: 0.9em;
+ }
+}
+
+.listingblock pre.highlight {
+ padding: 0;
+ line-height: 1.4em;
+}
+
+.listingblock pre.highlight > code {
+ padding: 0.8em;
+}
+
+.listingblock > .content {
+ position: relative;
+}
+
+.listingblock:hover code[class*=" language-"]:before {
+ text-transform: uppercase;
+ font-size: 0.9em;
+ color: #999;
+ position: absolute;
+ top: 0.375em;
+ right: 0.375em;
+}
+
+.listingblock:hover code.asciidoc:before {
+ content: "asciidoc";
+}
+
+.listingblock:hover code.clojure:before {
+ content: "clojure";
+}
+
+.listingblock:hover code.css:before {
+ content: "css";
+}
+
+.listingblock:hover code.groovy:before {
+ content: "groovy";
+}
+
+.listingblock:hover code.html:before {
+ content: "html";
+}
+
+.listingblock:hover code.java:before {
+ content: "java";
+}
+
+.listingblock:hover code.javascript:before {
+ content: "javascript";
+}
+
+.listingblock:hover code.python:before {
+ content: "python";
+}
+
+.listingblock:hover code.ruby:before {
+ content: "ruby";
+}
+
+.listingblock:hover code.sass:before {
+ content: "sass";
+}
+
+.listingblock:hover code.scss:before {
+ content: "scss";
+}
+
+.listingblock:hover code.xml:before {
+ content: "xml";
+}
+
+.listingblock:hover code.yaml:before {
+ content: "yaml";
+}
+
+.listingblock.terminal pre .command:before {
+ content: attr(data-prompt);
+ padding-right: 0.5em;
+ color: #999;
+}
+
+.listingblock.terminal pre .command:not([data-prompt]):before {
+ content: '$';
+}
+
+table.pyhltable {
+ border: 0;
+ margin-bottom: 0;
+}
+
+table.pyhltable td {
+ vertical-align: top;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+table.pyhltable td.code {
+ padding-left: .75em;
+ padding-right: 0;
+}
+
+.highlight.pygments .lineno, table.pyhltable td:not(.code) {
+ color: #999;
+ padding-left: 0;
+ padding-right: .5em;
+ border-right: 1px solid #dcd2c9;
+}
+
+.highlight.pygments .lineno {
+ display: inline-block;
+ margin-right: .25em;
+}
+
+table.pyhltable .linenodiv {
+ background-color: transparent !important;
+ padding-right: 0 !important;
+}
+
+.quoteblock {
+ margin: 0 0 1.25em;
+ padding: 0.5625em 1.25em 0 1.1875em;
+ border-left: 3px solid #dddddd;
+}
+
+.quoteblock blockquote {
+ margin: 0 0 1.25em 0;
+ padding: 0 0 0.5625em 0;
+ border: 0;
+}
+
+.quoteblock blockquote > .paragraph:last-child p {
+ margin-bottom: 0;
+}
+
+.quoteblock .attribution {
+ margin-top: -.25em;
+ padding-bottom: 0.5625em;
+ font-size: 0.8125em;
+}
+
+.quoteblock .attribution br {
+ display: none;
+}
+
+.quoteblock .attribution cite {
+ display: block;
+ margin-bottom: 0.625em;
+}
+
+table thead th, table tfoot th {
+ font-weight: bold;
+}
+
+table.tableblock.grid-all {
+ border-collapse: separate;
+ border-radius: 6px;
+ border-top: 1px solid #34302d;
+ border-bottom: 1px solid #34302d;
+}
+
+table.tableblock.frame-topbot, table.tableblock.frame-none {
+ border-left: 0;
+ border-right: 0;
+}
+
+table.tableblock.frame-sides, table.tableblock.frame-none {
+ border-top: 0;
+ border-bottom: 0;
+}
+
+table.tableblock td .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child {
+ margin-bottom: 0;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+
+tbody tr th {
+ display: table-cell;
+ background: rgba(105, 60, 22, 0.25);
+}
+
+tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p {
+ color: #211306;
+ font-weight: bold;
+}
+
+td > div.verse {
+ white-space: pre;
+}
+
+ol {
+ margin-left: 1.75em;
+}
+
+ul li ol {
+ margin-left: 1.5em;
+}
+
+dl dd {
+ margin-left: 1.125em;
+}
+
+dl dd:last-child, dl dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist {
+ margin-bottom: 0.625em;
+}
+
+ul.unstyled, ol.unnumbered, ul.checklist, ul.none {
+ list-style-type: none;
+}
+
+ul.unstyled, ol.unnumbered, ul.checklist {
+ margin-left: 0.625em;
+}
+
+ul.checklist li > p:first-child > i[class^="icon-check"]:first-child, ul.checklist li > p:first-child > input[type="checkbox"]:first-child {
+ margin-right: 0.25em;
+}
+
+ul.checklist li > p:first-child > input[type="checkbox"]:first-child {
+ position: relative;
+ top: 1px;
+}
+
+ul.inline {
+ margin: 0 auto 0.625em auto;
+ margin-left: -1.375em;
+ margin-right: 0;
+ padding: 0;
+ list-style: none;
+ overflow: hidden;
+}
+
+ul.inline > li {
+ list-style: none;
+ float: left;
+ margin-left: 1.375em;
+ display: block;
+}
+
+ul.inline > li > * {
+ display: block;
+}
+
+.unstyled dl dt {
+ font-weight: normal;
+ font-style: normal;
+}
+
+ol.arabic {
+ list-style-type: decimal;
+}
+
+ol.decimal {
+ list-style-type: decimal-leading-zero;
+}
+
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+ol.lowergreek {
+ list-style-type: lower-greek;
+}
+
+.hdlist > table, .colist > table {
+ border: 0;
+ background: none;
+}
+
+.hdlist > table > tbody > tr, .colist > table > tbody > tr {
+ background: none;
+}
+
+td.hdlist1 {
+ padding-right: .75em;
+ font-weight: bold;
+}
+
+td.hdlist1, td.hdlist2 {
+ vertical-align: top;
+}
+
+.literalblock + .colist, .listingblock + .colist {
+ margin-top: -0.5em;
+}
+
+.colist > table tr > td:first-of-type {
+ padding: 0 .75em;
+}
+
+.colist > table tr > td:last-of-type {
+ padding: 0.25em 0;
+}
+
+.qanda > ol > li > p > em:only-child {
+ color: #063f40;
+}
+
+.thumb, .th {
+ line-height: 0;
+ display: inline-block;
+ border: solid 4px white;
+ -webkit-box-shadow: 0 0 0 1px #dddddd;
+ box-shadow: 0 0 0 1px #dddddd;
+}
+
+.imageblock.left, .imageblock[style*="float: left"] {
+ margin: 0.25em 0.625em 1.25em 0;
+}
+
+.imageblock.right, .imageblock[style*="float: right"] {
+ margin: 0.25em 0 1.25em 0.625em;
+}
+
+.imageblock > .title {
+ margin-bottom: 0;
+}
+
+.imageblock.thumb, .imageblock.th {
+ border-width: 6px;
+}
+
+.imageblock.thumb > .title, .imageblock.th > .title {
+ padding: 0 0.125em;
+}
+
+.image.left, .image.right {
+ margin-top: 0.25em;
+ margin-bottom: 0.25em;
+ display: inline-block;
+ line-height: 0;
+}
+
+.image.left {
+ margin-right: 0.625em;
+}
+
+.image.right {
+ margin-left: 0.625em;
+}
+
+a.image {
+ text-decoration: none;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+ font-size: 0.875em;
+}
+
+span.footnote a, span.footnoteref a {
+ text-decoration: none;
+}
+
+#footnotes {
+ padding-top: 0.75em;
+ padding-bottom: 0.75em;
+ margin-bottom: 0.625em;
+}
+
+#footnotes hr {
+ width: 20%;
+ min-width: 6.25em;
+ margin: -.25em 0 .75em 0;
+ border-width: 1px 0 0 0;
+}
+
+#footnotes .footnote {
+ padding: 0 0.375em;
+ font-size: 0.875em;
+ margin-left: 1.2em;
+ text-indent: -1.2em;
+ margin-bottom: .2em;
+}
+
+#footnotes .footnote a:first-of-type {
+ font-weight: bold;
+ text-decoration: none;
+}
+
+#footnotes .footnote:last-of-type {
+ margin-bottom: 0;
+}
+
+#content #footnotes {
+ margin-top: -0.625em;
+ margin-bottom: 0;
+ padding: 0.75em 0;
+}
+
+.gist .file-data > table {
+ border: none;
+ background: #fff;
+ width: 100%;
+ margin-bottom: 0;
+}
+
+.gist .file-data > table td.line-data {
+ width: 99%;
+}
+
+div.unbreakable {
+ page-break-inside: avoid;
+}
+
+.big {
+ font-size: larger;
+}
+
+.small {
+ font-size: smaller;
+}
+
+.underline {
+ text-decoration: underline;
+}
+
+.overline {
+ text-decoration: overline;
+}
+
+.line-through {
+ text-decoration: line-through;
+}
+
+.aqua {
+ color: #00bfbf;
+}
+
+.aqua-background {
+ background-color: #00fafa;
+}
+
+.black {
+ color: black;
+}
+
+.black-background {
+ background-color: black;
+}
+
+.blue {
+ color: #0000bf;
+}
+
+.blue-background {
+ background-color: #0000fa;
+}
+
+.fuchsia {
+ color: #bf00bf;
+}
+
+.fuchsia-background {
+ background-color: #fa00fa;
+}
+
+.gray {
+ color: #606060;
+}
+
+.gray-background {
+ background-color: #7d7d7d;
+}
+
+.green {
+ color: #006000;
+}
+
+.green-background {
+ background-color: #007d00;
+}
+
+.lime {
+ color: #00bf00;
+}
+
+.lime-background {
+ background-color: #00fa00;
+}
+
+.maroon {
+ color: #600000;
+}
+
+.maroon-background {
+ background-color: #7d0000;
+}
+
+.navy {
+ color: #000060;
+}
+
+.navy-background {
+ background-color: #00007d;
+}
+
+.olive {
+ color: #606000;
+}
+
+.olive-background {
+ background-color: #7d7d00;
+}
+
+.purple {
+ color: #600060;
+}
+
+.purple-background {
+ background-color: #7d007d;
+}
+
+.red {
+ color: #bf0000;
+}
+
+.red-background {
+ background-color: #fa0000;
+}
+
+.silver {
+ color: #909090;
+}
+
+.silver-background {
+ background-color: #bcbcbc;
+}
+
+.teal {
+ color: #006060;
+}
+
+.teal-background {
+ background-color: #007d7d;
+}
+
+.white {
+ color: #bfbfbf;
+}
+
+.white-background {
+ background-color: #fafafa;
+}
+
+.yellow {
+ color: #bfbf00;
+}
+
+.yellow-background {
+ background-color: #fafa00;
+}
+
+span.icon > [class^="icon-"], span.icon > [class*=" icon-"] {
+ cursor: default;
+}
+
+.admonitionblock td.icon [class^="icon-"]:before {
+ font-size: 2.5em;
+ text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
+ cursor: default;
+}
+
+.admonitionblock td.icon .icon-note:before {
+ content: "\f05a";
+ color: #095557;
+ color: #064042;
+}
+
+.admonitionblock td.icon .icon-tip:before {
+ content: "\f0eb";
+ text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8);
+ color: #111;
+}
+
+.admonitionblock td.icon .icon-warning:before {
+ content: "\f071";
+ color: #bf6900;
+}
+
+.admonitionblock td.icon .icon-caution:before {
+ content: "\f06d";
+ color: #bf3400;
+}
+
+.admonitionblock td.icon .icon-important:before {
+ content: "\f06a";
+ color: #bf0000;
+}
+
+.conum {
+ display: inline-block;
+ color: white !important;
+ background-color: #211306;
+ -webkit-border-radius: 100px;
+ border-radius: 100px;
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 20px;
+ font-family: Arial, sans-serif;
+ font-style: normal;
+ position: relative;
+ top: -2px;
+ letter-spacing: -1px;
+}
+
+.conum * {
+ color: white !important;
+}
+
+.conum + b {
+ display: none;
+}
+
+.conum:after {
+ content: attr(data-value);
+}
+
+.conum:not([data-value]):empty {
+ display: none;
+}
+
+body {
+ padding-top: 60px;
+}
+
+#toc.toc2 ul ul {
+ padding-left: 1em;
+}
+#toc.toc2 ul ul.sectlevel2 {
+}
+
+#toctitle {
+ color: #34302d;
+ display: none;
+}
+
+#header h1 {
+ font-weight: bold;
+ position: relative;
+ left: -0.0625em;
+}
+
+#header h1 span.lo {
+ color: #dc9424;
+}
+
+#content h2, #content h3, #content #toctitle, #content .sidebarblock > .content > .title, #content h4, #content h5, #content #toctitle {
+ font-weight: normal;
+ position: relative;
+ left: -0.0625em;
+}
+
+#content h2 {
+ font-weight: bold;
+}
+
+.literalblock .content pre.highlight, .listingblock .content pre.highlight {
+ background-color:#f2f2f2;
+}
+
+.admonitionblock > table td.content {
+ border-color: #e6dfd8;
+}
+
+table.tableblock.grid-all {
+ -webkit-border-radius: 0;
+ border-radius: 0;
+}
+
+#footer {
+ background-color: #while;
+ color: #34302d;
+}
+
+.imageblock .title {
+ text-align: center;
+}
+
+#content h1.sect0 {
+ font-size: 48px;
+}
+
+#toc > ul > li > a {
+ font-size: large;
+}
diff --git a/src/main/java/com/lambdaworks/codec/Base16.java b/src/main/java/com/lambdaworks/codec/Base16.java
deleted file mode 100644
index f7d606fbf2..0000000000
--- a/src/main/java/com/lambdaworks/codec/Base16.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2011 - Will Glozer. All rights reserved.
-
-package com.lambdaworks.codec;
-
-/**
- * High-performance base16 (AKA hex) codec.
- *
- * @author Will Glozer
- */
-public class Base16 {
- private static final char[] upper = "0123456789ABCDEF".toCharArray();
- private static final char[] lower = "0123456789abcdef".toCharArray();
- private static final byte[] decode = new byte[128];
-
- static {
- for (int i = 0; i < 10; i++) {
- decode['0' + i] = (byte) i;
- decode['A' + i] = (byte) (10 + i);
- decode['a' + i] = (byte) (10 + i);
- }
- }
-
- /**
- * Utility constructor.
- */
- private Base16() {
-
- }
-
- /**
- * Encode bytes to base16 chars.
- *
- * @param src Bytes to encode.
- * @param upper Use upper or lowercase chars.
- *
- * @return Encoded chars.
- */
- public static char[] encode(byte[] src, boolean upper) {
- char[] table = upper ? Base16.upper : Base16.lower;
- char[] dst = new char[src.length * 2];
-
- for (int si = 0, di = 0; si < src.length; si++) {
- byte b = src[si];
- dst[di++] = table[(b & 0xf0) >>> 4];
- dst[di++] = table[(b & 0x0f)];
- }
-
- return dst;
- }
-}
diff --git a/src/main/java/com/lambdaworks/codec/CRC16.java b/src/main/java/com/lambdaworks/codec/CRC16.java
deleted file mode 100644
index ff5fb4e880..0000000000
--- a/src/main/java/com/lambdaworks/codec/CRC16.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.lambdaworks.codec;
-
-/**
- * @author Mark Paluch
- *
- * - Name: XMODEM (also known as ZMODEM or CRC-16/ACORN)
- * - Width: 16 bit
- * - Poly: 1021 (That is actually x16 + x12 + x5 + 1)
- * - Initialization: 0000
- * - Reflect Input byte: False
- * - Reflect Output CRC: False
- * - Xor constant to output CRC: 0000
- *
- * @since 3.0
- */
-public class CRC16 {
-
- private static final int[] LOOKUP_TABLE = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129,
- 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
- 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7,
- 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630,
- 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5,
- 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
- 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58,
- 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD,
- 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE,
- 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
- 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C,
- 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589,
- 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA,
- 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
- 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1,
- 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16,
- 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07,
- 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
- 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 };
-
- /**
- * Utility constructor.
- */
- private CRC16() {
-
- }
-
- /**
- * Create a CRC16 checksum from the bytes.
- *
- * @param bytes input bytes
- * @return CRC16 as interger value
- */
- public static int crc16(byte[] bytes) {
- int crc = 0x0000;
-
- for (byte b : bytes) {
- crc = ((crc << 8) ^ LOOKUP_TABLE[((crc >>> 8) ^ (b & 0xFF)) & 0xFF]);
- }
- return crc & 0xFFFF;
- }
-
-}
diff --git a/src/main/java/com/lambdaworks/codec/package-info.java b/src/main/java/com/lambdaworks/codec/package-info.java
deleted file mode 100644
index d1646d9b5f..0000000000
--- a/src/main/java/com/lambdaworks/codec/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * Base16 and CRC16 codecs.
- */
-package com.lambdaworks.codec;
\ No newline at end of file
diff --git a/src/main/java/com/lambdaworks/redis/AbstractRedisAsyncCommands.java b/src/main/java/com/lambdaworks/redis/AbstractRedisAsyncCommands.java
deleted file mode 100644
index bb49c23a11..0000000000
--- a/src/main/java/com/lambdaworks/redis/AbstractRedisAsyncCommands.java
+++ /dev/null
@@ -1,1854 +0,0 @@
-// Copyright (C) 2011 - Will Glozer. All rights reserved.
-
-package com.lambdaworks.redis;
-
-import static com.lambdaworks.redis.protocol.CommandType.EXEC;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-import com.lambdaworks.redis.GeoArgs.Unit;
-import com.lambdaworks.redis.api.StatefulConnection;
-import com.lambdaworks.redis.api.async.*;
-import com.lambdaworks.redis.cluster.api.async.RedisClusterAsyncCommands;
-import com.lambdaworks.redis.codec.RedisCodec;
-import com.lambdaworks.redis.internal.LettuceAssert;
-import com.lambdaworks.redis.output.*;
-import com.lambdaworks.redis.protocol.*;
-
-/**
- * An asynchronous and thread-safe API for a Redis connection.
- *
- * @param Key type.
- * @param Value type.
- * @author Will Glozer
- */
-public abstract class AbstractRedisAsyncCommands
- implements RedisHashesAsyncConnection, RedisKeysAsyncConnection, RedisStringsAsyncConnection,
- RedisListsAsyncConnection, RedisSetsAsyncConnection, RedisSortedSetsAsyncConnection,
- RedisScriptingAsyncConnection, RedisServerAsyncConnection, RedisHLLAsyncConnection,
- BaseRedisAsyncConnection, RedisClusterAsyncConnection, RedisGeoAsyncConnection,
-
- RedisHashAsyncCommands, RedisKeyAsyncCommands, RedisStringAsyncCommands, RedisListAsyncCommands,
- RedisSetAsyncCommands, RedisSortedSetAsyncCommands, RedisScriptingAsyncCommands,
- RedisServerAsyncCommands, RedisHLLAsyncCommands, BaseRedisAsyncCommands,
- RedisTransactionalAsyncCommands, RedisGeoAsyncCommands, RedisClusterAsyncCommands {
-
- protected MultiOutput multi;
- protected RedisCommandBuilder commandBuilder;
- protected RedisCodec codec;
- protected StatefulConnection connection;
-
- /**
- * Initialize a new instance.
- *
- * @param connection the connection to operate on
- * @param codec the codec for command encoding
- */
- public AbstractRedisAsyncCommands(StatefulConnection connection, RedisCodec codec) {
- this.connection = connection;
- this.codec = codec;
- commandBuilder = new RedisCommandBuilder(codec);
- }
-
- @Override
- public RedisFuture append(K key, V value) {
- return dispatch(commandBuilder.append(key, value));
- }
-
- @Override
- public String auth(String password) {
- AsyncCommand cmd = authAsync(password);
- return LettuceFutures.awaitOrCancel(cmd, connection.getTimeout(), connection.getTimeoutUnit());
- }
-
- public AsyncCommand authAsync(String password) {
- return dispatch(commandBuilder.auth(password));
- }
-
- @Override
- public RedisFuture bgrewriteaof() {
- return dispatch(commandBuilder.bgrewriteaof());
- }
-
- @Override
- public RedisFuture bgsave() {
- return dispatch(commandBuilder.bgsave());
- }
-
- @Override
- public RedisFuture bitcount(K key) {
- return dispatch(commandBuilder.bitcount(key));
- }
-
- @Override
- public RedisFuture bitcount(K key, long start, long end) {
- return dispatch(commandBuilder.bitcount(key, start, end));
- }
-
- @Override
- public RedisFuture> bitfield(K key, BitFieldArgs bitFieldArgs) {
- return dispatch(commandBuilder.bitfield(key, bitFieldArgs));
- }
-
- @Override
- public RedisFuture bitpos(K key, boolean state) {
- return dispatch(commandBuilder.bitpos(key, state));
- }
-
- @Override
- public RedisFuture bitpos(K key, boolean state, long start, long end) {
- return dispatch(commandBuilder.bitpos(key, state, start, end));
- }
-
- @Override
- public RedisFuture bitopAnd(K destination, K... keys) {
- return dispatch(commandBuilder.bitopAnd(destination, keys));
- }
-
- @Override
- public RedisFuture bitopNot(K destination, K source) {
- return dispatch(commandBuilder.bitopNot(destination, source));
- }
-
- @Override
- public RedisFuture bitopOr(K destination, K... keys) {
- return dispatch(commandBuilder.bitopOr(destination, keys));
- }
-
- @Override
- public RedisFuture bitopXor(K destination, K... keys) {
- return dispatch(commandBuilder.bitopXor(destination, keys));
- }
-
- @Override
- public RedisFuture> blpop(long timeout, K... keys) {
- return dispatch(commandBuilder.blpop(timeout, keys));
- }
-
- @Override
- public RedisFuture> brpop(long timeout, K... keys) {
- return dispatch(commandBuilder.brpop(timeout, keys));
- }
-
- @Override
- public RedisFuture brpoplpush(long timeout, K source, K destination) {
- return dispatch(commandBuilder.brpoplpush(timeout, source, destination));
- }
-
- @Override
- public RedisFuture clientGetname() {
- return dispatch(commandBuilder.clientGetname());
- }
-
- @Override
- public RedisFuture clientSetname(K name) {
- return dispatch(commandBuilder.clientSetname(name));
- }
-
- @Override
- public RedisFuture clientKill(String addr) {
- return dispatch(commandBuilder.clientKill(addr));
- }
-
- @Override
- public RedisFuture clientKill(KillArgs killArgs) {
- return dispatch(commandBuilder.clientKill(killArgs));
- }
-
- @Override
- public RedisFuture clientPause(long timeout) {
- return dispatch(commandBuilder.clientPause(timeout));
- }
-
- @Override
- public RedisFuture clientList() {
- return dispatch(commandBuilder.clientList());
- }
-
- @Override
- public RedisFuture> command() {
- return dispatch(commandBuilder.command());
- }
-
- @Override
- public RedisFuture> commandInfo(String... commands) {
- return dispatch(commandBuilder.commandInfo(commands));
- }
-
- @Override
- public RedisFuture> commandInfo(CommandType... commands) {
- String[] stringCommands = new String[commands.length];
- for (int i = 0; i < commands.length; i++) {
- stringCommands[i] = commands[i].name();
- }
-
- return commandInfo(stringCommands);
- }
-
- @Override
- public RedisFuture commandCount() {
- return dispatch(commandBuilder.commandCount());
- }
-
- @Override
- public RedisFuture> configGet(String parameter) {
- return dispatch(commandBuilder.configGet(parameter));
- }
-
- @Override
- public RedisFuture configResetstat() {
- return dispatch(commandBuilder.configResetstat());
- }
-
- @Override
- public RedisFuture configSet(String parameter, String value) {
- return dispatch(commandBuilder.configSet(parameter, value));
- }
-
- @Override
- public RedisFuture configRewrite() {
- return dispatch(commandBuilder.configRewrite());
- }
-
- @Override
- public RedisFuture dbsize() {
- return dispatch(commandBuilder.dbsize());
- }
-
- @Override
- public RedisFuture debugCrashAndRecover(Long delay) {
- return dispatch(commandBuilder.debugCrashAndRecover(delay));
- }
-
- @Override
- public RedisFuture debugHtstats(int db) {
- return dispatch(commandBuilder.debugHtstats(db));
- }
-
- @Override
- public RedisFuture debugObject(K key) {
- return dispatch(commandBuilder.debugObject(key));
- }
-
- @Override
- public void debugOom() {
- dispatch(commandBuilder.debugOom());
- }
-
- @Override
- public RedisFuture debugReload() {
- return dispatch(commandBuilder.debugReload());
- }
-
- @Override
- public RedisFuture debugRestart(Long delay) {
- return dispatch(commandBuilder.debugRestart(delay));
- }
-
- @Override
- public RedisFuture debugSdslen(K key) {
- return dispatch(commandBuilder.debugSdslen(key));
- }
-
- @Override
- public void debugSegfault() {
- dispatch(commandBuilder.debugSegfault());
- }
-
- @Override
- public RedisFuture decr(K key) {
- return dispatch(commandBuilder.decr(key));
- }
-
- @Override
- public RedisFuture decrby(K key, long amount) {
- return dispatch(commandBuilder.decrby(key, amount));
- }
-
- @Override
- public RedisFuture del(K... keys) {
- return dispatch(commandBuilder.del(keys));
- }
-
- public RedisFuture del(Iterable keys) {
- return dispatch(commandBuilder.del(keys));
- }
-
- @Override
- public RedisFuture unlink(K... keys) {
- return dispatch(commandBuilder.unlink(keys));
- }
-
- public RedisFuture unlink(Iterable keys) {
- return dispatch(commandBuilder.unlink(keys));
- }
-
- @Override
- public RedisFuture discard() {
- return dispatch(commandBuilder.discard());
- }
-
- @Override
- public RedisFuture dump(K key) {
- return dispatch(commandBuilder.dump(key));
- }
-
- @Override
- public RedisFuture echo(V msg) {
- return dispatch(commandBuilder.echo(msg));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public RedisFuture eval(String script, ScriptOutputType type, K... keys) {
- return (RedisFuture) dispatch(commandBuilder.eval(script, type, keys));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public RedisFuture eval(String script, ScriptOutputType type, K[] keys, V... values) {
- return (RedisFuture) dispatch(commandBuilder.eval(script, type, keys, values));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public RedisFuture evalsha(String digest, ScriptOutputType type, K... keys) {
- return (RedisFuture) dispatch(commandBuilder.evalsha(digest, type, keys));
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public RedisFuture evalsha(String digest, ScriptOutputType type, K[] keys, V... values) {
- return (RedisFuture) dispatch(commandBuilder.evalsha(digest, type, keys, values));
- }
-
- @Override
- public RedisFuture exists(K key) {
- return dispatch(commandBuilder.exists(key));
- }
-
- @Override
- public RedisFuture exists(K... keys) {
- return dispatch(commandBuilder.exists(keys));
- }
-
- public RedisFuture exists(Iterable keys) {
- return dispatch(commandBuilder.exists(keys));
- }
-
- @Override
- public RedisFuture expire(K key, long seconds) {
- return dispatch(commandBuilder.expire(key, seconds));
- }
-
- @Override
- public RedisFuture expireat(K key, Date timestamp) {
- return expireat(key, timestamp.getTime() / 1000);
- }
-
- @Override
- public RedisFuture expireat(K key, long timestamp) {
- return dispatch(commandBuilder.expireat(key, timestamp));
- }
-
- @Override
- public RedisFuture> exec() {
- return dispatch(EXEC, null);
- }
-
- @Override
- public RedisFuture flushall() {
- return dispatch(commandBuilder.flushall());
- }
-
- @Override
- public RedisFuture flushallAsync() {
- return dispatch(commandBuilder.flushallAsync());
- }
-
- @Override
- public RedisFuture flushdb() {
- return dispatch(commandBuilder.flushdb());
- }
-
- @Override
- public RedisFuture flushdbAsync() {
- return dispatch(commandBuilder.flushdbAsync());
- }
-
- @Override
- public RedisFuture get(K key) {
- return dispatch(commandBuilder.get(key));
- }
-
- @Override
- public RedisFuture getbit(K key, long offset) {
- return dispatch(commandBuilder.getbit(key, offset));
- }
-
- @Override
- public RedisFuture getrange(K key, long start, long end) {
- return dispatch(commandBuilder.getrange(key, start, end));
- }
-
- @Override
- public RedisFuture getset(K key, V value) {
- return dispatch(commandBuilder.getset(key, value));
- }
-
- @Override
- public RedisFuture hdel(K key, K... fields) {
- return dispatch(commandBuilder.hdel(key, fields));
- }
-
- @Override
- public RedisFuture hexists(K key, K field) {
- return dispatch(commandBuilder.hexists(key, field));
- }
-
- @Override
- public RedisFuture hget(K key, K field) {
- return dispatch(commandBuilder.hget(key, field));
- }
-
- @Override
- public RedisFuture hincrby(K key, K field, long amount) {
- return dispatch(commandBuilder.hincrby(key, field, amount));
- }
-
- @Override
- public RedisFuture hincrbyfloat(K key, K field, double amount) {
- return dispatch(commandBuilder.hincrbyfloat(key, field, amount));
- }
-
- @Override
- public RedisFuture