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

redis 如何优雅地进行键设计?

Redis 键设计的优雅实践

在 Redis 中,良好的键设计对系统的可维护性、可扩展性和性能至关重要。以下是一些优雅设计 Redis 键的最佳实践:

1. 基本命名规范

结构化命名

使用冒号(:)分隔不同部分,形成层次结构:

业务域:子域:唯一标识[:字段]

示例

user:1001:profile
order:2023:items
product:electronics:category

2. 具体设计模式

对象存储模式

user:{id}:profile       # 用户基本信息
user:{id}:settings     # 用户设置
user:{id}:friends      # 用户好友列表

关系模式

user:{uid}:orders      # 用户的订单集合
order:{oid}:items      # 订单中的商品
product:{pid}:buyers   # 购买过该商品的用户

计数器模式

stats:user:{uid}:logins   # 用户登录次数
stats:product:{pid}:views # 商品浏览次数

3. 高级设计技巧

1. 避免大键

  • 将大对象拆分为多个小键
  • 例如用户数据:
    user:{id}:basic
    user:{id}:contact
    user:{id}:preferences
    

2. 可查询设计

user:email:{email}       # 通过email反查用户ID
user:name:{name}:ids    # 通过用户名查找用户ID集合

3. 时效性键设计

session:{token}         # 会话数据(设置TTL)
temp:verify:{code}      # 验证码(短期有效)

4. 多租户支持

tenant:{tid}:user:{uid}
tenant:{tid}:product:{pid}

5. 环境隔离

dev:user:{uid}
prod:user:{uid}
staging:config:global

4. 反模式与避免方法

应避免的设计

  1. 过长的键名

    • this-is-a-very-long-redis-key-that-describes-too-much
    • short:key:{id}
  2. 特殊字符

    • user/data/1001
    • user:data:1001
  3. 无结构扁平设计

    • user1001, productA42, order2023X
    • user:1001, product:A42, order:2023X
  4. 频繁变化的键

    • user:lastlogin:${timestamp}
    • user:1001:lastlogin + HSET/HGET

5. 实际案例

电子商务系统

# 产品相关
product:1001:info          # 商品基本信息(HASH)
product:1001:inventory     # 库存数量
product:category:electronics:ids  # 分类下的商品ID集合# 用户相关
user:2001:cart             # 用户购物车(HSET)
user:2001:recent_views     # 最近浏览(ZSET)# 订单相关
order:5001:details         # 订单详情
order:5001:status          # 订单状态
user:2001:orders           # 用户的订单集合(SET)

社交网络系统

user:3001:followers        # 粉丝列表
user:3001:following        # 关注列表
post:9001:likes            # 点赞用户集合
post:9001:comments         # 评论列表
timeline:user:3001         # 用户时间线(ZSET)

6. 键设计检查清单

  1. 可读性:其他开发者能否一眼看懂键的用途?
  2. 可预测性:能否通过模式匹配批量操作相关键?
  3. 可扩展性:能否适应未来业务变化?
  4. 性能:键长度是否适中?扫描模式是否高效?
  5. 命名冲突:不同业务域的键是否会冲突?

通过遵循这些原则,你可以创建出既高效又易于维护的 Redis 键设计方案,为应用提供良好的数据访问基础。

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

相关文章:

  • 【Spark征服之路-3.6-Spark-SQL核心编程(五)】
  • Spring @RequestBody注解详解与实践
  • oracle 数据库中,将几张表的数据按指定日期范围实时同步至同一个数据库的备份表中。
  • Oracle 数据库共享池与大池调优指南
  • 深度学习 -- 梯度计算及上下文控制
  • HTTP性能优化实战技术详解(2025)
  • day058-docker常见面试题与初识zabbix
  • SpringDoc 基本使用指南
  • 三维空间中的向量与坐标系变换:数学原理与C++实现
  • 安装pytorch(cpu版)
  • k8s知识点
  • WSL如何安装docker?
  • 低代码/无代码平台如何重塑开发生态
  • 141 个 LangChain4j Maven 组件分类解析、多场景实战攻略
  • 飞算科技:以原创技术为翼,赋能产业数字化转型
  • 前端,demo操作,增删改查,to do list小项目
  • 笼子在寻找一只鸟:解读生活的隐形陷阱
  • delphi disqlite3 操作sqlite
  • Go语言实战案例-简易日志记录器
  • C++基于libmodbus库实现modbus TCP/RTU通信
  • UE5多人MOBA+GAS 27、死亡被动(用于作为击杀奖励,爆金币和是增加经验)
  • RPA与AI:从自动化到智能化的企业转型之路
  • AWS Certified Cloud Practitioner 认证考试 测试题与解析
  • 用Java 代码实现一个简单的负载均衡逻辑
  • 电子数据取证领域的双轮驱动——手工分析 vs 自动化分析
  • Web开发:ABP框架12——中间件Middleware的创建和使用
  • 轨迹优化 | 基于边界中间值问题(BIVP)的路径平滑求解器(附C++/Python仿真)
  • Python自然语言处理实战:spaCy从入门到进阶的工业级应用指南
  • 《C++》范围 for 循环,空指针nullptr
  • 【iOS】多界面传值(五大传值方式)