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

Redis Key 设计原则

在开发中,Redis 的 key 设计非常重要,因为它直接影响到 Redis 的性能、可维护性、扩展性以及数据的有效存取。设计 Redis 的 key 时,需要考虑如何确保 key 的唯一性、合理性和高效性。

Redis Key 设计原则

  1. 唯一性
    每个 key 都应该是唯一的,避免出现冲突。可以使用组合字符串(如 {prefix}:{userId})来确保唯一性。

  2. 命名规范

    • 使用 前缀 来标识数据类型或业务场景。

    • 采用 冒号分隔 来组织层级结构,确保易读性和区分度。

    • 推荐使用小写字母和下划线 _ 作为分隔符。

    • 使用有意义的前缀来标识数据类型,如 user, session, order 等。

  3. 过期策略

    • 在设置 key 时,可以为其设置过期时间(TTL)。这通常用于缓存类的数据。

    • 对于有时效性的 key(如 token、验证码等),应该确保设置合理的过期时间。

  4. 避免过长的 key

    • Key 太长会占用更多内存,影响 Redis 性能。通常建议 key 的长度控制在 512 字符以内。

常见 Redis Key 的设计模式

  1. 基本结构

    • 使用 {prefix}:{identifier} 的格式。例如:user:12345 表示用户 ID 为 12345 的数据。

    • prefix 用来表示数据的类型或业务模型,identifier 通常是资源的唯一标识。

    示例

    • user:12345: 用户信息

    • order:10001: 订单信息

    • session:abc123: 会话数据

    • product:98765: 商品信息

    • token:sessionId: 存储 sessionToken 或 JWT

  2. 组合结构

    • 使用多个字段来组合 key,例如:order:1001:user:12345 表示特定用户的特定订单。

    示例

    • cart:user:12345: 用户 12345 的购物车数据

    • cache:user:12345:profile: 用户的缓存个人信息

  3. 缓存和令牌的 key
    对于缓存类的 key,可以加上时间戳或者有效期字段,以便在缓存失效后可以有效区分。

    示例

    • cache:user:12345:profile:2025: 缓存数据带有时间戳,方便清理过期数据

    • token:app:user:12345: 存储用户 12345 的登录令牌

  4. 带有状态的 key
    对于需要标记状态的数据,可以将状态信息作为 key 的一部分。

    示例

    • user:12345:status:active: 表示用户 ID 为 12345 的状态为 active(在线/激活)

    • order:10001:status:pending: 表示订单 10001 的状态是待处理

  5. 嵌套结构
    如果业务需要复杂的结构,通常会使用嵌套结构的方式进行区分和存储。可以通过分隔符将不同层级的数据组织起来。

    示例

    • user:12345:cart:items: 用户 12345 的购物车商品列表

    • order:1001:item:2001: 订单 1001 中的商品 2001 信息

  6. 集合类型的 key
    Redis 提供了多种集合数据类型(如 List、Set、SortedSet 等)。可以用相同的 prefix 来表示不同集合类型的数据。

    示例

    • set:user:12345:friends: 用户 12345 的好友列表(使用 Redis 的 Set 类型)

    • list:chat:room:1001:messages: 聊天室 1001 的消息列表(使用 Redis 的 List 类型)

Redis Key 设计示例

  1. 用户相关数据

user:{userId}:profile  // 存储用户个人信息
user:{userId}:session  // 存储用户登录会话
user:{userId}:cart     // 用户购物车信息
user:{userId}:order:{orderId}  // 用户某个订单信息

   2.订单相关数据

order:{orderId}:status  // 存储订单状态
order:{orderId}:items   // 存储订单商品列表

3.缓存数据

cache:{cacheType}:{id}  // 存储缓存数据,如用户缓存:cache:user:{userId}

4.令牌(Token)相关数据

token:{tokenId}   // 存储令牌(例如用户登录令牌)
token:{userId}:refresh  // 存储用户的刷新 token

5.数据会话

session:{sessionId}:data  // 存储某个 session 的数据

6.操作日志

log:{operationType}:{timestamp}  // 操作日志

Redis Key 的生命周期与过期时间设计

缓存数据的过期时间设计:通常,缓存数据会设置一定的过期时间。Redis 提供了设置过期时间的方法,例如:

  • token 的过期时间:对于 token,可以设置过期时间,比如 24 小时。

  • 验证码的过期时间:验证码一般会设置较短的有效期,比如 5 分钟。

  • 会话的过期时间:会话数据可以设置较长的过期时间,可能是几天或者几个月。

// 设置 24 小时后过期
stringRedisTemplate.opsForValue().set("token:12345", token, 24, TimeUnit.HOURS);// 设置 5 分钟后过期
stringRedisTemplate.opsForValue().set("verification:code:12345", "123456", 5, TimeUnit.MINUTES);

关键点总结:

  1. 前缀和命名规范:使用清晰、可读的前缀来标识数据类型,并确保 key 的唯一性。

  2. 过期时间:合理设置过期时间,以便缓存和临时数据不在 Redis 中占用过多空间。

  3. 多层次结构:使用冒号(:)分隔符,组织复杂的 Redis key,以便更好地理解和维护。

  4. 数据类型区分:使用不同的 Redis 数据结构(如 Set、List、Hash)来存储不同类型的数据。

  5. 避免过长的 key:合理控制 key 的长度,避免过长的 key 导致性能问题。

http://www.dtcms.com/a/282615.html

相关文章:

  • Excel转PDF的三种方法
  • 基于大数据的网络文学推荐分析系统的设计与实现【海量书籍、自动爬虫】
  • 《通信原理》学习笔记——第二章
  • AI进化论15:通用人工智能(AGI)的“终极梦想”与“潘多拉魔盒”
  • AI炒作,AGI或在2080年之前也无法实现,通用人工智能AGI面临幻灭
  • 基于 .Net Core+MySQL开发(WinForm)翻译平台
  • rLLM:用于LLM Agent RL后训练的创新框架
  • 前端面试题(React 与 Vue)
  • #Datawhale组队学习#7月-强化学习Task1
  • Java大厂面试实录:从电商场景到AI应用的深度技术考察
  • 如何通过域名白名单​OVP防盗链加密视频?
  • 【游戏引擎之路】登神长阶(十八):3天制作Galgame引擎《Galplayer》——无敌之道心
  • AJ Security:实用的 Java Web 安全库
  • Qt获取hid设备信息
  • 抖音小程序开发如何避坑?如何接口调用与性能优化?
  • Nacos 开源 MCP Router,加速 MCP 私有化部署
  • 运维打铁: Ruby 脚本在运维自动化中的应用探索
  • leetcode 3201. 找出有效子序列的最大长度 I 中等
  • K8s 自定义调度器 Part1:通过 Scheduler Extender 实现自定义调度逻辑
  • AI Agent开发学习系列 - langchain之LCEL(1):LangChain LCEL链式编排与RAG增强实践
  • FunASR Paraformer-zh:高效中文端到端语音识别方案全解
  • Django ORM 查询工具对象详解
  • Linux 命令:uname
  • Scalefusion 与 EasyControl 对比:轻量级方案与全功能 IoT MDM 的深度碰撞
  • 前端面试题(HTML、CSS、JavaScript)
  • 在此处打开 powershell 窗口 shift + 右键 修改为 右键弹出
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑2
  • 1软件工程概念及其基本要素-思考题
  • Netty介绍和基本代码演示
  • 基于渐进式迁移学习网络(PTLN)​的小样本故障诊断模型