Skip to main content

nb_config_center

A Redis-based distributed configuration center for Python applications with real-time synchronization and type preservation.

Features

  • Centralized Configuration Storage: Store configuration as key-value pairs in Redis Hash
  • Type Preservation: Automatically preserves Python types (int, float, bool, dict, list, str) using JSON serialization
  • Real-time Synchronization: Uses Redis Pub/Sub to notify all instances when configuration changes
  • Callback Support: Register callbacks to execute custom logic when configuration updates
  • Resource Efficiency: Reuses Redis connections and subscriber threads across multiple instances
  • Thread-Safe: Built-in thread safety for concurrent access

Installation

pip install nb_config_center

Requirements

  • Python >= 3.7
  • redis

Quick Start

import redis
from nb_config_center import NbConfigCenter

# Create Redis client
r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

# Initialize configuration center
config = NbConfigCenter(r, namespace="my_app_config")

# Update configuration
config.update_config({
    "database_url": "postgresql://localhost/mydb",
    "max_connections": 100,
    "debug_mode": True,
    "features": {"feature_a": True, "feature_b": False}
})

# Get configuration value
max_conn = config.get("max_connections")  # Returns: 100 (int)

Usage Examples

Basic Configuration Management

import redis
from nb_config_center import NbConfigCenter

r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)
config = NbConfigCenter(r, namespace="app_config")

# Update configuration
config.update_config({
    "api_key": "secret123",
    "timeout": 30,
    "retry_enabled": True
})

# Access configuration
print(config.get("timeout"))  # 30
print(config.config)  # {'api_key': 'secret123', 'timeout': 30, 'retry_enabled': True}

Multiple Instances with Real-time Sync

import redis
from nb_config_center import NbConfigCenter
import time

r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

# Instance 1: Updates configuration
config1 = NbConfigCenter(r, namespace="shared_config")
config1.update_config({"version": "1.0.0", "max_users": 1000})

# Instance 2: Automatically receives updates via Redis Pub/Sub
config2 = NbConfigCenter(r, namespace="shared_config")

# Register callback for configuration changes
@config2.add_update_callback
def on_config_change(old_config, new_config):
    print(f"Configuration updated!")
    print(f"Old: {old_config}")
    print(f"New: {new_config}")

# When config1 updates, config2's callback will be triggered
config1.update_config({"max_users": 2000})
# Output: Configuration updated! Old: {...} New: {'version': '1.0.0', 'max_users': 2000}

Type Preservation

import redis
from nb_config_center import NbConfigCenter

r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)
config = NbConfigCenter(r, namespace="typed_config")

# Store different types
config.update_config({
    "string_val": "hello",
    "int_val": 42,
    "float_val": 3.14,
    "bool_val": True,
    "list_val": [1, 2, 3],
    "dict_val": {"nested": "value"}
})

# Types are preserved when retrieved
print(type(config.get("int_val")))    # <class 'int'>
print(type(config.get("float_val")))  # <class 'float'>
print(type(config.get("bool_val")))   # <class 'bool'>
print(type(config.get("list_val")))   # <class 'list'>
print(type(config.get("dict_val")))   # <class 'dict'>

Using Custom Channel Names

When multiple projects share the same Redis instance, use different channel names to avoid cross-talk:

import redis
from nb_config_center import NbConfigCenter

r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

# Project A
config_a = NbConfigCenter(r, namespace="project_a", channel_name="project_a_updates")

# Project B
config_b = NbConfigCenter(r, namespace="project_b", channel_name="project_b_updates")

# Updates to config_a won't trigger callbacks in config_b

API Reference

NbConfigCenter

Main class for managing distributed configuration.

Constructor

NbConfigCenter(redis_client, namespace: str, channel_name: str = "nb_config_update_bus")

Parameters:

  • redis_client: Redis client object (from redis package)
  • namespace: Configuration namespace (used as Redis Hash key)
  • channel_name: Redis Pub/Sub channel name for notifications (default: "nb_config_update_bus")

Methods

get(key: str)

Retrieve a configuration value by key.

Parameters:

  • key: Configuration key

Returns: Configuration value with original type preserved

Raises: KeyError if key doesn't exist

update_config(config: dict)

Update configuration to Redis and notify all instances.

Parameters:

  • config: Dictionary of configuration key-value pairs to update

Example:

config.update_config({"key1": "value1", "key2": 123})
add_update_callback(func)

Register a callback function to be executed when configuration changes. Can be used as a decorator.

Parameters:

  • func: Callback function that accepts two parameters: old_config and new_config

Returns: The function (allows use as decorator)

Example:

@config.add_update_callback
def my_callback(old_config, new_config):
    print(f"Config changed from {old_config} to {new_config}")

Attributes

  • config: Current configuration dictionary
  • old_config: Previous configuration dictionary (before last update)
  • namespace: Configuration namespace
  • redis: Redis client instance

How It Works

  1. Storage: Configuration is stored in Redis as a Hash, with each key-value pair serialized using JSON to preserve types
  2. Synchronization: When update_config() is called, the changes are:
    • Written to Redis Hash atomically
    • Published to a Redis Pub/Sub channel
  3. Notification: All NbConfigCenter instances subscribed to the same namespace receive the notification
  4. Refresh: Each instance pulls the latest configuration from Redis
  5. Callbacks: Registered callbacks are executed with old and new configuration

Architecture

┌─────────────┐         ┌─────────────┐         ┌─────────────┐
│  Instance 1 │         │  Instance 2 │         │  Instance N │
│             │         │             │         │             │
│  update()   │         │  callback() │         │  callback() │
└──────┬──────┘         └──────▲──────┘         └──────▲──────┘
       │                       │                        │
       │ 1. Write Hash         │ 3. Receive Pub/Sub    │
       │ 2. Publish            │ 4. Refresh from Hash  │
       ▼                       │                        │
┌─────────────────────────────────────────────────────────────┐
│                         Redis Server                        │
│  ┌──────────────┐              ┌──────────────────────┐    │
│  │  Hash Store  │              │  Pub/Sub Channel     │    │
│  │  namespace:  │              │  nb_config_update_bus│    │
│  │  {k1: v1...} │              │                      │    │
│  └──────────────┘              └──────────────────────┘    │
└─────────────────────────────────────────────────────────────┘

Best Practices

  1. Namespace Isolation: Use unique namespaces for different applications or environments
  2. Channel Names: When sharing Redis across projects, use unique channel names
  3. Callback Design: Keep callbacks lightweight and avoid blocking operations
  4. Error Handling: Callbacks should handle their own exceptions to prevent disrupting the update process
  5. Initial Load: Callbacks are NOT triggered on the first load when an instance is created

License

MIT License - see LICENSE file for details

Links

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Download files

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

Source Distribution

nb_config_center-0.1.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

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

nb_config_center-0.1-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file nb_config_center-0.1.tar.gz.

File metadata

  • Download URL: nb_config_center-0.1.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for nb_config_center-0.1.tar.gz
Algorithm Hash digest
SHA256 3ee7e62b6701160d3b94e34fdd7009d9f2d95ef37b8f0057da5ae92be511abcc
MD5 e1c6ec4f33d654d33413e6342967be7d
BLAKE2b-256 fa686139b70a3da29fa0a051f92f118c57f9f63106b0e6438e0248a4ce206e6e

See more details on using hashes here.

File details

Details for the file nb_config_center-0.1-py3-none-any.whl.

File metadata

  • Download URL: nb_config_center-0.1-py3-none-any.whl
  • Upload date:
  • Size: 7.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.9

File hashes

Hashes for nb_config_center-0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d84b7967faff6cb4abccbb33c7fb41650de7fb6e58e55eb8a4f6ce08fb26e2a1
MD5 ea3c49e21224972202693ff51f1deb93
BLAKE2b-256 b0076355329819314216dbfbb1fe8d4f1747b78527f16cf63b7ba0d302c88e8e

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1 This release

2 files

Supported by

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