当前位置: 首页 > news >正文

【Redis】key的设计格式

【Redis】key的设计格式

    • 【1】key 设计通用规范
    • 【2】详细案例(按业务场景分类)
      • (1)用户模块(user)
      • (2)订单模块(order)
      • (3)商品模块(goods)
      • (4)计数器 / 统计类
      • (5)缓存与过期时间
      • (6)集合类数据(List/Set/Hash)
    • 【3】反例(避免这样设计)
  • 【二】

Redis 的 key 设计需遵循可读性高、易维护、避免冲突、便于扩展的原则,通常采用 “分层命名” 的方式,用分隔符(如:、_)划分不同维度,清晰体现 key 的业务含义。以下是详细设计规范及案例:

【1】key 设计通用规范

(1)命名格式:业务域:模块:主键:属性(层级从左到右由粗到细)
(2)分隔符:推荐用:(Redis 中无特殊含义,且视觉上更清晰)
(3)避免冗余:不包含无意义的固定前缀(如redis_)
(4)控制长度:key 不宜过长(影响内存和查询效率),通常不超过 64 字节
(5)区分大小写:Redis 的 key 区分大小写(如user:1和User:1是两个 key),建议统一小写

【2】详细案例(按业务场景分类)

(1)用户模块(user)

用户基本信息:业务域:用户ID:属性
user:1001:info → 存储用户 ID=1001 的完整信息(JSON 格式)
user:1001:name → 单独存储用户名(如需高频获取某个字段)
user:1001:phone → 单独存储手机号

用户关联数据:业务域:用户ID:关联类型
user:1001:orders → 存储用户 1001 的订单 ID 列表(List 结构)
user:1001:addresses → 存储用户 1001 的地址列表(Hash 或 List)

(2)订单模块(order)

订单基本信息:业务域:订单ID:属性
order:20230730001:info → 订单 20230730001 的完整信息
order:20230730001:status → 订单状态(如 “已支付”“已发货”)

订单与用户关联:业务域:关联维度:关联值
order:user:1001 → 用户 1001 的所有订单 ID 列表(便于查询用户的历史订单)

(3)商品模块(goods)

商品基本信息:业务域:商品ID:属性
goods:5001:info → 商品 5001 的完整信息(名称、价格、库存等)
goods:5001:stock → 商品 5001 的实时库存(高频更新字段,单独存储)

商品分类:业务域:分类ID:列表
goods:category:301 → 分类 ID=301 下的所有商品 ID 列表

(4)计数器 / 统计类

格式:业务域:统计维度:时间
login:count:20230730 → 2023 年 7 月 30 日的登录次数(用incr自增)
goods:view:5001:202307 → 商品 5001 在 2023 年 7 月的浏览量

(5)缓存与过期时间

临时数据需加过期时间(如验证码、令牌):
verify☎️13800138000 → 手机号 13800138000 的验证码(设置 10 分钟过期)
token:user:1001 → 用户 1001 的登录令牌(设置 2 小时过期)

(6)集合类数据(List/Set/Hash)

Hash 结构:适合存储对象的多个字段(替代多个单 key)
user:1001(Hash 类型) → 字段name=“张三”,age=25,phone=“138xxx”

Set 结构:存储去重关联数据
user:1001:tags(Set 类型) → 元素 “学生”“会员”“新用户”

Sorted Set 结构:带权重的排序数据
goods:rank:sales(Sorted Set 类型) → 成员5001(商品 ID),分数1000(销量)

【3】反例(避免这样设计)

(1)无规则命名:abc123、userinfo(无法区分业务和主键)
(2)冗余前缀:redis_user_1001(redis是存储媒介,无需出现在 key 中)
(3)大小写混用:User:1001、user:1001(易冲突,不易维护)
(4)过长 key:mall:user:register:2023:07:30:1001:info(可简化为user:1001:info,时间维度通过其他 key 关联)

通过以上设计,既能清晰表达 key 的业务含义,又能方便后续维护和扩展,同时减少 key 冲突风险。

【二】

http://www.lryc.cn/news/607386.html

相关文章:

  • dolphinscheduler中一个脚本用于从列定义中提取列名列表
  • 香港正式启动稳定币牌照制度!推动中国的人民币国际化?
  • SQL中的LEFT JOIN
  • 微服务的编程测评系统9-竞赛新增-竞赛编辑
  • Flask一个用户同时只能在一处登录实现
  • Linux网络:多路转接 epoll
  • CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)
  • iPhone 恢复出厂设置是否会删除所有内容?
  • iPhone查看App日志和系统崩溃日志的完整实用指南
  • 用落霞归雁的思维框架推导少林寺用什么数据库?
  • Syzkaller实战教程6:[重要]初始种子加载机制剖析第二集
  • 使用 Docker 部署 Label Studio 时本地文件无法显示的排查与解决
  • 无人机自动跟随模块技术分析
  • Docker 实战 -- Nextcloud
  • 【05】VM二次开发——模块参数配置--带渲染/不带渲染(WinForm界面调用 模块参数配置)
  • Java 日期时间处理:分类、用途与性能分析
  • 前端学习日记(十七)
  • Ant 构建java项目
  • FastDDS (SharedMemory)
  • webpack面试题及详细答案80题(41-60)
  • C++ 前缀和、双指针
  • Node.js中Buffer的用法
  • 嵌入式第十七课!!!!位运算!!!
  • 考取锅炉司炉工证需要学习哪些专业知识?
  • Linux 用户与组管理:从配置文件到实操命令全解析
  • golang的函数
  • YOLO V11 + BotSort行人追踪定位项目
  • 风光储并离网切换仿真模型(下垂控制一次调频)
  • 详解K8s集群搭建:从环境准备到成功运行
  • 【问题思考总结】CART树如何剪枝?从CART树的生成到剪枝以及为什么CTt一定小于Ct?【图文】