### Added
- Added `wp redis license` CLI command
### Changed
- Improved error handling for `CONFIG` and `SLOWLOG` commands
- Switch to per-interval deltas instead of cumulative totals in "Requests" charts
- Avoid timeouts by chunking analytics measurements retrieval
### Fixed
- Fixed chart overlapping in WordPress 7.x
- Fixed rare uncaught `TypeError` in `Licensing`
### Added
- Added optional `analytics.persist_limit` configuration option
### Changed
- Avoid timeouts when flushing with `analytics.persist` enabled
- Limit analytics persist size `memory_limit / 2` by default
- Retry failed read commands on primary node before switching Sentinels
- Consider `*WithMeta()` calls read-only on replicated connections
### Fixed
- Disable cache if `WP_SETUP_CONFIG` is defined
- Fixed purging analytics measurements
- Fixed unit type of Relay "Memory" chart
### Added
- Added API/CLI endpoints to reset slowlog and command statistics
### Changed
- Enable `strict` mode by default when a `prefix` is set
- Prevent integrity flush after cache was reset
- Delete more than 10k network sites
- Loosen Relay `prefix` health check
- Replaced `current_time('timestamp')` with `time()`
- Avoid changing parameter names during inheritance
### Fixed
- Fixed accessing `CONFIG` on cluster connections
- Fixed accessing `INFO COMMANDSTATS` on old Redis versions
- Fixed selecting databases on persistent connections
- Fixed KeyDB detection
- Prevent diagnostics warning when `WP_REDIS_DISABLED` is enabled
- Hardened license health check against API outages
Fixed
- Fixed analytics charts not rendering under some conditions
Changed
- Support Relay's new adaptive cache `status` property
- Support flushing Relay memory on clustered connections
- Disabled memory usage when scanning groups on clustered connections
- Improved `SLOWLOG` handling on clustered connections
- Send sanitized metrics snapshot
Added
- Added `wp redis analytics-count` CLI command
### Fixed
- Prevent excessive analytics snapshots
Fixed
- Prevent error when using ElastiCache Serverless instances
- Prevent `unexpected token` errors when scripts are inlined
- Prevent event listener registration when adaptive cache widget is missing
- Switched to ES6 over ES11 syntax
- Fixed groups scan API call if permalinks are disabled
- Fixed up some widget padding
### Added
- Added experimental support for Relay's adaptive cache
- Added health, slowlog and command statistics widgets
- Added `queryttl` configuration option (defaults to 24h)
- Support calculating memory using in groups widget
- Added `groups`, `slowlog`, `commands` and `prune-queries` CLI command
- Added `objectcache_flushlog_limit` filter
### Changed
- Prevent cache from being enabled if handshake fails
- Be more helpful when connection fails
- Improved diagnostics and various health checks
- Store cache analytics as plain JSON
- Don't store path and hostname in analytics by default
- Check license gracefully when sleeping for 72+ hours
- Display latency in milliseconds (not microseconds)
- Sort results in groups widget
- Log `getWithMeta()` calls as `GET`
- Hide `wp_cache_set_last_changed` in Query Monitor stack
- Deprecated `count` property on `objectcache/v1/groups` endpoint
- Download cache groups as CSV instead of copying to clipboard
- Perform integrity flush if WordPress version changes
- Changed cache command log level from `info` to `debug`
- Omit logging cache commands in default `ErrorLogLogger`
- Include `notice` in default log levels
### Fixed
- Fixed Batcache compatibility issue
- Fixed Relay client access replicated and clustered connections
Changed
- Support disambiguating `false` return values using `$found` (PhpRedis 6.2; Relay 0.10.1)
- Show integrity flush reason in flush log widget
- Use unified base REST controller class
- Support calling `FLUSHDB` without `ASYNC` on Relay connections
Added
- Added server type in diagnostics
- Added health checks for `KEEPTTL` requirements (Redis 6.0; PhpRedis 5.3)