April 16, 2024·6 min read·engineeringvalkeyrediscompatibilityreleases

Valkey's first stable release makes compatibility explicit

Valkey 7.2.5 establishes the project's first stable release. Its compatibility work reaches executable names, INFO fields, persistence metadata and scripting APIs.

Changing a database's name touches more interfaces than the command protocol. Scripts invoke executable names, monitoring reads version fields, and recovery tools inspect persistence files. Valkey 7.2.5, released on April 16, makes those dependencies visible in the project's first stable release. Much of its initial engineering work is about introducing an independent identity without gratuitously breaking existing integration points.

The version-pinned release notes trace that work through the April release candidates. The project initially used a 7.2.4 candidate number, then moved to 7.2.5 to make clear that this is a patch iteration rather than an exact copy of Redis OSS 7.2.4. That distinction is useful. Compatibility is an intended relationship between implementations, not a claim that their source trees are identical.

I have used Redis since its release, and I favour Valkey's continuation of the familiar model under a permissive license. The first stable version matters because it turns that preference into a concrete release artifact. Its detailed compatibility work is more informative than a broad promise that existing habits will carry over.

Executable names are deployment interfaces

The release names its programs with the Valkey prefix. That includes valkey-server and valkey-cli, along with the benchmark and persistence-checking tools. These names give the project its own command-line identity. They also expose assumptions in scripts that locate a server or client by its earlier name.

The release README explains the installation compatibility mechanism. Installing from the source build creates links from the Redis program names to the Valkey executables in the same directory. The make variable USE_REDIS_SYMLINKS=no disables that behaviour. Uninstalling removes the compatibility links as well.

That mechanism preserves a way for existing command names to resolve while allowing a deployment to choose explicit new names. It is an installation policy, not a modification of the database protocol. An application can speak familiar commands even when an administrator starts the server through a different executable name.

The configuration template also has a new name, valkey.conf. The README shows the server receiving a configuration path as an argument, which keeps the launch mechanism recognizable.

valkey-server /etc/valkey/valkey.conf

The path in that example is an operator's deployment choice. The presence of a renamed template does not automatically rewrite a service manager's command line or move an existing configuration file. This is why binary installation and service configuration remain separate parts of adoption even when compatibility links exist.

Monitoring needs product identity and compatibility identity

The release adds valkey_version and server_name to INFO output. It also retains redis_version to indicate the Redis OSS version with which the server is compatible. These fields answer different questions. One identifies the implementation running now, while another preserves a compatibility signal that existing tools may already understand.

A monitoring integration that reads only the retained compatibility field can miss the implementation's independent version. Conversely, removing the old field immediately would force every integration to recognize the new product before it could perform a familiar inspection. Keeping both fields makes that transition explicit in the server's metadata.

This is an example of compatibility that is not captured by successfully running SET and GET. Operational tools inspect a database as well as send data commands. Product detection, version-based decisions and diagnostic displays can depend on introspection output. The release's field additions recognize those uses as part of the practical interface.

The notes also say the early work minimized changes to log lines for existing log parsing. Some startup and shutdown output necessarily changes to identify Valkey. Treating every log line as an unchangeable contract would prevent that identity change, while changing unrelated lines would increase migration work without adding engine functionality.

I regard separate identity and compatibility fields as a sound choice. They let tooling learn what is running without forcing the server to conceal its lineage. The detail also encourages a more precise definition of a compatible replacement, since tooling can observe the actual implementation instead of inferring it from a historical version string.

Persistence files can identify their producer

The release introduces a valkey-ver field in RDB metadata to identify the Valkey version that produced a snapshot. The notes state that Redis OSS ignores that field when loading the file. That is a specific compatibility design for metadata, rather than a general claim that every future persistence format must remain interchangeable.

Producer identification is useful during recovery because a data file can outlive the process and package that created it. Recording the producer helps distinguish the file's origin from assumptions based on its filename. Keeping the metadata ignorable by the baseline reader allows the file to carry that information without requiring the older reader to understand a new database feature.

The scope of the statement matters. Ignoring an added metadata field is a particular reader behaviour. It does not establish compatibility for arbitrary modules or for every possible later data encoding. The release supplies an evidence-based claim about the field it adds, and that is the claim an operator can attach to this version.

The renamed checking programs also reinforce that persistence belongs to the release's operating environment. A deployment needs the appropriate tools to inspect its files as well as the executable that serves requests. The initial naming work therefore extends to those supporting programs instead of stopping at the main server.

Scripts and modules retain familiar entry points

Lua scripts gain a top-level server object as an alternative to the existing redis object. The notes illustrate replacing redis.call(...) with server.call(...). Retaining the old form avoids making a cosmetic source edit a prerequisite for running existing scripts. The new form supplies a project-neutral vocabulary for new code.

Module interfaces receive similar treatment. The release introduces valkeymodule.h and names prefixed with ValkeyModule, while retaining redismodule.h and its earlier names for source compatibility. Its notes also declare ABI compatibility with modules built using the Redis module API. That is a stated release objective, and modules still represent executable code with their own dependencies.

Source compatibility and binary compatibility describe different integration costs. Keeping a header helps a module's source compile against familiar declarations. Supporting the existing ABI aims to let a previously compiled module load. Renaming a header alone would not establish the latter, so it is useful that the release notes address both concepts explicitly.

The release candidates also include a module-event naming correction intended to maintain Redis compatibility. That is evidence that integration details can be affected by branding changes. A name that looks internal may still be visible through an API used by another component. Compatibility work needs to identify those consumers rather than assume every occurrence of an old name is safe to replace.

Cluster communication also received a specific correction in the initial candidate. The notes describe older Redis nodes, before version 7.0, being unable to communicate with Valkey 7.2 nodes. The correction introduces a slight delay before hostnames appear for a newly added node. This is a concrete tradeoff within interoperability work, and it illustrates why compatibility is made of observable behaviours. A shared origin does not eliminate differences in what a node expects on its cluster connection. The release notes identify the affected combination and the resulting display behaviour rather than promising identical output at every moment.

A stable release preserves a defined starting point

The final stable release's immediate listed change updates configuration-template links to the Valkey website. The larger compatibility work appears in the candidates that led to it. Reading only the final entry would miss why the release has new executable names and introspection fields while retaining earlier interfaces.

This first stable version is therefore useful as a defined point for adoption. It has an independent release number and a documented relationship with the Redis OSS baseline. Its changes show how the project intends to maintain familiar data operations while making the implementation identifiable in deployments and files.

My preference is for this level of explicitness when a project continues widely used infrastructure. Compatibility has several consumers, and the release addresses them through particular mechanisms. Executable links help scripts, retained fields help existing inspection tools, and the scripting aliases let source evolve without an immediate mandatory rewrite. Those are concrete properties of 7.2.5 that make its first stable release operationally meaningful.