Skip to main content

A Python abstraction layer that makes Redis or DragonflyDB behave like a shared Python object across processes/microservices.

Project description

Tests & Lint PyPI Downloads Monthly Downloads License Documentation

🗄️ synced-memory

A production-ready Python class for seamless, multiprocessing-safe, persistent key-value storage using Redis or DragonflyDB as a backend. If the backend is unavailable, values are cached locally and queued for syncing when it comes back online. All values are serialized as JSON, and you interact with it using natural Python attribute access.

Purpose

The intention is to use this with agentic workflows deployed as microservices, allowing for multiple instances of the same pod to share their state.

✨ Features

  • 🔄 Multiprocessing-safe: All processes share the same state via Redis or DragonflyDB.
  • 🧠 Pythonic API: Set and get attributes as if they were regular object properties.
  • 🕰️ Persistence: Values survive process restarts and context blocks.
  • 🚦 Resilient: If the backend is down, changes are queued and flushed when it returns.
  • 🚦 Eventually Consistent: Latest write wins. Coarse blob is updated, no atomic merges.
  • 🧩 Customizable: Prefixes and conversation IDs for namespacing.
  • 🧵 Background sync: Queued changes are flushed automatically in the background.

🚀 Quickstart

pip install synced-memory
from synced_memory.redis import Memory

mem = Memory()
mem.answer = 42
print(mem.answer)  # 42

# Across processes or instances:
mem2 = Memory()
print(mem2.answer)  # 42

mem.settings = {"theme": "dark", "volume": 0.75}
print(mem.settings)  # {'theme': 'dark', 'volume': 0.75}

To use DragonflyDB instead:

from synced_memory.dragonflydb import Memory

mem = Memory()
mem.answer = 42

Intended Use Cases

  • conversation histories
  • logs
  • agent state
  • checkpoints
  • scratchpads

🧑‍💻 Context Management

You can use Memory as a context manager for automatic resource handling:

with Memory() as memory:
    memory.session = "active"
    print(memory.session)  # "active"

# Later, in a new context:
with Memory() as memory:
    print(memory.session)  # "active"

🔄 Auto-Synced Collections

Lists and dictionaries are automatically wrapped as SyncedList and SyncedDict, which sync changes to the backend immediately:

mem = Memory()
mem.items = [1, 2, 3]
mem.items.append(4)  # Automatically syncs

mem2 = Memory()
print(mem2.items)  # [1, 2, 3, 4]

mem.config = {"theme": "dark"}
mem.config["lang"] = "en"  # Automatically syncs
print(mem2.config)  # {'theme': 'dark', 'lang': 'en'}

Nested structures work too:

mem.data = {"user": {"preferences": {"color": "blue"}}}
mem.data["user"]["preferences"]["color"] = "red"  # Syncs!

Converting to Plain Python Types

For libraries that need plain Python objects (serialization, pickling, etc.):

mem.items = [1, 2, 3]
plain_list = mem.items.aslist()  # Returns regular list

mem.config = {"key": "value"}
plain_dict = mem.config.asdict()  # Returns regular dict

import pickle
pickle.dump(plain_list, file)  # Works!

🗂️ Namespacing

By default, synced-memory uses memory: as its key prefix. Override with REDIS_PREFIX:

mem = Memory()
mem.state = {"step": 1}
print(mem.state)  # {'step': 1}

Scoping

Use PrefixedMemory to isolate memory by a custom scope prefix:

from synced_memory.redis import PrefixedMemory

mem = PrefixedMemory(prefix="session_abc123")
mem.state = {"step": 1}
print(mem.state)  # {'step': 1}

⚙️ Environment Variables

  • REDIS_HOST: Backend hostname (default: redis)
  • REDIS_PORT: Backend port (default: 6379)
  • REDIS_PREFIX: Key prefix (default: memory:)

--- WHEN UPDATING README.md: YOU CAN KEEP EVERYTHING BELOW THIS LINE ---

🛠️ Development

The only requirement is 🐳 Docker. (The .devcontainer and tasks.json are prepared assuming a *nix system, but if you know the commands, this will work on Windows, too.)

  1. Clone the repo.
  2. Branch out.
  3. Open in "devcontainer" on VS Code and start developing. Run pytest under tests to test.
  4. Alternatively, if you are a fan of Test-Driven Development like me, you can run the tests without getting on a container. .vscode/tasks.json has the command to do so, but it's also listed here:
docker compose -f tests/docker-compose.yaml up --build --abort-on-container-exit --exit-code-from test

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

synced_memory-0.1.3.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

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

synced_memory-0.1.3-py3-none-any.whl (10.5 kB view details)

Uploaded Python 3

File details

Details for the file synced_memory-0.1.3.tar.gz.

File metadata

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

File hashes

Hashes for synced_memory-0.1.3.tar.gz
Algorithm Hash digest
SHA256 42f9b3afc92b9057564a4f8b9b477a7e075805a83d64bd4b26d633d18b512845
MD5 fdf89ec8f33ac5e2b1b3933db3c11e31
BLAKE2b-256 a6b3fbb6d448909da1ba6869b2701f546d5c97c21a366ec0191f8c5a3eed8594

See more details on using hashes here.

Provenance

The following attestation bundles were made for synced_memory-0.1.3.tar.gz:

Publisher: ci.yaml on sinan-ozel/synced-memory

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

File details

Details for the file synced_memory-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: synced_memory-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 10.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for synced_memory-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b09cd525da7a50bf79eda10c303979f80c909c72eed459874e40a6423ff331fa
MD5 a25edd0f276fbea588f4777580a84ed2
BLAKE2b-256 2b90fcd593c87a54cc0a5ba708cde7f76cdca976263975726fd06476aea8c21a

See more details on using hashes here.

Provenance

The following attestation bundles were made for synced_memory-0.1.3-py3-none-any.whl:

Publisher: ci.yaml on sinan-ozel/synced-memory

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