Message Caching
The SDK includes built-in message caching using async SQLite for better performance.
How It Works
Messages are automatically cached to a local SQLite database when received:
- Faster Retrieval - Cached messages load instantly
- Offline Access - Access previously received messages offline
- Non-blocking - All operations are async
- Automatic - Handled by the SDK automatically
Database Location
Default location:
Custom Location
from mezon.messages.db import MessageDB
# Custom path
message_db = MessageDB(db_path="./custom-path/messages.db")
Working with Cached Messages
from mezon.messages.db import MessageDB
async def work_with_cache():
async with MessageDB() as db:
# Get messages by channel
messages = await db.get_messages_by_channel(
channel_id="channel_123",
limit=50,
offset=0
)
# Get specific message
message = await db.get_message_by_id(
message_id="msg_456",
channel_id="channel_123"
)
# Count messages
count = await db.get_message_count(channel_id="channel_123")
total = await db.get_message_count() # All messages
# Clear channel messages
deleted = await db.clear_channel_messages("channel_123")
# Delete specific message
success = await db.delete_message("msg_456", "channel_123")
MessageDB Methods
| Method | Description |
|---|---|
get_messages_by_channel(channel_id, limit, offset) |
Get messages from a channel |
get_message_by_id(message_id, channel_id) |
Get a specific message |
get_message_count(channel_id=None) |
Count messages |
clear_channel_messages(channel_id) |
Delete all messages in a channel |
delete_message(message_id, channel_id) |
Delete a specific message |
Performance Benefits
Using aiosqlite provides:
- Non-blocking I/O - Database operations don't block the event loop
- Concurrent Operations - Multiple database operations can run concurrently
- Lazy Connection - Connection established only when needed
- Auto-cleanup - Context manager handles cleanup
Example: Search Cached Messages
from mezon.messages.db import MessageDB
async def search_messages(channel_id: str, keyword: str):
async with MessageDB() as db:
messages = await db.get_messages_by_channel(
channel_id=channel_id,
limit=1000
)
matching = [
msg for msg in messages
if keyword.lower() in msg.content.lower()
]
return matching
Cache with Message Handling
from mezon.messages.db import MessageDB
from mezon.protobuf.api import api_pb2
async def handle_message(message: api_pb2.ChannelMessage):
# Message is automatically cached by the SDK
# Later, retrieve from cache
async with MessageDB() as db:
cached = await db.get_message_by_id(
message_id=message.message_id,
channel_id=message.channel_id
)
if cached:
print(f"Found in cache: {cached.content}")
client.on_channel_message(handle_message)