Skip to main content

Pydantic models with Redis as the backend

Project description

Rapyer Logo

Rapyer

Redis Atomic Pydantic Engine Reactor

An async Redis ORM that provides atomic operations for complex data models

Python 3.10+ License: MIT Redis codecov

📚 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


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


Download files

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

Source Distribution

rapyer-1.0.1.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

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

rapyer-1.0.1-py3-none-any.whl (19.0 kB view details)

Uploaded Python 3

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

Hashes for rapyer-1.0.1.tar.gz
Algorithm Hash digest
SHA256 d22477459352c5520833e5062d48362a0b77f487e8343352e5dafe176bec286b
MD5 5643348737f142cc4886b1901edf8a07
BLAKE2b-256 ff39d674077ce971230e34386c59aaf4286a61cfc387d2e6755fd346d8c4b5f7

See more details on using hashes here.

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

Hashes for rapyer-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a3f89e107555cb002b99716b3be8d3d116d2ce176082865de3dde3a61d1055f0
MD5 7f6a7cf1ceb2553275968c50d4644968
BLAKE2b-256 5d6dfe9ac5d67b14aa38195080525c162167e67f5fdcd24a1fec7c0668813c2e

See more details on using hashes here.

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