Redis Key 设计原则
在开发中,Redis 的 key 设计非常重要,因为它直接影响到 Redis 的性能、可维护性、扩展性以及数据的有效存取。设计 Redis 的 key 时,需要考虑如何确保 key 的唯一性、合理性和高效性。
Redis Key 设计原则
唯一性:
每个 key 都应该是唯一的,避免出现冲突。可以使用组合字符串(如{prefix}:{userId}
)来确保唯一性。命名规范:
使用 前缀 来标识数据类型或业务场景。
采用 冒号分隔 来组织层级结构,确保易读性和区分度。
推荐使用小写字母和下划线
_
作为分隔符。使用有意义的前缀来标识数据类型,如
user
,session
,order
等。
过期策略:
在设置 key 时,可以为其设置过期时间(TTL)。这通常用于缓存类的数据。
对于有时效性的 key(如 token、验证码等),应该确保设置合理的过期时间。
避免过长的 key:
Key 太长会占用更多内存,影响 Redis 性能。通常建议 key 的长度控制在 512 字符以内。
常见 Redis Key 的设计模式
基本结构:
使用
{prefix}:{identifier}
的格式。例如:user:12345
表示用户 ID 为 12345 的数据。prefix
用来表示数据的类型或业务模型,identifier
通常是资源的唯一标识。
示例:
user:12345
: 用户信息order:10001
: 订单信息session:abc123
: 会话数据product:98765
: 商品信息token:sessionId
: 存储 sessionToken 或 JWT
组合结构:
使用多个字段来组合 key,例如:
order:1001:user:12345
表示特定用户的特定订单。
示例:
cart:user:12345
: 用户 12345 的购物车数据cache:user:12345:profile
: 用户的缓存个人信息
缓存和令牌的 key:
对于缓存类的 key,可以加上时间戳或者有效期字段,以便在缓存失效后可以有效区分。示例:
cache:user:12345:profile:2025
: 缓存数据带有时间戳,方便清理过期数据token:app:user:12345
: 存储用户 12345 的登录令牌
带有状态的 key:
对于需要标记状态的数据,可以将状态信息作为 key 的一部分。示例:
user:12345:status:active
: 表示用户 ID 为 12345 的状态为 active(在线/激活)order:10001:status:pending
: 表示订单 10001 的状态是待处理
嵌套结构:
如果业务需要复杂的结构,通常会使用嵌套结构的方式进行区分和存储。可以通过分隔符将不同层级的数据组织起来。示例:
user:12345:cart:items
: 用户 12345 的购物车商品列表order:1001:item:2001
: 订单 1001 中的商品 2001 信息
集合类型的 key:
Redis 提供了多种集合数据类型(如 List、Set、SortedSet 等)。可以用相同的 prefix 来表示不同集合类型的数据。示例:
set:user:12345:friends
: 用户 12345 的好友列表(使用 Redis 的 Set 类型)list:chat:room:1001:messages
: 聊天室 1001 的消息列表(使用 Redis 的 List 类型)
Redis Key 设计示例
用户相关数据
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);
关键点总结:
前缀和命名规范:使用清晰、可读的前缀来标识数据类型,并确保 key 的唯一性。
过期时间:合理设置过期时间,以便缓存和临时数据不在 Redis 中占用过多空间。
多层次结构:使用冒号(
:
)分隔符,组织复杂的 Redis key,以便更好地理解和维护。数据类型区分:使用不同的 Redis 数据结构(如 Set、List、Hash)来存储不同类型的数据。
避免过长的 key:合理控制 key 的长度,避免过长的 key 导致性能问题。