Commit Graph
393 Commits
Author SHA1 Message Date
Nathan Harris 4e2217cffd Add support for Swift Package Index documentation hosting 2022-08-13 21:36:02 -05:00
Nathan Harris c76203c61a #103 -- Provide greater context to Pub/Sub Unsubscribe events 2022-08-13 00:22:18 -05:00
Nathan Harris 555062c62e [Docs] Fix symbol links resolution for various redis commands 2022-04-24 23:37:39 -05:00
Nathan Harris 820820d877 Significantly Improve the Configuration API for Pools and Connections
## Motivation

The API for establishing the configuration of a connection pool had a lot of jargon and properties that developers had issues keeping straight and understanding what each does.

This commit provides first-class API support for concepts such as retry strategies, and how the pool handles connection counts.

## Changes

- Add: New ConnectionCountBehavior for determining leaky / non-leaky behavior
- Add: New ConnectionRetryStrategy for allowing customization of retry behavior
- Change: RedisConnection.defaultPort to be a computed property
- Change: The logging keys of pool connection retry metadata
- Rename: Several configuration properties to drop prefixes or to be combined into new structures

## Result

Developers should have a much better experience exploring the available configuration options for pools and connections, being able to understand how each piece works with the underlying system.
2022-04-24 23:37:39 -05:00
Nathan Harris eedf1581cf Replace remaining usage of pipeline.removeHandler(_:) 2022-04-24 04:29:33 +00:00
Nathan Harris cfb99ba0f7 #100 -- Fix addPubSubHandler not checking if already added 2022-04-24 03:34:10 +00:00
Nathan Harris 284b7f09bc Add overload of ping command for nil message style 2022-04-19 23:18:26 -05:00
Nathan Harris 9da5773e7a 92 -- Accept event loop and logger in RedisClient commands
There are many times that developers want exact control over which EventLoop will be executing their chained EventLoopFuture callbacks
and which Logger will do the logging in calls deep within RediStack.

All commands will now accept an optional EventLoop and Logger to hop to, and using the logger for desired logs.
2.0.0-alpha.4 2.0.0-experimental.1
2022-04-04 00:06:47 -05:00
Nathan Harris a4aec72592 Update command symbol docs to use DocC symbol references 2022-03-15 23:51:43 -05:00
Nathan Harris 20f6c45d76 Add DocC symbol reference file for RedisCommand 2022-03-15 23:51:43 -05:00
Nathan Harris d5f38b7b92 Add basic DocC files for modules 2022-03-15 23:51:43 -05:00
Nathan Harris 2d43c71fdd Add Package manifest for Swift 5.5 users for DocC 2022-03-15 23:51:42 -05:00
Nathan Harris 498b6a5eb5 Conform RedisCommand to Equatable 2022-03-15 23:38:13 -05:00
Nathan Harris 252b0b8061 Improve KEYS command to be more type-safe 2022-03-15 23:30:30 -05:00
Nathan Harris 370ef8c4ac 101 -- Add KEYS command 2022-03-15 21:12:22 -05:00
Nathan Harris 6c4ca52f74 104 -- Add real world test case to ensure revrange bug doesn't persist 2022-03-15 04:33:35 +00:00
Daniel Ramteke b449334c8a [Commands] Add STRLEN 2022-02-21 19:10:34 +00:00
Nathan Harris 8ff8b03907 [CI] Replace rules usage with only/except to correctly run nightlies 2021-11-07 22:39:02 -08:00
Nathan Harris 1ca0e9df41 [Docs] Update test matrix in README 2021-11-03 00:19:00 -07:00
Nathan Harris fed62a64b8 [CI] Only run CI builds against nightly images 2021-11-03 00:10:28 -07:00
Nathan Harris 9def1b9aab [CI] Restructure CI to be simpler with overrides 2021-11-02 23:44:46 -07:00
Nathan Harris 5ed6375e43 Set Swift 5.3 as the minimum version 2021-11-02 23:43:25 -07:00
Nathan Harris ad316a97ac 95 -- Add callback closure on RedisConnection invoked on channel close 2021-08-16 21:47:20 -07:00
Nathan Harris 2cc63ec8f2 [Docs] Add security policy 2021-06-01 14:05:30 -07:00
Peter Adams 3ca471b226 Get pubsub numsub working 1.1.1 2.0.0-alpha.3 2021-05-04 16:26:35 +00:00
Peter Adams e08b42616b Get pubsub numpat working 2021-05-03 20:49:16 +00:00
Peter Adams 410a5b2d03 Change the scan test to accept up to 8 odd keys
This attempts to fix #23
2021-05-03 20:43:04 +00:00
Peter Adams 9958e2d13b Fix pubsub channels 2021-05-02 20:39:18 +01:00
Nathan Harris f0d123fdaa Disable scan unit tests again as they are still flaky 2021-04-29 09:31:38 -07:00
Peter Adams 0c13e4f26c Get scan working on the same as redis-cli 6.2.1 2021-04-28 13:45:06 +01:00
Nathan Harris 03a066f8f5 Audit log message severity levels
Motivation:

Following the SSWG guidelines for libraries and log levels, because much of the library's behavior is expressed in the language and NIO framework as errors and failed ELFs, logging at error is "verbose" and takes away control from developers.

Modifications:

Log messages have been adjusted to more accurately represent when and how the log message should be used, especially when ELFs are failed or errors are thrown.

Result:

Developers won't have log messages at error or critical unless they opt-in from their own code, unless the library has no way of expressing the failure condition through the language.
2021-04-08 20:22:10 -07:00
Peter Adams 328ef17c2c Correct minor typo in documentation 2021-03-16 15:48:41 +00:00
Nathan Harris c8637c1ffa [Docs] Update README to include new dependency 2.0.0-alpha.2 2021-03-08 10:51:15 -08:00
Cory Benfield 1168ed09f7 Add support for service discovery.
The newly-released Service Discovery framework gives us the interesting
opportunity to make RediStack aware of complex service discovery tools.
This patch supplies a simple adaptor to integrat Service Discovery with
RediStack's pooled client, allowing users to work with arbitrary service
discovery systems.
2021-03-08 17:18:38 +00:00
Cory Benfield 338a6f4aa1 Delay connection attempts without addresses.
In some circumstances users may have connection pools configured without
any SocketAddresses ready to go. This is particularly likely in service
discovery configurations. Right now, the effect of attempting to use
such a pool is two fold. First, we'll emit a bunch of error level logs
telling users we have no addresses. Second, we'll fall into the
exponential backoff phase of connection establishment.

The first property is annoying, but the second one is actively harmful.
If your construction is timed incorrectly, we'll have the awkward
problem of burning a bunch of CPU trying to create connections we know
we cannot, and then a lengthy delay after the addresses are actually
configured before we start trying to use them. That's the worst of all
worlds.

This patch adds logic to detect the attempt to create connections when
we don't have any configured addresses and delays them. This path should
improve performance and ergonomics when in this mode.
2021-03-03 21:53:45 +00:00
Nathan Harris 5b05e26300 Remove 1.x deprecation support 2021-02-22 11:08:04 -08:00
Nathan Harris 79d0fd8652 [Docs] Update README to use emoji instead of markdown for docsgen 2.0.0-alpha.1 2021-02-16 11:14:36 -08:00
Nathan Harris 40d521c148 [Docs] Update README to better reflect the reality of the library's development 2021-02-16 11:08:03 -08:00
Nathan Harris e2e8890cbf [CI] Add definition for 5.4 docker images, update README 2021-02-16 11:01:44 -08:00
Nathan Harris edb550f233 [CI] Simplify config setup 2021-02-06 20:12:03 -08:00
Nathan Harris 3c6713038d Refactor RedisCommand into a general use object
Motivation:

RediStack today represents a command as a temporary object for the purpose of writing to the channel.

While it is useful to have an object for that purpose, commands handled in this way require immediate execution
and aren't available for other purposes.

Commands can serve a better purpose as a lightweight object to support delayed execution,
so that pipeling as described in issue #63 could be possible.

Modifications:

- Add: `get` overloads for JSON codable interaction on `RedisClient`
- Add: New `RedisZRangeResultOption` type for better interactions with zrange operations that can optionally return scores
- Add: New `RedisHashFieldKey` for type-safety when working with Hash field keys much like `RedisKey`
- Change: A few API types from enums to structs for library evolution
- Change: `RedisCommandHandler` to operate on a tuple of `RESPValue, EventLoopPromise<RESPValue>` rather than `RedisCommand`
- Change: `RedisCommand` to be a generic struct with the keyword, arguments, and a transform closure to defer execution
- Change: Almost all `RedisClient` command extensions to be factory methods on `RedisCommand` instead
- Change: Many response types to be optional to avoid developers having to do `isNull` checks on their own
- Change: `RedisClient.send(command:arguments:)` to be generic with `send(_:)` as the signature
- Rename: RedisClient extensions for scan methods to be more discoverable and legible as `scanHashField`, etc.

Result:

It should be easier to support a clean pipelining API with deferred command execution,
with extensions being easier for 2nd party developers, and the maintenance overhead of all of the command extensions
should be a little lighter when it comes to changing HOW commands are sent such as adding a context parameter
2020-12-02 08:41:59 +00:00
Nathan Harris 61fb40b194 Remove Trunk column of historical test matrix in README 2020-12-02 00:41:19 -08:00
Nathan Harris ba35a1f91d Add historical test matrix to README 2020-12-02 00:39:43 -08:00
Nathan Harris b148491635 Set Swift 5.2 as the minimum version 2020-12-02 00:29:17 -08:00
Nathan Harris 8bf26fb661 Rename RedisKeyLifetime to be nested in RedisKey
Motivation:

`RedisKeyLifetime` already has "RedisKey" as a prefix so it naturally fits as a nested type.

Modifications:

- Change: `RedisKeyLifetime` to be nested in `RedisKey` and named `Lifetime`
- Rename: `RedisKeyLifetime.Lifetime` to `Duration`
- Deprecate: `RedisKeyLifetime` and the nested type `Lifetime`

Result:

The global namespace is a little less cluttered with the types falling naturally where they already are.
2020-11-27 14:05:14 -08:00
Nathan Harris b2367ac33e 81 -- Add Configuration types for initialization 1.1.0 2020-11-22 00:17:22 -08:00
Nathan Harris ec1a38ba7f Update README to clarify Swift version support and update process 2020-11-22 03:53:14 +00:00
Nathan Harris 02ab82c1ac Update README to have latest correct information regarding versions 2020-11-22 03:45:14 +00:00
Nathan Harris 833fc33881 Fix RedisConnectionPool.leaseConnection code example 2020-10-18 18:48:46 +00:00
Nathan Harris 61cc879efe Change RedisConnection to end subscriptions when not allowed
Motivation:

When `RedisConnection.allowSubscriptions` is set to `false`, the connection could still be in a subscription state
leaving further commands to fail slowly from a full roundtrip to Redis, rather than succeeding as expected.

This changes the implementation so that it triggers a full unsubscribe from patterns and channels when set to `false`.

Modifications:

- Change: `RedisConnection.allowSubscriptions` to call `unsubscribe()` and `punsubscribe()` when set to `false`
- Change: `RedisPubSubHandler` to prefix storage of all dictionary keys to avoid name clashes between pattern and channel subscriptions

Result:

Developers should now have more deterministic and unsurprising behavior with PubSub
in regards to subscription management and connection state.
1.0.0
2020-10-16 22:14:56 -07:00