【问题标题】:Multiple key pointing to single value in Redis (Cache) with java使用java在Redis(缓存)中指向单个值的多个键
【发布时间】:2017-11-03 13:00:23
【问题描述】:

我想使用带有 java 的 jedis(Redis 缓存)存储具有单个值的多个键。

我有三个键,例如user_1driver_10admin_5 和 value = this is user,我想通过使用这三个键中的任何一个来获得价值。

【问题讨论】:

  • 您能澄清一下您的密钥是什么吗?是[user_10,driver_5] 包括括号吗?您使用的是哪个redis java client?绝地,杰瑞迪斯? (不知道任何“jdis”)
  • 我想添加多个指向单个值的键假设我有三个键,如 user_1、driver_10、admin_5 和 value = "this is user",我想通过使用其中的任何一个键来获得价值三

标签: java caching redis hash-of-hashes


【解决方案1】:

Redis 目前不支持多个键指向同一个值,请参阅issue #2668

您需要一种解决方法。

下面的一些想法,可能是显而易见的或愚蠢的:)


也许有一个中间键:
- user_10id_123
- driver_5id_123
- id_123data_that_you_dont_want_to_duplicate

您可以在您的客户端代码或服务器上的自定义 Lua 脚本中实现该逻辑,并让您的客户端代码使用这些脚本(但我对此知之甚少,无法提供详细信息)。

如果您在客户端实现间接逻辑,并且访问不平衡,例如您将在 99% 的时间通过用户密钥访问数据,并在 1% 的时间通过驱动程序密钥访问数据,则可能值得避免 2 99% 情况下的客户端-服务器往返。为此,您可以对重定向进行编码。例如,如果第一个字符是#,那么剩下的就是数据。如果第一个字符是@,那么剩下的就是实际的键。

  • user_10#data_that_you_dont_want_to_duplicate
  • driver_5@user_10

【讨论】:

  • 我想添加多个指向单个值的键假设我有三个键,如 user_1、driver_10、admin_5 和 value = "this is user",我想通过使用其中的任何一个键来获得价值三
  • 好的,那我想我理解正确,我的答案的第一句话是相关的:目前不支持,所以你可以对链接的github问题发表评论,或者考虑解决方法。
  • 您的解决方法绝对有意义。这是超级聪明而不是愚蠢
【解决方案2】:

这是一个 Lua 脚本,可以节省流量,并在一次调用中提取数据:

eval "return redis.call('get',redis.call('get',KEYS[1]))" 1 user-10

上面会返回请求数据。

【讨论】:

  • 如何确保两个密钥都存在于同一个分片/集群中?
  • 你不能这样做,但这不是它的目的。如果你需要类似的东西,你应该阅读redis.io/topics/cluster-spec,其中解释了哈希标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 2012-11-03
  • 2016-12-17
相关资源
最近更新 更多