Skip to main content

Embedded Valkey server for Python - like redislite but with Valkey!

Project description

valkeylite

PyPI version Python versions License Sponsored by Cyborg Inc.

Install and run Valkey directly from Python

valkeylite is a Python package that bundles the Valkey server (the open-source continuation of Redis) as a library. It provides an embedded Valkey server that can be started and stopped from Python code, eliminating the need for external Valkey installations or Docker containers during development and testing.

It's like redislite but with Valkey!

Features

  • 🚀 Drop-in replacement for redislite with Valkey
  • 🔧 Two APIs - Simple client wrapper OR explicit server control
  • 🧪 Perfect for testing - Isolated instances with auto-cleanup
  • Latest Valkey - Currently bundles Valkey 9.0.0
  • 🎯 Pytest fixtures - Built-in pytest integration
  • 🔓 Open source - MIT license, bundles BSD-3-Clause Valkey

Supported Platforms

Platform Architecture Status
Linux x86_64 ✅ Supported
Linux aarch64 (ARM64) ✅ Supported
macOS x86_64 (Intel) ✅ Supported
macOS arm64 (Apple Silicon) ✅ Supported
Windows - ❌ Not supported

Installation

pip install valkeylite

Includes valkey-py client automatically. For testing extras:

pip install valkeylite[test]

Quick Start

Client API (Like redislite)

from valkeylite import Valkey

# Just works - server starts automatically
r = Valkey()
r.set('key', 'value')
assert r.get('key') == b'value'
r.close()

# Or with context manager
with Valkey() as r:
    r.set('key', 'value')
    assert r.get('key') == b'value'

# With persistence
r = Valkey('/tmp/mydata.db')
r.set('key', 'value')
r.close()

Server API

from valkeylite import ValkeyServer

# Full control over server lifecycle
with ValkeyServer() as server:
    print(f"Valkey running at {server.host}:{server.port}")

    # Use built-in client
    client = server.client()
    client.set('key', 'value')

    # Or bring your own (any Redis-compatible client)
    import aredis
    client = aredis.Redis(**server.connection_kwargs)

Pytest Integration

# Automatically available with valkeylite[test]

def test_with_server(valkeylite):
    """Use the server fixture."""
    import valkey
    client = valkey.Valkey(**valkeylite.connection_kwargs)
    client.set('test', 'data')
    assert client.get('test') == b'data'

def test_with_client(valkey_client):
    """Use the pre-configured client fixture."""
    valkey_client.set('test', 'data')
    assert valkey_client.get('test') == b'data'

Command-Line Interface

# Start server in foreground
valkeylite

# Or with python -m
python -m valkeylite

# Specify port
valkeylite --port 6380

# See all options
valkeylite --help

Advanced Usage

Custom Configuration

from valkeylite import ValkeyServer
from pathlib import Path

server = ValkeyServer(
    port=6380,                    # Specific port (None = auto-assign)
    host='127.0.0.1',            # Bind address
    data_dir=Path('/tmp/valkey'), # Data directory (None = temp)
    persist=True,                 # Keep data after shutdown
    config={
        'maxmemory': '100mb',
        'maxmemory-policy': 'allkeys-lru',
        'loglevel': 'debug',
    }
)

server.start()
# ... use server ...
server.stop()

Multiple Instances

from valkeylite import ValkeyServer

# Run multiple isolated servers
with ValkeyServer(port=6379) as server1:
    with ValkeyServer(port=6380) as server2:
        # Two independent Valkey instances
        client1 = server1.client()
        client2 = server2.client()

Manual Lifecycle Management

from valkeylite import ValkeyServer

server = ValkeyServer()
server.start(timeout=10.0)  # Wait up to 10s for startup

try:
    # Use server
    print(f"Server running: {server.is_running()}")
    print(f"Connection URL: {server.connection_url}")
finally:
    server.stop()  # Graceful shutdown
    # or server.terminate() for immediate kill

API Reference

Valkey (Client API)

class Valkey(valkey.Valkey):
    """
    Valkey client with embedded server (like redislite.Redis).

    Inherits all methods from valkey.Valkey client.
    """

    def __init__(
        self,
        dbfilename: Optional[Path] = None,
        host: str = "127.0.0.1",
        port: Optional[int] = None,
        **kwargs: Any,
    ) -> None:
        """
        Initialize client with embedded server.

        Args:
            dbfilename: Path for persistent data (None = temporary)
            host: Host to bind to
            port: Port to bind to (None = auto-assign)
            **kwargs: Additional valkey.Valkey arguments
        """

    @property
    def server(self) -> ValkeyServer:
        """Access underlying ValkeyServer instance."""

ValkeyServer (Server API)

class ValkeyServer:
    """Explicit server lifecycle management."""

    def __init__(
        self,
        port: Optional[int] = None,
        host: str = "127.0.0.1",
        data_dir: Optional[Path] = None,
        config: Optional[Dict[str, Any]] = None,
        persist: bool = False,
        **config_overrides: Any,
    ) -> None:
        """Initialize Valkey server instance."""

    def start(self, timeout: float = 10.0) -> None:
        """Start server and wait until ready."""

    def stop(self, timeout: float = 5.0) -> None:
        """Gracefully stop server."""

    def client(self, **kwargs: Any) -> valkey.Valkey:
        """Create valkey-py client connected to this server."""

    @property
    def port(self) -> int:
        """Get server port."""

    @property
    def connection_kwargs(self) -> Dict[str, Any]:
        """Get connection parameters for any client."""

Pytest Fixtures

# Available with pip install valkeylite[test]

@pytest.fixture
def valkeylite() -> ValkeyServer:
    """Provides ValkeyServer instance."""

@pytest.fixture
def valkey_client(valkeylite) -> valkey.Valkey:
    """Provides connected valkey-py client."""

@pytest.fixture
def valkey_url(valkeylite) -> str:
    """Provides connection URL string."""

Migration from redislite

# Before
from redislite import Redis
r = Redis()
r.set('key', 'value')

# After
from valkeylite import Valkey
r = Valkey()
r.set('key', 'value')

With persistence:

# Before
from redislite import Redis
r = Redis('/tmp/redis.db')

# After
from valkeylite import Valkey
r = Valkey('/tmp/redis.db')

With a Unix socket (e.g. flask_limiter):

When you pass a persistent path, valkeylite enables a Unix socket alongside TCP and reuses a single embedded server for that path across calls — so the socket path is stable and you won't churn through ports. The socket defaults to <path>/valkey.sock, and config_get()['unixsocket'] is populated just like redislite, so existing code ports over almost unchanged:

# Before (redislite)
from redislite import Redis
_conn = Redis(DBNAME)
_socket = _conn.config_get()['unixsocket']
limiter = Limiter(..., storage_uri=f'redis+unix://{_socket}')
_conn.close()

# After (valkeylite) — note the storage_uri scheme stays redis+unix://
from valkeylite import Valkey
_conn = Valkey(DBNAME)
_socket = _conn.config_get()['unixsocket']
limiter = Limiter(..., storage_uri=f'redis+unix://{_socket}')
_conn.close()   # the shared embedded server stays up for the limiter to use

Keep the redis+unix:// scheme in storage_uri — that's what flask_limiter's limits backend understands. (ValkeyServer.connection_url reports valkey+unix://…; that string is informational and is not a valid flask_limiter URI.)

One server per process. The embedded server is shared only within a single Python interpreter. Under a multi-worker server (gunicorn/uwsgi), each worker gets its own embedded instance, so rate limits would be per-worker. For multi-worker production, point flask_limiter at a standalone valkey/redis.

Development

# Clone repository
git clone https://github.com/cyborginc/valkeylite.git
cd valkeylite

# Install in development mode
pip install -e .[test]

# Run tests
pytest

Contributing

Contributions welcome! Please:

  1. Open an issue for bugs or feature requests
  2. Submit PRs with tests and documentation
  3. Follow existing code style

License

MIT License - see LICENSE file

Valkey is licensed under BSD 3-Clause License

Acknowledgments

This project is sponsored and maintained by Cyborg Inc.

  • Built on Valkey, the open-source continuation of Redis
  • Inspired by redislite

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

valkeylite-9.1.0.tar.gz (24.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

valkeylite-9.1.0-py3-none-manylinux_2_28_x86_64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

valkeylite-9.1.0-py3-none-manylinux_2_28_aarch64.whl (1.7 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

valkeylite-9.1.0-py3-none-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

valkeylite-9.1.0-py3-none-macosx_10_13_x86_64.whl (1.5 MB view details)

Uploaded Python 3macOS 10.13+ x86-64

File details

Details for the file valkeylite-9.1.0.tar.gz.

File metadata

  • Download URL: valkeylite-9.1.0.tar.gz
  • Upload date:
  • Size: 24.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for valkeylite-9.1.0.tar.gz
Algorithm Hash digest
SHA256 6c1b58e54c91602d5869441af41e9d8ba72ac009ca7f12bbb41c6b85bf6439ec
MD5 f65db69a4e57802cfdaa01417b106d33
BLAKE2b-256 1b9c5168c53433e83df08fdb1f672283fd3efdbce64410711c7716f07e3bcff6

See more details on using hashes here.

Provenance

The following attestation bundles were made for valkeylite-9.1.0.tar.gz:

Publisher: build-and-release.yml on cyborginc/valkeylite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file valkeylite-9.1.0-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for valkeylite-9.1.0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c1d6c8dbd05feba8ede97fbde05bd97c5234a81886e6b9c954df03f762aa14c2
MD5 0d89720ad4ffb43c81caed61d12aea8f
BLAKE2b-256 8a04cfd46646d7cd505bb1ddb7d6bad1e0632db1c8a1a77ee6eebc0f16c3f9df

See more details on using hashes here.

Provenance

The following attestation bundles were made for valkeylite-9.1.0-py3-none-manylinux_2_28_x86_64.whl:

Publisher: build-and-release.yml on cyborginc/valkeylite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file valkeylite-9.1.0-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for valkeylite-9.1.0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 78b485514d25e88e42bce270775d35c9aea555fb782d82b5a9b4a390b62992d5
MD5 9e78cc36d4790c2f421a59c32d98dd78
BLAKE2b-256 9d8dbf65e6992dd58ab36354abecd92dc5b27ff532fadde1b76c8867972b7dea

See more details on using hashes here.

Provenance

The following attestation bundles were made for valkeylite-9.1.0-py3-none-manylinux_2_28_aarch64.whl:

Publisher: build-and-release.yml on cyborginc/valkeylite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file valkeylite-9.1.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for valkeylite-9.1.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e39a39096dd1e6d50fda0e1aa6806e9df123cd8af4c59b6bf04ec1c0f886cfc
MD5 1649a7693b1a9a4550b6402aae5c1d2c
BLAKE2b-256 f9b2c3253dec7e9a21f67bc1d6408f19bcf154338b425b394fc8ef04d593d72a

See more details on using hashes here.

Provenance

The following attestation bundles were made for valkeylite-9.1.0-py3-none-macosx_11_0_arm64.whl:

Publisher: build-and-release.yml on cyborginc/valkeylite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file valkeylite-9.1.0-py3-none-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for valkeylite-9.1.0-py3-none-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 de0191a453524d18193ceeecfe2be819e3ade1a5f9af83cbb91b68e7a6e94db3
MD5 e5ebec64542cd20eda05202389230589
BLAKE2b-256 a1d66c64631fd263a484cbd29abfc2159f30db48ccc734909540741a43cc0df9

See more details on using hashes here.

Provenance

The following attestation bundles were made for valkeylite-9.1.0-py3-none-macosx_10_13_x86_64.whl:

Publisher: build-and-release.yml on cyborginc/valkeylite

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page