Revision history for Net-Async-Redis

6.006     2024-12-11 23:15:20+08:00 Asia/Singapore
    [Bugs fixed]

    - live migrations in a cluster would return the ASK error, we now handle that
    automatically rather than propagating it back to the client (with a limit on
    the number of attempts we'll make, to avoid cycles and broken cluster situations)

6.005     2024-11-08 23:45:45+08:00 Asia/Singapore
    [New features]

    - automatic creation of Redis methods based on extracted keyspec as a fallback

    [Bugs fixed]

    - documentation and code disagreed on the `use_read_replica` parameter, both are now supported
    but will emit a warning if the undocumented form is used

6.004     2024-11-06 08:35:33+08:00 Asia/Singapore
    [New features]

    - cluster direct access to replica connection via `$node->replica_connection`
    - direct all read-only queries to replicas instead of primaries via `use_read_replica` parameter
    to Net::Async::Redis::Cluster constructor or `->configure` method
    - latest command spec imported as of 2024-11-04

6.003     2024-10-23 06:15:05+08:00 Asia/Singapore
    [Bugs fixed]

    - SSUBSCRIBE and SPUBLISH were not correctly applying slot mapping, which could lead to infinite loops in a cluster

6.002     2024-09-18 07:44:19+08:00 Asia/Singapore
    [Bugs fixed]

    - switch back to plain inheritance, since Object::Pad rôles do not yet allow
    method overrides - this was causing issues with Net::Async::Redis::Cluster methods
    not being available

6.001     2024-09-15 09:27:56+08:00 Asia/Singapore
    [New features]

    - should handle reconnect more gracefully when commands are queued and
    the current connection drops

    [Bugs fixed]

    - some potential cases where protocol may go out of sync when there's an error during MULTI

    [Internal]

    - refactored to use an Object::Pad rôle for the command list

6.000     2024-01-28 05:00:01+08:00 Asia/Singapore
    [New features]

    - Initial OpenTelemetry support, thanks to JJATRIA's work on implementing (see OpenTelemetry::SDK).
    Note that this is expected to evolve in future as more async support is added to the OpenTelemetry
    SDK.

    [Bugs fixed]

    - some configuration features, such as clientside caching, could end up triggering a rapid memory
    leak due to interactions with Syntax::Keyword::Dynamically, the connection code has been refactored
    to avoid this (partially related to https://rt.cpan.org/Public/Bug/Display.html?id=148742)

5.001     2023-11-15 13:42:42+08:00 Asia/Singapore
    [New features]

    - helper methods for some standard cluster commands with no keys - these previously failed and
    generated warnings, now they accumulate results from all primary nodes and return the aggregated
    results
    - fall back to a random node when no keys are found for other commands
    - we now use the same primary connection across multiple slots, reduces the connection count when
    the shards are highly fragmented

5.000     2023-11-05 21:22:40+08:00 Asia/Singapore
    [Refactoring]

    - migrated to Object::Pad, for better OO handling (still uses a hashref-based object
    implementation, for backwards compatibility). Since this has the potential to be a big
    change, and may affect backward compatibility, the major version has been increased,
    and the Object::Pad migration will be released in steps during this version series
    (e.g. conversion to `field` instead of `$self->{accessor}`, move Net::Async::Redis::Commands
    to a rôle)
    - MULTI handling rewritten to handle cluster mode and mixed regular/transactional commands
    better

    [Bugs fixed]

    - previous versions exhibited excessive memory usage and poor performance when attempting
    to call MULTI within MULTI, the refactoring now includes tests to cover this scenario

4.002     2023-10-26 11:39:40+08:00 Asia/Singapore
    [Bugs fixed]

    - previously unable to connect to a single-node cluster, since the CLUSTER SLOTS
    output did not include any host/IP information (single-node clusters are not recommended,
    but useful for testing and local development!)
    - subscription on a cluster would fail since the subscription key isn't sharded
    - connection closure by the Redis server should be handled better now

4.001     2023-09-21 06:39:51+08:00 Asia/Singapore
    [Bugs fixed]

    - MULTI/EXEC were emitting a log message at `info` level

4.000     2023-08-27 01:12:09+08:00 Asia/Singapore
    [New features]

    - latest commands imported via `COMMAND LIST`, covering Redis 7.2
    - support for key spec parsing via https://redis.io/docs/reference/key-specs/

    [Bugs fixed]

    - MULTI/EXEC support overhaul for Net::Async::Redis::Cluster

3.024     2023-06-29 12:19:45+08:00 Asia/Singapore
    [New features]

    - helper method to allow Net::Async::Redis::Cluster::XS to ensure it's getting XS-backed nodes

3.023     2023-05-08 04:37:32+08:00 Asia/Singapore
    [New features]

    - support for sharded pubsub (`SSUBSCRIBE` / `SPUBLISH`)

    [Bugs fixed]

    - exception during subscription cancellation, thanks to Pavel Shaydo for patch+test
    - subscription handling should now work properly and consistently on both RESP2/RESP3
    - `XREAD`/`XREADGROUP` now returns empty arrayref when no items, for consistency
    - cancelling a cached `GET` could cause an exception due to the request Future going out of scope

3.022     2022-03-21 02:11:58+08:00 Asia/Kuala_Lumpur
    [New features]

    - Added latest commands as of 7.0 RC2

3.021     2022-02-24 23:13:49+08:00 Asia/Kuala_Lumpur
    [New features]

    - to improve compatibility in future, the approach for handling multi-word commands
    such as `XGROUP CREATE` now applies to all commands, including cases such as `MEMORY DOCTOR`
    so you can use `->memory('DOCTOR')` or `->memory_doctor` interchangeably. This is
    due to the command list we auto-extract from the Redis website potentially changing
    the structure again in future.

3.020     2022-02-17 17:47:08+08:00 Asia/Kuala_Lumpur
    [Bugs fixed]

    - the ->xgroup method was still not available in Net::Async::Redis::Cluster due to
    an incomplete fix in 3.019, thanks to Nael Alolwani for catching and fixing this

3.019     2022-02-16 15:42:23+08:00 Asia/Kuala_Lumpur
    [Bugs fixed]

    - the ->xgroup method was not available due to 7.0 changes, added back in

3.018     2022-02-01 11:58:52+08:00 Asia/Kuala_Lumpur
    [New features]

    - Added latest commands from Redis 7.0 release candidate

3.017     2021-10-18 00:15:14+08:00 Asia/Kuala_Lumpur
    [New features]

    - Added ->client_no_evict from latest Redis

3.016     2021-09-26 02:23:34+08:00 Asia/Kuala_Lumpur
    [New features]
    - Added readonly methods from latest Redis, e.g. `->sort_ro` and `->bitfield_ro`

3.015     2021-07-27 03:47:43+08:00 Asia/Kuala_Lumpur
    [Bugs fixed]
    - The CLUSTER INFO command generated warnings (RT138053, thanks to Nael for
    reporting)

3.014     2021-07-20 18:37:09+08:00 Asia/Kuala_Lumpur
    [New features]

    - ->expiretime and ->eval_ro from latest commands list

3.013     2021-04-27 10:28:39+08:00 Asia/Kuala_Lumpur
    No new features.

    Bugs fixed:

    - removed `dynamically` usage for `$log->{context}` since it can trigger a
    memory leak and also affects performance, see:
    https://github.com/binary-com/perl-Myriad/issues/117 for an example

3.012     2021-04-22 21:26:23+08:00 Asia/Kuala_Lumpur
    New features:

    - automatic connection and queuing is now more reliable, you should only
    need `await $redis->connected` in a few cases now
    - acess to client-side invalidation events, for implementing observables
    - enable keyspace notifications in cluster mode

    Bugs fixed:

    - various issues with client-side caching resolved
    - in cluster mode, XREAD could fail due to incorrect node lookup for key
    (Github #23, thanks to Marc Frank for the patch)
    - the stream read/write lengths were using the same internal key,
    so any changes to one value would affect the other as well
    - XINFO was mapping to the wrong key in cluster mode, thanks to Eyad for
    catching and fixing this

3.011     2021-02-03 03:43:05+08:00 Asia/Kuala_Lumpur
    New features:

    - ->failover added from latest commands list

3.010     2021-02-01 04:56:52+08:00 Asia/Kuala_Lumpur
    New features:

    - ->bootstrap will now fail if the cluster's nodes addresses are not initiated.
    - cluster->execute_command will now redirect the command to the correct node 
      if 'MOVED' error received.
    - latest commands from 6.2
    - this includes ->getdel, ->getex, ->zrandfield

3.009     2021-01-27 06:33:18+08:00 Asia/Kuala_Lumpur
    No new features.

    Bugs fixed:

    - `XGROUP` KEY_FINDER index was wrong.
    - `PUBLISH`/`SUBSCRIBE` were not in the KEY_FINDER index.
    - Net::Async::Redis::Cluster was ignoring the protocol compatibility layer.

3.008     2021-01-17 01:29:19+08:00 Asia/Kuala_Lumpur
    New features:

    - latest commands from 6.2
    - this includes ->xautoclaim, ->client_unpause and the `count => 'any'` option
    on various commands

3.007     2020-12-31 07:23:30+08:00 Asia/Kuala_Lumpur
    New features:

    - latest commands from 6.2
    - this includes ->geosearch, ->client_info, ->client_trackinginfo etc.

3.006     2020-12-04 05:33:59+08:00 Asia/Kuala_Lumpur
    New features:

    - latest commands from 6.0.9
    - ->copy is now supported (from latest Redis release)
    - stream handling now documents `MKSTREAM` and `NOMKSTREAM`,
    and updates the trimming to mention `~` (approximate) and `=`
    (exact) modes for removing old entries

3.005     2020-11-16 05:20:49+08:00 Asia/Kuala_Lumpur
    New features:

    - ->zdiff and ->zdiffstore commands from latest Redis release
    - provide RESP2/RESP3 compatibility when hashrefs option is not enabled,
    otherwise some commands such as ->xreadgroup can return inconsistent
    results between versions (thanks Eyad, Paul and Nael for the patch)
    - cluster mode now provides basic slot calculation caching, since this
    yields a small performance improvement

3.004     2020-11-04 12:40:40+08:00 Asia/Kuala_Lumpur
    No new features.

    Bugs fixed:

    - top-level hashes also now follow the `hashrefs` configuration option,
    this affects methods such as `->xreadgroup`.

3.003     2020-11-03 13:58:00+08:00 Asia/Kuala_Lumpur
    No new features.

    Bugs fixed:

    - RESP3 protocol changes (enabled by default in earlier versions of this module)
    meant that you'd end up with hashrefs or arrayrefs depending on what version
    of Redis you were connecting to. This behaviour is now controlled by the
    `hashrefs` configuration option, and is disabled by default even under RESP3.

3.002     2020-10-12 00:19:11+08:00 Asia/Kuala_Lumpur
    New features:

    - latest commands from 6.0.8, including LMOVE/BLMOVE

3.001     2020-09-22 01:51:28+08:00 Asia/Kuala_Lumpur
    New features:

    - RESP3 no longer establishes a separate client-side caching connection,
    since it can share the main connection
    - `AUTH username password` from latest Redis now supported

    Bugs fixed:

    - proper differentiation between regular arrays and pubsub messages
    when in pubsub mode on a RESP3 connection
    - avoid establishing client-side caching connection until we need one,
    could also have resulted in an attempt to connect to the wrong Redis server
    if using `->configure(host => ...); ->configure(port => ...);`
    - on a failure, continue with next item in pipeline - otherwise subsequent
    requests would get stuck

3.000     2020-09-14 02:00:10+08:00 Asia/Kuala_Lumpur
    New features:

    - RESP3 support, for Redis 6
    - pubsub is now allowed on the same connection as
    other traffic if the connection is in RESP3 mode
    - protocol is autodetected via `HELLO` command,
    pass `protocol => 'resp2'` to disable this

2.007     2020-09-05 02:08:25+08:00 Asia/Kuala_Lumpur
    New features:

    - applies client_name on connection if configured
    - opentracing can be controlled by `->configure(opentracing => 1 || 0)`

    Note that OpenTracing support is now *disabled* by default, since it
    incurs a small (~5%) performance penalty. The USE_OPENTRACING env var
    is still supported for enabling/disabling globally.

2.006     2020-08-26 10:23:47+08:00 Asia/Kuala_Lumpur
    New features:

    - latest command updates from Redis 6.0.6 - main change here is ->lpos
    renaming "first" to "rank", see https://redis.io/commands/lpos
    - Redis database selection via URI or `database` ->configure parameter
    - OpenTracing support via OpenTracing::Any

2.005     2020-06-28 00:20:52+08:00 Asia/Kuala_Lumpur
    New features:

    - LPOS method added from latest Redis release

    Bugs fixed:

    - URI parameter without `redis://` prefix is now upgraded,
    allowing `->new(uri => 'localhost:1234')` (Github issue #7,
    thanks LeoNerd)
    - pipelining encoding bug (Github issue #14, thanks to dankroboth
    for reporting and highlighting the faulty code)

2.004_001 2020-06-01 06:46:51+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    New features:

    - initial client-side caching support for ->get calls,
    pass client_side_caching_size => $size to enable.
    Please note that this key is likely to change in a future version.

2.004     2020-06-01 05:29:32+08:00 Asia/Kuala_Lumpur
    New features:

    - acl_getuser and related commands added
    - client-side caching documentation updated

2.003     2020-05-01 00:37:12+08:00 Asia/Kuala_Lumpur
    New features:

    - latest commands from Redis 6.0 GA release

    This is intended to be a stable release with next phase of
    development aimed at supporting the newer RESP3 protocol:
    https://github.com/antirez/RESP3

2.002_005 2020-04-29 02:50:10+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    No new features.

    Bugs fixed:

    - the ->multi return value was a nested Future, changing the result
    compared to previous versions - thanks to Nael for reporting
    - subscribe/psubscribe interleaved with ping or other requests
    could get confused about the pending queue

2.002_004 2020-04-23 02:19:48+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    New features:

    - pipeline parameter now does something, set to 0 to allow "unlimited"
    pipelined requests (as in keep trying until the Redis server stops listening
    to process the backlog)

2.002_003 2020-04-23 01:59:30+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    No new features.

    Bugs fixed:

    - MULTI implementation broke in the previous version

2.002_002 2020-04-14 01:40:41+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    New features:

    - Latest Redis has new ACL methods, including those in Commands.pm
    - simple ping latency example for testing

2.002_001 2020-04-03 22:02:06+08:00 Asia/Kuala_Lumpur (TRIAL RELEASE)
    New features:

    - Redis cluster support, https://redis.io/topics/cluster-spec
    - updated to latest Redis 5.x commands

2.001     2019-07-22 13:36:07+08:00 Asia/Kuala_Lumpur
    New features:

    - improved performance when issuing many Redis commands at once
    - ->watch_keyspace now provides a Ryu::Source instance
    - latest command parameters from redis.io (ABSTTL etc. for `restore`
    and TYPE for `scan`)

    New examples:

    - moving-window sum

2.000     2019-06-16 22:44:26+08:00 Asia/Kuala_Lumpur
    New features:

    - now requires Future::AsyncAwait

1.014     2019-02-04 02:05:21+08:00 Asia/Kuala_Lumpur
    New features:

    - increase default buffer sizes from 8KB to 1MB, to improve efficiency
    in the common case where there are only a few active Redis connections
    - support configurable buffer sizes via `stream_read_len` / `stream_write_len`

    New examples:

    - `incr-ratelimit-aa.pl` and `consumer-groups-aa.pl` for Future::AsyncAwait basic
    examples

    Bugs fixed:

    - the example for `->subscription` was wrong, thanks to Michael Mueller for catching
    and patching!
    - retain completion Future when executing commands

1.013     2018-12-10 02:03:19+08:00 Asia/Kuala_Lumpur
    New features:

    - support for `NOACK` and type parameter for `client_kill`, as provided in
    latest Redis 5.x release

1.012     2018-10-19 11:03:35+08:00 Asia/Kuala_Lumpur
    No new features.

    Examples:

    - Improved documentation for consumer-groups.pl example
    (tested against 5.0 release)

1.011     2018-10-06 20:50:12+08:00 Asia/Kuala_Lumpur
    No new features.

    Bug fixes:

    - error handling improved, previously requests were not marked as failed
    - protocol handling for 'undef' arrays (treated as `undef` now)

    Examples:

    - consumer-groups.pl example for XADD/XREADGROUP

1.010     2018-10-06 15:26:00+08:00 Asia/Kuala_Lumpur
    New commands:

    - CLIENT ID
    - CLIENT UNBLOCK

    from Redis 5.0rc5.

1.009     2018-10-03 19:26:59+08:00 Asia/Kuala_Lumpur
    Updated to latest Redis 5.0 commands from last RC prior to 5.0 release.

1.008     2018-09-27 11:28:37+08:00 Asia/Kuala_Lumpur
    No new features.

    Bug fixes:

    - The connection was cached even if connection failed/interrupted so reconnecting
    attempts were failing as well, now the connection object will get deleted on failure
    - Subscriptions were not cancelled when the connection being interrupted,
    now they are cancelled properly

    (thanks to Eyad Arnabeh for reporting and fixing)

1.007     2018-09-05 10:11:44+08:00 Asia/Kuala_Lumpur
    No new features.

    Bug fixes:

    - Support auth parameter, rather than insisting on auth information be passed as
    part of the URI (thanks to Nael Alolwani for reporting)
    - "Pipeline depth" notifications were logged at `info` level, these are an internal
    diagnostic and not useful for application code, these are now `trace` level messages

1.006     2018-07-12 22:39:10+08:00 Asia/Kuala_Lumpur
    No new features.

    Bug fixes:

    - PSUBSCRIBE wasn't working (reported by Bill Marriott and leonerd, fix+tests by leonerd,
    I did little more than hit the merge button - thanks!)

    Dependencies:

    - Math::Random::Secure dep was missing (thanks MANWAR!)

1.005     2018-01-06 18:18:22+08:00 Asia/Kuala_Lumpur
    No new features.

    Dependencies:

    - Class::Method::Modifiers, and make sure we have a recent version of Future.pm

1.004     2017-12-29 20:10:42+08:00 Asia/Kuala_Lumpur
    No new features.

    Performance improvements:

    - DISCARD/EXEC are now pipelined, we don't need to wait for the
    write before sending more commands


1.003     2017-12-26 18:00:36+08:00 Asia/Kuala_Lumpur
    New features:

    - support queuing for MULTI and other commands
    - support for passing a Redis URI
    - minor performance improvements in protocol implementation and event handling

    Bugs fixed:

    - it was possible for cancelled/failed items within ->multi to cause the protocol
    handling to go out of sync, this is now fixed.
    - multi-word commands were generated incorrectly, these now work again

    Examples:

    - `examples/job-hash-worker.pl` - reliable priority-queue worker with job
    details in separate hash key
    - `examples/job-hash-submit.pl` - submit requests for priority-queue workers


1.002     2017-12-11 06:06:47+08:00 Asia/Kuala_Lumpur
    Dependencies:

    - Explicit Log::Any dependency to ensure that context support is available

    New features:

    - PSUBSCRIBE support

1.001     2017-12-11 05:38:20+08:00 Asia/Kuala_Lumpur
    Dependencies:

    - Added Test::HexString and Test::Deep to test deps list

    New features:

    - Support for MULTI transactions via ->multi method

    Examples:

    - `examples/job-worker.pl` - Simple list-based job queue
    - `examples/multi.pl` - Transaction using MULTI

1.000     2017-12-09 16:51:40+08:00 Asia/Kuala_Lumpur
    First stable release. Note that there are some API changes, but
    previous code should work mostly unmodified.

    New features:

    - Dropped Protocol::Redis in favour of local implementation
    - Separated out commands into an autogenerated class to make
    it easier to keep up to date with protocol changes
    - Better support for subscriptions (see `examples/pub|sub.pl`)
    - Dropped JSON::MaybeXS and Mixin::Event::Dispatch deps, events
    are now handled through Ryu

    Known issues:

    - All data is assumed to be binary, callers need their own
    Encode::encode()/::decode() calls - future versions are likely
    to include an `->encoding` setting and/or `_utf8` versions of
    string methods.

0.003     2015-11-15 03:16:27+00:00 Europe/London
    No new features.

    Dependencies:

    - Added List::Util 1.29, for pairmap

0.002     2015-11-13 16:35:59+00:00 Europe/London
    Bugs fixed:

    - [RT107134](https://rt.cpan.org/Public/Bug/Display.html?id=107134) Include JSON::MaybeXS dependency

0.001     2015-09-14 02:30:30+01:00 Europe/London
    Initial CPAN release