AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Cache Strategy Storage

skill-liutao12138-agent-skill-framework-cache-strategy-storage · by liutao12138

缓存策略存储场景。指导模型进行缓存设计时的思考过程,包括缓存模式选择、一致性保证、失效策略和常见问题处理。

No reviews yet
0 installs
10 views
0.0% view→install

Install

$ agentstack add skill-liutao12138-agent-skill-framework-cache-strategy-storage

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-liutao12138-agent-skill-framework-cache-strategy-storage)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
5mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Cache Strategy Storage? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

缓存策略存储场景思维指南

思考框架

当你需要设计缓存策略时,按以下流程思考:

1. 是否需要缓存?

缓存适用场景检查

                    ┌─────────────────────┐
                    │   数据访问模式?     │
                    └─────────────────────┘
                              │
           ┌──────────────────┼──────────────────┐
           │                  │                  │
      ┌────▼────┐       ┌────▼────┐        ┌────▼────┐
      │读多写少 │       │读写均衡 │        │写多读少 │
      │适合缓存 │       │可考虑缓存│        │不适合缓存│
      └────┬────┘       └────┬────┘        └─────────┘
           │                  │
           ▼                  ▼
      命中率 > 70%        命中率 > 50%

不适合缓存的情况

# ✗ 不适合缓存的数据
├── 频繁变化的数据(实时计数器)
├── 单次使用的临时数据
├── 数据量极大且访问分散
├── 对一致性要求极高
└── 计算成本低于缓存成本

适合缓存的情况

# ✓ 适合缓存的数据
├── 热点数据(访问频率高)
├── 复杂计算结果(CPU密集型)
├── 外部API调用结果
├── 用户配置/偏好数据
├── 字典/枚举数据
└── 会话数据

2. 缓存模式选择

Cache-Aside(旁路缓存)

                    应用服务器
                        │
         ┌──────────────┼──────────────┐
         │              │              │
         ▼              ▼              ▼
    ┌─────────┐   ┌─────────┐   ┌─────────┐
    │ 读取数据 │   │ 缓存存在 │   │ 缓存不存在│
    └────┬────┘   └────┬────┘   └────┬────┘
         │              │              │
         ▼              ▼              ▼
    ┌─────────┐   ┌─────────┐   ┌─────────┐
    │查缓存? │←──│返回缓存 │   │查数据库 │
    └────┬────┘   └─────────┘   └────┬────┘
         │                           │
    ┌────┴────┐                      │
    │         │                      │
    ▼         ▼                      ▼
┌────────┐  ┌────────┐           ┌────────┐
│缓存命中 │ │缓存未中 │           │写入缓存│
└────────┘  └────┬────┘           └────────┘
                 │
                 ▼
              ┌────────┐
              │返回数据│
              └────────┘
# 伪代码实现
def get_user(user_id):
    # 1. 先查缓存
    user = cache.get(f"user:{user_id}")
    if user:
        return user
    
    # 2. 缓存未命中,查数据库
    user = db.query("SELECT * FROM users WHERE id = ?", user_id)
    
    # 3. 写入缓存
    if user:
        cache.set(f"user:{user_id}", user, ttl=3600)
    
    return user

def update_user(user_id, data):
    # 1. 更新数据库
    db.execute("UPDATE users SET ... WHERE id = ?", user_id)
    
    # 2. 删除缓存(而非更新)
    cache.delete(f"user:{user_id}")

Read-Through / Write-Through

# Read-Through:缓存负责加载数据
user = cache.get_or_load(f"user:{user_id}", loader=load_user_from_db)

# Write-Through:写入时同步更新缓存
def update_user(user_id, data):
    db.execute(...)
    cache.set(f"user:{user_id}", updated_user, ttl=3600)

Write-Behind(异步写入)

                    应用服务器
                        │
                        ▼
              ┌─────────────────┐
              │   写入操作队列   │
              └────────┬────────┘
                       │
         ┌─────────────┼─────────────┐
         │             │             │
         ▼             ▼             ▼
    ┌─────────┐  ┌─────────┐  ┌─────────┐
    │批量写入 │  │延迟写入 │  │失败重试 │
    │数据库  │  │数据库   │  │数据库   │
    └─────────┘  └─────────┘  └─────────┘

3. 缓存数据结构选择

Redis 数据结构决策树

需要存储的数据类型
│
├─ 简单字符串/JSON
│   └─ STRING (GET/SET)
│
├─ 计数器
│   └─ STRING (INCR/DECR) 或专用命令
│       └── INCR user:{id}:view_count
│
├─ 哈希(对象)
│   └─ HASH (HSET/HGET)
│       └── HSET user:1001 name "张三" age 25
│
├─ 列表(队列/栈)
│   └─ LIST (LPUSH/RPOP)
│       └── LPUSH queue:tasks '{"id":1,"task":"xxx"}'
│
├─ 去重集合
│   └─ SET (SADD/SISMEMBER)
│       └── SADD user:1001:tags "python" "redis" "cache"
│
├─ 有序集合(排行榜)
│   └─ ZSET (ZADD/ZRANGE)
│       └── ZADD leaderboard 1000 "user1" 900 "user2"
│
├─ 位图(用户签到、活跃度)
│   └─ BITSET (SETBIT/GETBIT)
│
└─ 布隆过滤器(去重、存在性判断)
    └─ BF.ADD bf:email "test@example.com"

4. 失效策略

TTL 设计原则

# TTL 选择的考虑因素
CACHE_TTLS = {
    # 配置类数据(变化极少)
    "config:*": 86400 * 7,      # 7天
    "dict:*": 86400,             # 1天
    
    # 用户相关数据(中等变化)
    "user:{id}": 3600,          # 1小时
    "user:{id}:profile": 1800,   # 30分钟
    
    # 会话数据(严格时效)
    "session:{id}": 86400,      # 1天
    "token:{id}": 3600,          # 1小时
    
    # 热点数据(较短TTL)
    "hot:product:*": 300,        # 5分钟
    "hot:article:*": 600,        # 10分钟
    
    # 临时数据(秒级)
    "rate_limit:*": 60,          # 1分钟
    "lock:{resource}": 30,       # 30秒
}

失效策略选择

# 策略1:TTL 过期(简单但可能有不一致窗口)
# 适用:允许短暂不一致的场景

# 策略2:主动失效(更新时删除/更新缓存)
# 适用:对一致性要求较高的场景
def update_user(user_id, data):
    # 方案A:删除缓存
    cache.delete(f"user:{user_id}")
    
    # 方案B:更新缓存
    cache.hset(f"user:{user_id}", data)

# 策略3:延迟双删(减少不一致概率)
def update_user(user_id, data):
    # 1. 删除缓存
    cache.delete(f"user:{user_id}")
    
    # 2. 更新数据库
    db.execute(...)
    
    # 3. 延迟删除(等待主从同步)
    time.sleep(0.1)
    cache.delete(f"user:{user_id}")

5. 一致性保证

缓存与数据库一致性模型

一致性级别
│
├─ 最终一致(可接受短时间不一致)
│   └── 场景:商品列表、阅读数
│
├─ 读写一致(写入后能读到)
│   └── 场景:用户配置、个人信息
│
└─ 强一致(任何时刻都一致)
    └── 场景:库存、余额、支付

强一致场景处理

# 方案1:分布式锁
def deduct_stock(product_id, quantity):
    lock_key = f"lock:stock:{product_id}"
    
    # 获取锁(最多等待5秒,持有3秒)
    if not cache.acquire_lock(lock_key, ttl=3, timeout=5):
        raise Exception("系统繁忙,请重试")
    
    try:
        # 在锁保护下读取并更新
        stock = cache.get(f"stock:{product_id}")
        if stock  成本)
├── [ ] 选择了合适的缓存模式?
├── [ ] 选择了合适的失效策略?
├── [ ] TTL 设置是否合理?
├── [ ] 有缓存穿透/击穿/雪崩的应对方案?
├── [ ] 有一致性保证方案?
├── [ ] 进行了容量规划?
├── [ ] 有监控告警?
└── [ ] 进行了压力测试?

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.