一键导入
redis-safety
当用户操作 Redis 相关代码(go-redis、Jedis、redis-py、ioredis)时触发。涵盖禁止 KEYS 命令、SCAN 替代、大 key 控制、Pipeline 批量、TTL 规范等安全与性能要点。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
当用户操作 Redis 相关代码(go-redis、Jedis、redis-py、ioredis)时触发。涵盖禁止 KEYS 命令、SCAN 替代、大 key 控制、Pipeline 批量、TTL 规范等安全与性能要点。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
网关/代理/WAF/CDN 中间件的安全关键词匹配实现规范,防止纯子串匹配误判正常响应内容中的技术术语(如 Cloudflare、502、error)
涉及浏览器、编辑器、CDN/WAF、IM 平台、操作系统剪贴板、第三方 SaaS 等"外部黑盒系统"的代码编写或 bug 调试时触发。强制先抓真实环境数据再推理,避免连续 2 轮"凭代码推理"的修复 no-op。关键词:粘贴/复制异常、跨平台显示不一致、第三方 API 怪结果、CDN/WAF 拦截、本地复现失败、HTML→MD 转换丢属性。
前端开发规范,包含 Vue 3 编码规范、UI 风格约束、TypeScript 规范等
Java 开发规范,包含命名约定、异常处理、Spring Boot 最佳实践等
网关/代理/WAF/CDN 中间件响应判定与关键词匹配安全规范。适用于 proxy/gateway/waf/cdn/nginx/openresty/rewrite/redirect 等代码,防止把正常长正文中的 Cloudflare、502、bad gateway、error 等技术术语误判为上游错误。
涉及浏览器、编辑器、CDN/WAF、IM 平台、操作系统剪贴板、第三方 SaaS 等"外部黑盒系统"的代码编写或 bug 调试时触发。强制先抓真实环境数据再推理,避免连续 2 轮"凭代码推理"的修复 no-op。关键词:粘贴/复制异常、跨平台显示不一致、第三方 API 怪结果、CDN/WAF 拦截、本地复现失败、HTML→MD 转换丢属性。
| name | redis-safety |
| description | 当用户操作 Redis 相关代码(go-redis、Jedis、redis-py、ioredis)时触发。涵盖禁止 KEYS 命令、SCAN 替代、大 key 控制、Pipeline 批量、TTL 规范等安全与性能要点。 |
防止 Redis 常见性能和稳定性问题,适用于所有语言。
| 禁止 | 替代 | 原因 |
|---|---|---|
KEYS * / KEYS pattern | SCAN 游标迭代 | KEYS 是 O(N) 阻塞操作,生产环境会导致 Redis 卡死 |
FLUSHDB / FLUSHALL | 按 key 前缀 SCAN + DEL | 全量删除风险极高 |
| 无 TTL 的 SET | 所有 key 必须设置 TTL | 避免内存泄漏 |
// Go (go-redis) ❌
keys, _ := rdb.Keys(ctx, "user:*").Result()
// Go (go-redis) ✅
var cursor uint64
for {
keys, cursor, _ = rdb.Scan(ctx, cursor, "user:*", 100).Result()
// 处理 keys
if cursor == 0 { break }
}
// Java (Jedis) ❌
Set<String> keys = jedis.keys("user:*");
// Java (Jedis) ✅
ScanParams params = new ScanParams().match("user:*").count(100);
String cursor = "0";
do {
ScanResult<String> result = jedis.scan(cursor, params);
// 处理 result.getResult()
cursor = result.getCursor();
} while (!cursor.equals("0"));
# Python (redis-py) ❌
keys = r.keys("user:*")
# Python (redis-py) ✅
for key in r.scan_iter(match="user:*", count=100):
# 处理 key
多次 Redis 调用应使用 Pipeline 减少网络往返:
// ❌ 循环单次调用
for _, id := range ids {
rdb.Get(ctx, "user:"+id)
}
// ✅ Pipeline 批量
pipe := rdb.Pipeline()
for _, id := range ids {
pipe.Get(ctx, "user:"+id)
}
pipe.Exec(ctx)
// ❌
rdb.Set(ctx, "token:123", value, 0)
// ✅
rdb.Set(ctx, "token:123", value, 24*time.Hour)