Skip to content

Releases

v0.61.0

Choose a tag to compare

@tillkruss tillkruss released this 30 Oct 18:24
Immutable release. Only release title and notes can be modified.
51036e2

Added

  • Added support for phpser serializer
  • Added reconnect() method (preserving event listeners)

Changed

  • Reject RESET and CLIENT CAPA REDIRECT via rawCommand()
  • Gracefully handle malformed invalidation replies
  • Various internal performance improvements

Fixed

  • Fixed various Valkey CAPA REDIRECT issues
  • Fixed invalidations on idle TLS connections
  • Keep hash-field existence and cached values consistent after H[M]GET and HEXISTS
  • Preserve negative integer hash-field names in HSETEX array arguments
  • Accept OPT_READ_TIMEOUT = -1 to disable read timeouts
  • Fixed cluster initialization after automatic primary failover
  • Fixed cluster database selection after MOVED or ASK redirects
  • Fixed parsing of tls-port from CLUSTER SHARDS
  • Reset negative *SCAN cursors before sending commands
  • Fixed invalidation callbacks not firing on every worker
  • Fixed an off-by-one error involving raw HRANDFIELD logic

v0.60.0

Choose a tag to compare

@tillkruss tillkruss released this 14 Oct 17:21
Immutable release. Only release title and notes can be modified.

Added

  • Added startup-only relay.huge_pages configuration directive
  • Added relative_hits and relative_misses to Relay\Relay::stats()
  • Added global and per-endpoint eviction stats to Relay\Relay::stats()
  • Added Redis 8.8 AGGREGATE COUNT support for ZINTER[STORE] and ZUNION[STORE]
  • Added PHP 8.6 macOS builds

Changed

  • Switched to OpenSSL 4 for macOS builds
  • Upgraded PHP 8.6 builds to 8.6.0RC3 API
  • Accelerate cluster slot hashing with startup-selected SIMD CRC16
  • relay.prefault=populate now uses faster writable kernel prefaulting on Linux
  • Each endpoint now owns one shared cache with independent leases for its writers
  • Relay\Relay::stats() reports directly on each endpoint
  • Marked Relay\{Relay, Cluster, Sentinel, Table, AdaptiveCache} as non-serializable
  • Cap relay.initial_readers to 32768
  • Improved Relay\Cluster initialization failure logging
  • Various performance improvements (evictions, invalidations, cache reads)

Fixed

  • Restored -headerpad_max_install_names to macOS builds
  • Reselect database in every reconnect pathway
  • Fixed INCREX to match the released Redis 8.8 syntax
  • Fixed possible buffer overrun when gathering eviction sample keys
  • Fixed possible crash in invalidation callbacks that mutate invalidations themselves
  • Fixed handling of malformed RESP reply shapes
  • Fixed segfault if serialization throws an exception
  • Fixed segfault when calling Relay\Sentinel methods before the object is constructed
  • Fixed segfault in Relay\Cluster subscribe commands before the object is constructed
  • Prevented child processes from tearing down a parent's persistent connection
  • Reject RESP replies nested deeper than 1024 levels instead of overflowing the stack
  • Always invalidate keys *EXPIRE*d in transactions to avoid serving stale data

Removed

  • relay.*_endpoint_dbs have been removed and will be ignored

v0.50.2

Choose a tag to compare

@tillkruss tillkruss released this 28 Sep 23:07
Immutable release. Only release title and notes can be modified.
91fb862

Fixed

  • Fixed Cluster::zRange() prototype to allow string|int for start and end
  • Fixed PhpRedis compatibility for various commands and connection context arguments

v0.50.0

Choose a tag to compare

@tillkruss tillkruss released this 05 Sep 20:35
Immutable release. Only release title and notes can be modified.

Added

  • Added EL10 builds
  • Added HIMPORT command
  • Added Relay\Cluster::MSETEX
  • Added Relay\Cluster::FCALL(_RO)
  • Added Relay\Cluster::OPT_NODE_READ_TIMEOUT for faster node failover
  • Added Relay\Cluster::OPT_MULTIKEY_REORDERING
  • Added Relay\Table fixed-resolution/retention metric series
  • Added info log level

Changed

  • Switched to 8.6.0beta2 API for PHP 8.6 builds
  • Use configurable exponential backoff with jitter for unhealthy cluster node health checks
  • Use a hardcoded upper bound for cluster redirects before giving up
  • Flush all existing databases when calling flushMemory(), not just active ones
  • Made SMISMEMBER, BITPOS and TYPE cacheable
  • Made ZRANK, ZREVRANK, ZCOUNT, ZSCORE and ZMSCORE cacheable
  • Made Cluster reject UNWATCH in a MULTI transaction in PhpRedis compatibility mode
  • Switched to incremental flushing of in-memory caches
  • Over 40 additional internal improvements

Fixed

  • Fixed a few ZSET caching edge cases
  • Fixed [B]LMOVEM compatibility with PhpRedis
  • Fixed a possible memory leak if a worker is terminated while in an EBR critical section
  • Fixed command arity as reported by Redis
  • Fixed a crash after manually disabling client tracking
  • Fixed cluster cross-slot command aggregation
  • Fixed an erroneous relayLinkRelease based on hiredis reader state
  • Fixed a signal sequencing issue that could cause an infinite loop
  • Fixed a small SIGIO race when arming file descriptors to receive signals
  • Fixed boolean INI parsing so it will work for PHP 7.4 - 8.6
  • Fixed @return docblock of Relay\Table::fullscan()
  • Fixed CLUSTER SHARDS parsing logic to be more robust and correct
  • Fixed possible crashes in VSETATTR
  • Fixed session max_execution_time handling to match PhpRedis
  • Fixed Relay\Cluster returning a bare false without setting the last error or throwing
  • Fixed our WRONGTYPE message so it matches the server
  • Fixed raw BITPOS and GETBIT reporting nothing when Relay rejects the arguments itself
  • Fixed Relay\Cluster::rawCommand() not validating command arity
  • Fixed SMISMEMBER return type when responding from cache
  • Fixed leaving replicas in MULTI state after a DISCARD
  • Fixed Relay\Cluster transaction bookkeeping for broadcast commands
  • Fixed lazy reconnect and node introspection after Relay\Cluster::close()
  • Fixed HGETDEL and HGETEX invalidating the wrong cache entry
  • Fixed crashes from malformed raw MSET(EX|NX) and HGET(EX|DEL) arguments
  • Fixed Relay\Cluster::rawCommand() crashing for commands without a dedicated command-table entry
  • Fixed event listener handling for queued flush events, dropped connections, and callbacks that modify listener registrations
  • Fixed Relay\Cluster::getOption(OPT_ADAPTIVE_CACHE) panicking
  • Fixed Relay\Relay::option() crashing when explicitly passed null
  • Fixed options argument validation for GEORADIUS(BYMEMBER) and GEOSEARCH(STORE)
  • Fixed assertion involving SELECT with wildly wrong dbs in a transaction
  • Fixed several edge cases and issues in Relay\Cluster::fullscan()
  • Fixed handling a failed DISCARD during a transaction in Relay\Cluster
  • Fixed crash when Relay\Cluster connects to an incomplete/initializing cluster
  • Fixed a null pointer dereference when executing a transaction against a cluster that is still spinning up
  • Ensure our signal handlers only run on the main PHP lifecycle thread
  • Fixed a memory leak in CROSSSLOT errors
  • Fixed memory leaks in Relay\Cluster subscription callbacks and repeated allow/ignore pattern updates

v0.40.0

Choose a tag to compare

@tillkruss tillkruss released this 28 Jul 17:37
Immutable release. Only release title and notes can be modified.

Added

  • Added support for multiple cluster databases (Valkey 9.0+)
  • Added OPT_REPLICA_FAILOVER and FAILOVER_DISTRIBUTE_REPLICAS constant aliases
  • Added relay.prefault ini setting
  • Added SUNIONCARD and SDIFFCARD commands
  • Added LMOVEM and BLMOVEM commands
  • Added in-memory caching to PFCOUNT command
  • Added PHP 8.6 builds

Changed

  • Removed LZ4 and ZSTD dependencies and detect them on startup
  • Major performance and memory efficiency improvements
  • Dramatically improved cluster command distribution and failover handling
  • Changed the default max_endpoint_dbs from 32 to 1

Fixed

  • Reworked SIGIO and atexitHandler logic
  • Restored missing FullscanGenerator stubs
  • Fixed issues with ck_rhs by upgrading relay-pkg.so's bundled libck to an unreleased version
  • Fixed zstd fallback compression bug
  • Fixed assertion on Relay\Cluster command failure
  • Fixed an assertion in an error state in relaySyncObject
  • Fixed issues detecting worker counts

v0.30.0

Choose a tag to compare

@tillkruss tillkruss released this 16 Jun 16:41
Immutable release. Only release title and notes can be modified.

This release contains a major API redesign and breaking changes in Relay\Table.

Added

  • Added support for INCREX and XNACK commands

Changed

  • ⚠️ Redesigned Relay\Table API and switched to shared memory model
  • Made igbinary and msgpack extensions optional and detected at runtime
  • Redesigned internal HASH and SET data structures for size and performance
  • Various performance, recovery and memory efficiency improvements

Fixed

  • Fixed invalidation polling on TLS connections
  • Fixed segfault with unserializable inputs
  • Fixed arity and reply type of various commands
  • Fixed OPT_FAILOVER and OPT_DISTRIBUTE stub values
  • Fixed Relay::_uncompress() compatibility with PhpRedis
  • Fixed relay-pkg.so builds exporting bundled hiredis symbols

v0.22.0

Choose a tag to compare

@tillkruss tillkruss released this 04 May 20:59
Immutable release. Only release title and notes can be modified.

Added

  • Added the optional FPHA argument to JSON.SET command
  • Added missing PhpRedis backoff algorithms for compatibility
  • Added OPT_FAILOVER cluster option for fine-grained failover control
  • Added OPT_DISTRIBUTE cluster option for controlling read distribution across replicas

Changed

  • Reduced memory usage across various components
  • Improved cluster command distribution and error recovery
  • Disable Zend signals in all ZTS builds
  • Switch to mixed arguments for SLOWLOG command
  • Changed NUM_REQUESTS to TOKENS for GCRA command

Fixed

  • Fixed session handler in PHP 8.6
  • Fixed a possible assertion failure after a cluster link failure

v0.21.0

Choose a tag to compare

@tillkruss tillkruss released this 28 Mar 09:22
Immutable release. Only release title and notes can be modified.
20674cf

Added

  • Added support for HOTKEYS and GCRA commands
  • Added support for DELEX and DELIFEQ
  • Added support for Valkey's CLUSTERSCAN command
  • Added relay.max_db_writers ini directive

Changed

  • Switched to multi-writer model for shared caches
  • Serve cached keys from cluster replicas
  • Improved cluster initialization by using CLUSTER SHARDS command when available
  • Modernized session locking
  • Various internal improvements and fixes

Fixed

  • Fixed arity and options array handling for DELEX command
  • Fixed a segfault with raw MSETEX command
  • Fixed a memory leak when reconnecting an already connected object
  • Allow passing null to Relay\Cluster seeds and also using a name
  • Fixed incorrect database number warning

v0.20.0

Choose a tag to compare

@tillkruss tillkruss released this 26 Nov 16:31
Immutable release. Only release title and notes can be modified.
c6c6f1a

Added

  • Added stable PHP 8.5 builds
  • Added ZTS builds for some distros
  • Added WAIT command to Relay\Cluster
  • Added DIGEST command
  • Added IFEQ, IFNE, IFDEQ, IFDNE SET options
  • Added DELEX command
  • Added MSETEX command
  • Added support for Dragonfly's ZDIFF WITHSCORES reply

Changed

  • ⚠️ Return Redis maps as numeric arrays for raw commands in PhpRedis compatibility mode
  • ⚠️ Establish connections lazily in PhpRedis compatibility mode
  • Restored PHP 7.4 builds for macOS

Fixed

  • Fixed hGetWithMeta() sometimes returning an incorrect value
  • Fixed reply type for VINFO command
  • Fixed a segfault caused by a null pointer dereference in Cluster

v0.12.1

Choose a tag to compare

@tillkruss tillkruss released this 15 Oct 20:43
Immutable release. Only release title and notes can be modified.

Added

  • Added hGetWithMeta() method

Changed

  • Improved PhpRedis compatibility for Relay\Cluster::config()
  • Deprecated pclose() in favor of close()
  • Call SELECT 0 when stashing connections

Fixed

  • Fixed handling arguments of hsetex() method
  • Fixed arity for some vectorset commands
  • Fixed wrong reply format of raw GETEX command
  • Fixed HEXISTS when we have limited cached information about a key
  • Fixed literal reply type for SELECT and WATCH commands