feat: 添加状态监控插件和Redis原子操作支持
- 新增 `/status` 指令,展示机器人运行状态和系统指标 - 实现Redis Lua脚本支持原子化计数器操作 - 添加消息收发统计功能 - 完善文档,包括插件开发和性能优化指南 - 重构WebSocket连接池,增加健康检查机制 - 移除旧版编译脚本,优化项目结构
This commit is contained in:
@@ -132,4 +132,43 @@ if await permission_manager.check_permission(user_id, Permission.ADMIN):
|
||||
|
||||
## 总结
|
||||
|
||||
通过以文件为权威数据源、Redis 为缓存层的设计,结合原子操作机制,NEO Bot 的权限管理系统在保证数据可靠性的同时,提供了高性能的访问能力。这种设计既满足了数据一致性的要求,又兼顾了系统性能的需求。
|
||||
通过以文件为权威数据源、Redis 为缓存层的设计,结合原子操作机制,NEO Bot 的权限管理系统在保证数据可靠性的同时,提供了高性能的访问能力。这种设计既满足了数据一致性的要求,又兼顾了系统性能的需求。
|
||||
|
||||
## 扩展应用:指令调用统计
|
||||
|
||||
除了权限管理,原子操作的思想也应用在了指令调用统计中,但实现方式更为高效。
|
||||
|
||||
### 痛点
|
||||
如果每次调用指令都执行 `GET` -> `(本地+1)` -> `SET` 的流程,在高并发下会产生“竞争条件”(Race Condition),导致计数不准确。例如,两个请求同时读取到计数值 10,各自加一后都写回 11,而正确的结果应该是 12。呵呵其实是看到zmd事件紧急添加的功能
|
||||
|
||||
### 解决方案:Lua 脚本
|
||||
`NeoBot` 使用 Redis 的 `EVAL` 命令执行一个 Lua 脚本来实现原子化的计数器。
|
||||
|
||||
```lua
|
||||
-- Lua 脚本 (简化版)
|
||||
local current = redis.call('HGET', KEYS[1], ARGV[1])
|
||||
local count = tonumber(current) or 0
|
||||
count = count + 1
|
||||
redis.call('HSET', KEYS[1], ARGV[1], count)
|
||||
return count
|
||||
```
|
||||
|
||||
- **原子性**: Redis 会保证整个 Lua 脚本的执行是原子性的,执行期间不会被其他命令打断。
|
||||
- **高效性**: 将多个操作(读取、计算、写入)在 Redis 服务器端一次性完成,减少了网络往返的开销。
|
||||
|
||||
### 核心实现
|
||||
在 `RedisManager` 中,我们封装了 `execute_lua_script` 方法,使得在 Python 中调用 Lua 脚本变得非常简单。
|
||||
|
||||
```python
|
||||
# Python 调用示例
|
||||
await redis_manager.execute_lua_script(
|
||||
"atomic_hincrby.lua",
|
||||
keys=["neobot:stats:command_usage"],
|
||||
args=[command_name]
|
||||
)
|
||||
```
|
||||
|
||||
### 收益
|
||||
- **数据准确性**: 彻底杜绝了高并发下的计数错误问题。
|
||||
- **高性能**: 相比于传统的“读取-修改-写入”模式,使用 Lua 脚本能显著提升性能,特别是在指令调用这种高频场景下。
|
||||
- **可扩展性**: 这种模式可以轻松应用于其他需要原子操作的场景,如频率限制、资源池管理等。
|
||||
Reference in New Issue
Block a user