我在 Redis 中面临缓存失效问题,尤其是关系数据。
例如,我有一个 User 对象:
{
"id": 1,
"name": "John"
}
还有一个 UserClass 对象:
{
"user_id": 1,
"class_id": 3
}
我有一个 API,可以通过
class_id
检索所有用户,并使用键 users:class:3(其中包含用户数组)将此数据存储在 Redis 中。我还有一个 API,可以使用密钥 user:1 按 ID 检索用户。
当有人更新、插入或删除用户数据时就会出现问题。我需要从缓存中删除所有相应的用户数据。通过 ID 键删除用户很简单,但是要按类别使用户的缓存无效,我目前必须查询数据库以获取与用户关联的所有类,然后使用
一一删除 Redis 中的相应键class_id
。
这种方法似乎不是最佳的,特别是当用户有类别之外的其他关系时。每次都需要再次查询数据库来找到对应的key,导致操作量很大。您对如何更有效地解决这个问题有什么建议吗?
我能想到的有多种选择:
选项-1: 您可以在 Redis 中维护跟踪这些关系的集,而不是查询数据库来查找所有相关键。例如:
选项-2
除了存储数据之外,还要维护一个反向映射以使缓存失效。例如:
根据应用程序和环境,还有其他选项。例如,SCAN 命令可以使用模式 match(users:class:*) 进行扫描,以查找并删除相关键;然而,这将是非常不高效的。我们还可以使用 Redis 管道或多重执行命令一次性使多个键失效。