EAV(Entity–Attribute–Value)模型因为“行即字段”的特性,查询时通常要做大量 JOIN 或行转列,性能天然偏弱,所以缓存是 EAV 系统优化的核心手段之一。下面从「缓存什么、怎么缓存、注意事项」三个层面说明。
把一个 Entity 的所有 Attribute–Value 聚合成一个对象/Map 缓存起来。
例如:
{
"user_id": 1001,
"attributes": {
"age": 30,
"city": "Beijing",
"vip": true
}
}
✅ 优点
❌ 缺点
把常用查询的“伪宽表”结果缓存:
SELECT e.id, a1.value, a2.value
FROM entity e
JOIN eav a1 ON ...
JOIN eav a2 ON ...
缓存为:
{
"user_id": 1001,
"age": 30,
"city": "Beijing"
}
适合:
EAV 的 attribute 表通常变化极少:
✅ 适合:
读:
1. 查 Redis
2. 未命中 → 查 DB(EAV JOIN)
3. 聚合后写 Redis
写:
1. 更新 EAV 表
2. 删除 / 重建 Redis Key
Key 设计:
entity:{type}:{id}
Local Cache (Caffeine)
↓ miss
Redis
↓ miss
DB
适合:
适合:
EAV 一行一个属性 → 一个实体可能几百行
✅ 解决:
更新一个字段 → 整个实体缓存重建
✅ 缓解:
EAV 常用于配置/元数据
✅ 策略:
Client
↓
API
↓
Local Cache → Redis → DB(EAV)
↑
Binlog / MQ 失效
如果你愿意,可以告诉我:
我可以直接给你一套可用的缓存设计方案或代码模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。