Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Introduce Valkey client overview #164

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions clients/go/github.com/valkey/valkey-go.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure of the value of this directory structure (e.g.clients/go/github.com/valkey/valkey-go.json). Seems like some remnant of something that other datastore was doing.

It might be worth just moving stuff around to be: clients/go/valkey-go.json

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean for Go specifically or for all of the clients directory?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As per the sync off GitHub, my indication was that we should get rid of the strange inherited directory structure and flatten this moving forward. IIRC @zuiderkwast and I also had a similar conversation a while back.

My opinion on the pre-existing client JSON files that aren't included in this PR is that should be moved elsewhere since they aren't used here.

Copy link
Contributor

@zuiderkwast zuiderkwast Jan 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As per the sync off GitHub, my indication was that we should get rid of the strange inherited directory structure and flatten this moving forward. IIRC @zuiderkwast and I also had a similar conversation a while back.

Yes, I agree. Instead of encoding the URL in the file path, we can add a JSON field like "repository": "https://github.com/ptaoussanis/carmine" (an actively maintained Closure client). It used do be this way before the commit 32574aa but then, all clients were in one huge JSON file. That's not good either. I suggest we put them as clients/LANGUAGE/NAME.json. I don't think there are name collissions for the same language.

My opinion on the pre-existing client JSON files that aren't included in this PR is that should be moved elsewhere since they aren't used here.

Here I'm of a different opinion.

There are clients in 56 languages, many that probably still work. Many users only use GET and SET anyway and even for those users, latest Valkey has a lot of improvememts. Until the fork happened, I know people regularly contributed clients to this list. The last one was for the Balleria language IIRC. Languages like Scheme, R, Objective-C, Clojure, etc. have a lot of users and listing them shows how huge the community is (or has been) IMO. Redis obviously ignores the community efforts, but I think it's a bad idea to do the same. I think we should list them, but with a disclaimer. We can even hide them by default but present a checkbox Show 3rd party clients or so. They're just links and we can't verify the quality of each of them.

For the rendering code, it's easy to detect an old client by checking if the JSON file contain some field like "valkey_version_compatibility". If it doesn't, it means it's old and we didn't verify the compatibility. We need the client users or authors to verify this and update the information. For that to happen, they need to be visible somewhere.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zuiderkwast WRT the other client JSON files, I'm more/less okay the trajectory you describe.

I guess I'm mostly concerned with unblocking the /clients/ page which explicitly about Valkey clients and only lists the specific clients outlined here.

The other clients are Redis clients (which should work and I'm fine) but manipulating all other ones doesn't actually move anything forward today for the docs nor website.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, fine. Incremental perfection. :)

"name": "valkey-go",
"description": "A fast Golang Valkey client that does auto pipelining and supports server-assisted client-side caching.",
"github":"https://github.com/valkey-io/valkey-go",
"installation": "go get github.com/valkey-io/valkey-go",
"language":"Go",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand this field: Valkey didn't change the API between 8.0 and 7.2 - what makes it 'compatible'?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Supporting Valkey 8.0 features like AZ affinity, supporting new commands (like script show, cluster slot stats), and commands that were modified in 8.0.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gotcha. This is more of a version compliance number than compatibility field. Might be good the make that clear in the identifier.

"pubsub_state_restoration": true,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": true,
"client_capa_redirect": false,
"persistent_connection_pool": true
}
28 changes: 28 additions & 0 deletions clients/java/github.com/valkey/valkey-GLIDE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "Valkey GLIDE",
"description": "Valkey GLIDE is designed for reliability, optimized performance, and high-availability, for Valkey and Redis OSS based applications. GLIDE is a multi language client library, written in Rust with programming language bindings, such as Java, node.js and Python.",
"github":"https://github.com/valkey-io/valkey-glide/tree/main/java",
"installation": [
{
"type": "Maven",
"command": "<dependency>\n <groupId>io.valkey</groupId>\n <artifactId>valkey-glide</artifactId>\n <version>1.2.0</version>\n</dependency>"
},
{
"type": "Gradle",
"command":"implementation 'io.valkey:valkey-glide:1.2.0"

}
],
"language":"Java",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "8.0",
"pubsub_state_restoration": true,
"cluster_scan": true,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": true,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": false
}
28 changes: 28 additions & 0 deletions clients/java/github.com/valkey/valkey-java.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "valkey-java",
"description": "valkey-java is Valkey's Java client, dedicated to maintaining simplicity and high performance.",
"github":"https://github.com/valkey-io/valkey-java",
"installation": [
{
"type": "Maven",
"command": "<dependency>\n <groupId>io.valkey</groupId>\n <artifactId>valkey-java</artifactId>\n <version>5.3.0</version>\n</dependency>"
},
{
"type": "Gradle",
"command":"implementation 'io.valkey:valkey-java:5.3.0'"

}
],
"language":"Java",
"package_size": "",
"read_from_replica": false,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
"pubsub_state_restoration": false,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": true
}
4 changes: 0 additions & 4 deletions clients/nodejs/github.com/AWS/GLIDE-for-Redis.json

This file was deleted.

18 changes: 18 additions & 0 deletions clients/nodejs/github.com/valkey/iovalkey.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "iovalkey",
"description": "A robust, performance-focused and full-featured Redis client for Node.js.",
"github":"https://github.com/valkey-io/iovalkey",
"installation": "npm install iovalkey",
"language":"JavaScript/Node.js",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
"pubsub_state_restoration": false,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": true
}
18 changes: 18 additions & 0 deletions clients/nodejs/github.com/valkey/valkey-GLIDE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "Valkey GLIDE",
"description": "Valkey GLIDE is designed for reliability, optimized performance, and high-availability, for Valkey and Redis OSS based applications. GLIDE is a multi language client library, written in Rust with programming language bindings, such as Java, node.js and Python.",
"github":"https://github.com/valkey-io/valkey-glide/tree/main/node",
"installation": "npm install valkey-glide",
"language":"JavaScript/Node.js",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "8.0",
"pubsub_state_restoration": true,
"cluster_scan": true,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": true,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": false
}
19 changes: 16 additions & 3 deletions clients/php/github.com/nrk/predis.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
{
"name": "Predis",
"description": "Mature and supported",
"recommended": true,
"description": "A flexible and feature-complete Redis client for PHP.",
"twitter": [
"JoL1hAHN"
]
],
"github":"https://github.com/predis/predis",
"installation": "pecl install redis",
"language":"PHP",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
"pubsub_state_restoration": false,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": true,
"client_capa_redirect": false,
"persistent_connection_pool": false
}
19 changes: 16 additions & 3 deletions clients/php/github.com/phpredis/phpredis.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
{
"name": "phpredis",
"description": "This is a client written in C as a PHP module.",
"recommended": true,
"description": " A PHP extension for Redis, offering high performance and a native API.",
"twitter": [
"grumi78",
"yowgi",
"yatsukhnenko"
]
],
"github":"https://github.com/phpredis/phpredis",
"installation": "composer require predis/predis",
"language":"PHP",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
"pubsub_state_restoration": false,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": true,
"client_capa_redirect": false,
"persistent_connection_pool": true
}
4 changes: 0 additions & 4 deletions clients/python/github.com/AWS/GLIDE-for-Redis.json

This file was deleted.

18 changes: 18 additions & 0 deletions clients/python/github.com/valkey/valkey-GLIDE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "Valkey GLIDE",
"description": "Valkey GLIDE is designed for reliability, optimized performance, and high-availability, for Valkey and Redis OSS based applications. GLIDE is a multi language client library, written in Rust with programming language bindings, such as Java, node.js and Python.",
"github":"https://github.com/valkey-io/valkey-glide/tree/main/python",
"installation": "pip install valkey-glide",
"language":"Python",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "8.0",
"pubsub_state_restoration": true,
"cluster_scan": true,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": true,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": false
}
18 changes: 18 additions & 0 deletions clients/python/github.com/valkey/valkey-py.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "valkey-py",
"description": "The Python interface to the Valkey key-value store.",
"github":"https://github.com/valkey-io/valkey-py",
"installation": "pip install valkey",
"language":"Python",
"package_size": "",
"read_from_replica": true,
"smart_backoff_to_prevent_connection_storm": true,
"valkey_version_compatibility": "7.2",
"pubsub_state_restoration": false,
"cluster_scan": false,
"latency_based_read_from_replica": false,
"AZ_based_read_from_replica": false,
"client_side_caching": false,
"client_capa_redirect": false,
"persistent_connection_pool": true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How does this take into account language specific properties? For example IIRC, valkey-py is synchronous or async, GLIDE is async. That's super relevant for someone picking a client in python but not at all for other languages.

There are others I'm sure as well.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we could add a sentence to the description for this sort of stuff where it seems necessary? I think it's better to put it in the upper part and not in the feature table, it will get messy and the table focuses on the specific features that are explained above.
Do you have other ideas for worth mentioning criteria?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should probably add some sort of semi-free form array for high specific features. That way we can render them in the same way instead of making people read the description paragraphs.

}
35 changes: 35 additions & 0 deletions topics/client-list.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: "Client list"
description: Overview of Valkey clients and features
---

Selecting the right client is a complex task, given that there are over 200 clients compatible with Valkey across different programming languages. This document offers an overview of recommended Valkey clients for various programming languages. To be included in this list, a client must support a mandatory set of features, such as TLS support and cluster mode. Additionally, a table of advanced features supported by the respective clients is provided, highlighting the unique advantages of one client over another.

Mandatory Features Overview
----
1. **Cluster Support** - The ability to operate in a clustered environment, where the data is distributed across multiple shards. Cluster support is essential for applications that require high scalability.

2. **TLS/SSL Support** - The capability to establish secure connections using TLS/SSL, which encrypts the data transmitted between the client and the server. This is a critical feature for applications that require data privacy and protection against eavesdropping.

Advanced Features Overview
-----

1. **Read from Replica** - The ability to read data from a replica node, which can be useful for load balancing and reducing the load on the primary node. This feature is particularly important in read-heavy applications.

2. **Smart Backoff to Prevent Connection Storm** - A strategy used to prevent connection storms by progressively updating the wait time between retries when attempting to reconnect to a Valkey server. This helps to reduce the load on the server during topology updates, periods of high demand or network instability.

3. **Valkey Version Compatibility** - Indicates which versions of Valkey the client is compatible with. This is crucial for ensuring that the client can leverage the latest features and improvements in the Valkey server.

4. **PubSub State Restoration** - The ability to restore the state of Pub/Sub (publish/subscribe) channels after a client reconnects. This feature ensures that clients can continue receiving messages after disconnections or topology updates such as adding or removing shards, for both legacy Pub/Sub and sharded Pub/Sub. The client will automatically resubscribe the connections to the new node. The advantage is that the application code is simplified, and doesn’t have to take care of resubscribing to new nodes during reconnects.

5. **Cluster Scan** - This feature ensures that the user experience and guarantees for scanning a cluster are identical to those for scanning a single node. The SCAN function operates as a cursor-based iterator. With each command, the server provides an updated cursor, which must be used as the cursor argument in subsequent calls. A complete iteration with SCAN retrieves all elements present in the collection from start to finish. If an element exists in the collection at the beginning and remains until the end of the iteration, SCAN will return it. Conversely, any element removed before the iteration begins and not re-added during the process will not be returned by SCAN. A client supporting this feature ensures the scan iterator remains valid even during failovers or cluster scaling (in or out) during the SCAN operation.

6. **Latency-Based Read from Replica** - This feature enables reading data from the nearest replica, i.e., the replica that offers the best latency. It supports complex deployments where replicas are distributed across various distances, including different geographical regions, to ensure data is read from the closest replica, thereby minimizing latency.

7. **AZ-Based Read from Replica** - This feature enables reading data from replicas within the same Availability Zone (AZ). When running Valkey in a cloud environment across multiple AZs, it is preferable to keep traffic localized within an AZ to reduce costs and latency. By reading from replicas in the same AZ as the client, you can optimize performance and minimize cross-AZ data transfer charges. For more detailed information about this feature and its implementation, please refer to the following link: https://github.com/valkey-io/valkey/pull/700

8. **Client Side Caching** - Valkey client-side caching is a feature that allows clients to cache the results of Valkey queries on the client-side, reducing the need for frequent communication with the Valkey server. This can significantly improve application performance by lowering latency, reducing the network usage and cost and reducing the load on the Valkey server.

9. **`CLIENT CAPA redirect` Support** - The `CLIENT CAPA redirect` feature was introduced in Valkey 8 to facilitate seamless upgrades without causing errors in standalone mode. When enabled, this feature allows the replica to redirect data access commands (both read and write operations) to the primary instance. This ensures uninterrupted service during the upgrade process. For more detailed information about this feature, please refer to the following link: https://github.com/valkey-io/valkey/pull/325

10. **Persistent Connection Pool** - This feature enables the Valkey client to maintain a pool of persistent connections to the Valkey server, improving performance and reducing overhead. Instead of establishing a new connection for each request, the client can reuse existing connections from the pool, minimizing the time and resources required for connection setup.
1 change: 1 addition & 0 deletions topics/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Programming with Valkey
* [Client side caching](client-side-caching.md): How a client can be notified by the server when a key has changed.
* [Keyspace notifications](notifications.md): Get notifications of keyspace events via Pub/Sub.
* [Protocol specification](protocol.md): The client-server protocol, for client authors.
* [Client list](client-list.md): An overview of recommended Valkey clients and their features.

Server-side scripting in Valkey
---
Expand Down
7 changes: 7 additions & 0 deletions wordlist
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,12 @@ autoload
autoloader
autoloading
Autoloading
AZs
B1
B2
B3
backend
Backoff
backported
backslashed
backticks
Expand Down Expand Up @@ -301,6 +303,7 @@ go-redis
Gottlieb
gpg
Gradle
Golang
Hacktoberfest
hacktoberfest
handleClientsWithPendingWrites
Expand Down Expand Up @@ -358,6 +361,8 @@ invalidations
iojob
IOPs
iostat
iovalkey
ioredis
IoT
ip
ip:port
Expand Down Expand Up @@ -579,6 +584,7 @@ perf_events
performance-on-cpu
PFAIL
php-redis-lock
phpredis
PHPRedisMutex
pid
pidfile
Expand Down Expand Up @@ -623,6 +629,7 @@ programmatically-generated
pseudorandom
PSR-4
Pubsub
PubSub
pubsub
PubSub-related
Pubsub.
Expand Down
Loading