在Redis(缓存)中,多个键指向单个值的实现方式(使用Java)

17

我希望使用Jedis(Redis缓存)和Java存储一个值对应多个键。

我有三个键,如user_1driver_10admin_5,值为this is user,我想通过任意一个键获取它的值。


你能澄清一下你的关键字是什么吗?它是包括方括号[user_10,driver_5]的吗?你正在使用哪个Redis Java客户端?jedis,jredis?(不知道有“jdis”) - Hugues M.
我想添加多个指向单个值的键,例如我有三个键:user_1、driver_10、admin_5,值为"this is user",我想通过这三个键中的任何一个来获取该值。 - user3864113
2个回答

24

目前Redis不支持多个键指向相同的值,请参见问题#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

1
我想添加多个指向单个值的键,假设我有三个键,如user_1、driver_10、admin_5和value =“这是用户”,我想通过使用其中任何一个键来获取值。 - user3864113
2
好的,那么我认为我理解得很正确,我的回答的第一句话是相关的:目前不支持这个功能,所以你可以在链接的 Github 问题上发表评论,或考虑解决方法。 - Hugues M.
你的解决方法非常有道理。它非常聪明,绝不是愚蠢的。 - Peter Moses
假设我想使#data_that_you_dont_want_to_duplicate无效。我可以使user_10无效,但是在Redis中,driver_5 -> @user_10键值对如何清理呢? - OscarVanL

3

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

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

以上代码将返回请求数据。

你如何确保两个键存在于同一个分片/集群中? - Joydeep Bhattacharya
你不能用它来做那件事,但这也不是它的目的。如果你需要类似的功能,你应该阅读 https://redis.io/topics/cluster-spec ,其中解释了哈希标签的使用。 - Erdogan Kurtur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接