状态管理
本页面介绍如何在插件中管理状态和数据。
状态类型
会话状态
存储单个会话的临时数据。
python
from kirara.state import SessionState
class MyPlugin(Plugin):
async def handle_message(self, message: Message):
state = SessionState(message.session_id)
# 设置状态
await state.set("step", 1)
await state.set("data", {"key": "value"})
# 获取状态
step = await state.get("step")
data = await state.get("data")
用户状态
存储用户相关的数据。
python
from kirara.state import UserState
class MyPlugin(Plugin):
async def handle_message(self, message: Message):
state = UserState(message.sender.id)
# 设置用户数据
await state.set("preferences", {
"language": "zh-CN",
"theme": "dark"
})
# 获取用户数据
prefs = await state.get("preferences")
全局状态
存储插件级别的数据。
python
from kirara.state import GlobalState
class MyPlugin(Plugin):
def __init__(self):
self.state = GlobalState()
async def initialize(self):
# 设置全局数据
await self.state.set("config", {
"version": "1.0.0",
"enabled": True
})
状态操作
基本操作
python
class MyPlugin(Plugin):
async def handle_state(self, state):
# 设置值
await state.set("key", "value")
# 获取值
value = await state.get("key")
# 删除值
await state.delete("key")
# 检查是否存在
exists = await state.exists("key")
批量操作
python
class MyPlugin(Plugin):
async def handle_batch(self, state):
# 批量设置
await state.set_many({
"key1": "value1",
"key2": "value2"
})
# 批量获取
values = await state.get_many(["key1", "key2"])
# 批量删除
await state.delete_many(["key1", "key2"])
过期时间
设置数据的过期时间。
python
class MyPlugin(Plugin):
async def handle_expiry(self, state):
# 设置带过期时间的数据
await state.set("temp", "value", expire=3600) # 1小时后过期
# 更新过期时间
await state.expire("temp", 7200) # 延长到2小时
# 获取剩余时间
ttl = await state.ttl("temp")
数据持久化
文件存储
将数据保存到文件。
python
from kirara.storage import FileStorage
class MyPlugin(Plugin):
def __init__(self):
self.storage = FileStorage("data.json")
async def save_data(self):
# 保存数据
await self.storage.save({
"settings": self.settings,
"cache": self.cache
})
# 加载数据
data = await self.storage.load()
数据库存储
使用数据库存储数据。
python
from kirara.storage import Database
class MyPlugin(Plugin):
def __init__(self):
self.db = Database()
async def handle_database(self):
# 插入数据
await self.db.insert("users", {
"id": "user1",
"name": "张三"
})
# 查询数据
user = await self.db.find_one("users", {"id": "user1"})
状态同步
状态锁
防止并发访问冲突。
python
from kirara.state import StateLock
class MyPlugin(Plugin):
async def handle_message(self, message: Message):
async with StateLock("resource"):
# 在锁内的操作
state = await self.state.get("data")
state["count"] += 1
await self.state.set("data", state)
状态订阅
监听状态变化。
python
from kirara.state import StateObserver
class MyPlugin(Plugin, StateObserver):
async def on_state_change(self, key, old_value, new_value):
self.logger.info(f"状态变化:{key} = {new_value}")
最佳实践
状态设计
- 合理划分状态范围
- 选择适当的存储方式
- 注意数据结构设计
性能优化
- 使用缓存
- 批量操作
- 控制数据大小
安全考虑
- 验证数据
- 控制访问权限
- 加密敏感信息
错误处理
- 处理存储错误
- 数据备份
- 状态恢复