valkeylite
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 instorage_uri— that's what flask_limiter'slimitsbackend understands. (ValkeyServer.connection_urlreportsvalkey+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:
- Open an issue for bugs or feature requests
- Submit PRs with tests and documentation
- 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.
Metadata
Release files for valkeylite 9.1.2.post1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| valkeylite-9.1.2.post1.tar.gz | 25.9 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| valkeylite-9.1.2.post1-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| valkeylite-9.1.2.post1-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| valkeylite-9.1.2.post1-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
| valkeylite-9.1.2.post1-py3-none-macosx_10_13_x86_64.whl | Python 3 | none | macOS 10.13+ x86-64 | Details |
Total release size: 6.1 MB
Release files / valkeylite-9.1.2.post1.tar.gz
| Download URL | valkeylite-9.1.2.post1.tar.gz |
|---|---|
| Size | 25.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5783dabbe762b40d4dc005df17a0c421a0bc2f4e7ecb3e734dd9728e710b9a9f
|
|
BLAKE2b-256 checksum How to use checksums |
63e0477a6647a02c3fdef2c48aa302b1669c438da23735321f4dd148c8fe26f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / valkeylite-9.1.2.post1-py3-none-manylinux_2_28_x86_64.whl
| Download URL | valkeylite-9.1.2.post1-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
66576fbd79962fd339da7b028f578c670882b1cedf52c8a3fdbd047634dd83d2
|
|
BLAKE2b-256 checksum How to use checksums |
e263d459e701189bde8e307edbb6728f8c1b81014e1d5a6810036ee67752558a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / valkeylite-9.1.2.post1-py3-none-manylinux_2_28_aarch64.whl
| Download URL | valkeylite-9.1.2.post1-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
d68486767551f55b06946dd541730f2b82f87af7bd9a8b45b0baf9acf3a023c8
|
|
BLAKE2b-256 checksum How to use checksums |
b2c7167b9f54e234cede71adf6c81ef8a93b600ceb16202517fb88c3e1f5298e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / valkeylite-9.1.2.post1-py3-none-macosx_11_0_arm64.whl
| Download URL | valkeylite-9.1.2.post1-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a21614c0f5b4e2eb4dc15fecb7b69afc1e8acdc911dae403a89b703caa2fa670
|
|
BLAKE2b-256 checksum How to use checksums |
483bb033e5852e5e4be2123d1216f0fcf22c5008ce9b2977df2080200866c643
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / valkeylite-9.1.2.post1-py3-none-macosx_10_13_x86_64.whl
| Download URL | valkeylite-9.1.2.post1-py3-none-macosx_10_13_x86_64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | Python 3 macOS 10.13+ x86-64 |
|
SHA-256 checksum How to use checksums |
559c286280e7ba93363cfa22b5c12f9f3a35ec2f4884b0b721d10bcb0dbab08f
|
|
BLAKE2b-256 checksum How to use checksums |
31dfa995a32e3ea6e0c18819852b175dcaff01ad4abab04152f6a70f9ee9ddc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency log