Pydantic models with Redis as the backend
Project description
Rapyer
Redis Atomic Pydantic Engine Reactor
An async Redis ORM that provides atomic operations for complex data models
📚 Full Documentation | Installation | Examples | API Reference
What is Rapyer?
Rapyer (Redis Atomic Pydantic Engine Reactor) is a modern async Redis ORM that enables atomic operations on complex data models. Built with Pydantic v2, it provides type-safe Redis interactions while maintaining data consistency and preventing race conditions.
Key Features
🚀 Atomic Operations - Built-in atomic updates for complex Redis data structures
⚡ Async/Await - Full asyncio support for high-performance applications
🔒 Type Safety - Complete type validation using Pydantic v2
🌐 Universal Types - Native optimization for primitives, automatic serialization for complex types
🔄 Race Condition Safe - Lock context managers and pipeline operations
📦 Redis JSON - Efficient storage using Redis JSON with support for nested structures
Installation
pip install rapyer
Requirements:
- Python 3.10+
- Redis server with JSON module
- Pydantic v2
Quick Start
import asyncio
from rapyer.base import AtomicRedisModel
from typing import List, Dict
class User(AtomicRedisModel):
name: str
age: int
tags: List[str] = []
metadata: Dict[str, str] = {}
async def main():
# Create and save a user
user = User(name="John", age=30)
await user.save()
# Atomic operations that prevent race conditions
await user.tags.aappend("python")
await user.tags.aextend(["redis", "pydantic"])
await user.metadata.aupdate(role="developer", level="senior")
# Load user from Redis
loaded_user = await User.get(user.key)
print(f"User: {loaded_user.name}, Tags: {loaded_user.tags}")
# Atomic operations with locks for complex updates
async with user.lock("update_profile") as locked_user:
locked_user.age += 1
await locked_user.tags.aappend("experienced")
# Changes saved atomically when context exits
if __name__ == "__main__":
asyncio.run(main())
Core Concepts
Atomic Operations
Rapyer ensures data consistency with built-in atomic operations:
# These operations are atomic and race-condition safe
await user.tags.aappend("python") # Add to list
await user.metadata.aupdate(role="dev") # Update dict
await user.score.set(100) # Set value
Lock Context Manager
For complex multi-field updates:
async with user.lock("transaction") as locked_user:
locked_user.balance -= 50
locked_user.transaction_count += 1
# All changes saved atomically
Pipeline Operations
Batch multiple operations for performance:
async with user.pipeline() as pipelined_user:
await pipelined_user.tags.aappend("redis")
await pipelined_user.metadata.aupdate(level="senior")
# Executed as single atomic transaction
Type Support
Rapyer supports all Python types with automatic serialization:
- Native types (
str,int,List,Dict) - Optimized Redis operations - Complex types (
dataclass,Enum,Union) - Automatic pickle serialization - Nested models - Full Redis functionality preserved
from dataclasses import dataclass
from enum import Enum
@dataclass
class Config:
debug: bool = False
class User(AtomicRedisModel):
name: str = "default"
scores: List[int] = []
config: Config = Config() # Auto-serialized
# All types work identically
user = User()
await user.config.set(Config(debug=True)) # Automatic serialization
await user.scores.aappend(95) # Native Redis operation
Why Rapyer?
Race Condition Prevention
Traditional Redis operations can lead to data inconsistency in concurrent environments. Rapyer solves this with atomic operations and lock management.
Developer Experience
- Type Safety: Full Pydantic v2 validation
- Async/Await: Native asyncio support
- Intuitive API: Pythonic Redis operations
Performance
- Pipeline Operations: Batch multiple operations
- Native Type Optimization: Efficient Redis storage
- Connection Pooling: Built-in Redis connection management
Learn More
- 📖 Documentation - Complete guide and API reference
- 🚀 Examples - Real-world usage patterns
- ⚡ Advanced Features - Locks, pipelines, and nested models
- 🗺️ Roadmap - Future features and development plans
Contributing
Contributions are welcome! Please feel free to submit a Pull Request. Thanks for @Mizaro this would not have been possible without you.
License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rapyer-1.0.1.tar.gz.
File metadata
- Download URL: rapyer-1.0.1.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d22477459352c5520833e5062d48362a0b77f487e8343352e5dafe176bec286b
|
|
| MD5 |
5643348737f142cc4886b1901edf8a07
|
|
| BLAKE2b-256 |
ff39d674077ce971230e34386c59aaf4286a61cfc387d2e6755fd346d8c4b5f7
|
File details
Details for the file rapyer-1.0.1-py3-none-any.whl.
File metadata
- Download URL: rapyer-1.0.1-py3-none-any.whl
- Upload date:
- Size: 19.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3f89e107555cb002b99716b3be8d3d116d2ce176082865de3dde3a61d1055f0
|
|
| MD5 |
7f6a7cf1ceb2553275968c50d4644968
|
|
| BLAKE2b-256 |
5d6dfe9ac5d67b14aa38195080525c162167e67f5fdcd24a1fec7c0668813c2e
|