设计键值存储(Key-Value Store)的 schema,核心思路是:用“键”表达访问路径,用“值”承载数据,并兼顾查询模式、性能与扩展性。下面从原则、常见模式、反模式到示例逐步说明。
用分隔符构造“逻辑层次”,但底层仍是扁平 key:
user:1001:profile
user:1001:orders:202401
常用分隔符:: / #(避免空格)
KV 没有二级索引,查询条件必须在 key 中体现:
device:temperature:room1:20240101
user:{userId}
order:{orderId}
值:JSON / Protocol Buffers
{entity}:{partition}:{sortKey}
例:
message:user1001:1700000000
metric:cpu:host1:20240101:10
metric:cpu:host1:20240101:11
用 metric:cpu:host1:20240101: 做前缀扫描
user:tag:VIP:1001 -> 1
user:tag:VIP:1002 -> 1
再扫 user:tag:VIP: 得用户列表
stats:page:home:views -> 12345
用原子 incr
version 字段❌ 把 SQL 思维搬过来(join、like)
❌ key 过长(user_profile_data_of_xxx)
❌ 用随机 UUID 做纯 key(无法范围查)
❌ 单 key 存超大 value(影响性能)
user:1001:base -> {"name":"A","age":20}
user:1001:orders -> ["o1","o2"]
order:o1 -> {...}
user:1001:cart -> {...}
idx:user:email:a@x.com -> 1001
KV schema = 把“怎么查”写进 key,把“是什么”放进 value。
如果你有具体场景(如 Redis / DynamoDB / 自研引擎),我可以给更针对性的 schema 设计。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。