Redis关系型数据缓存失效问题

问题描述 投票:0回答:1

我在 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,导致操作量很大。您对如何更有效地解决这个问题有什么建议吗?

javascript database algorithm caching redis
1个回答
0
投票

我能想到的有多种选择:

选项-1: 您可以在 Redis 中维护跟踪这些关系的集,而不是查询数据库来查找所有相关键。例如:

  • 当您通过 class_id 存储用户时,还将关键 users:class:3 存储在像 user:1:classes 这样的集合中。
  • 如果用户与多个类别关联,则该集合将具有所有相应的类别键。
  • 在更新或删除时,您可以快速检索该集中的所有相关类键,并在单个操作中使它们无效,而无需访问数据库。

选项-2

除了存储数据之外,还要维护一个反向映射以使缓存失效。例如:

  • 当您缓存 users:class:3 时,还会创建一个反向映射 user:1:latedKeys,它会跟踪包含与该用户相关的数据的所有缓存键。
  • 当用户数据发生变化时,可以快速查找user:1:relatedKeys并使所有关联的key失效,无需查询数据库。

根据应用程序和环境,还有其他选项。例如,SCAN 命令可以使用模式 match(users:class:*) 进行扫描,以查找并删除相关键;然而,这将是非常不高效的。我们还可以使用 Redis 管道或多重执行命令一次性使多个键失效。

© www.soinside.com 2019 - 2024. All rights reserved.