【问题标题】:Nested keys in redis using Spring Boot使用 Spring Boot 在 redis 中嵌套键
【发布时间】:2021-07-14 21:53:15
【问题描述】:

我想使用石英在 Spring Boot 中运行一个作业,其中多个线程将执行该方法。 我想要的是将每次处理的结果保存在 redis 中,这样我就可以了解工作的效果如何。

我想以这种形式将数据保存在redis中。

{
  "2020-04-20": [
    {
      "item_1": {
        "success": "true",
        "message": ""
      }
    },
    {
      "item_2": {
        "success": "true",
        "message": ""
      }
    }
  ]
}

我想在关键日期插入所有项目。 由于多个线程正在工作,因此每个线程都在处理某个项目。所以所有项目都应该插入到唯一的键(日期)中。

有可能吗?

一种解决方案是一次又一次地覆盖(日期)键的数据,首先从redis中获取数据,在其上附加项目,然后再次将键保存在redis中。

还有其他方法吗,或者使用@cacheable、@cacheput 等注释,以便我可以创建嵌套键。项目自动附加在(日期)键中。

【问题讨论】:

标签: spring-boot caching java-8 redis


【解决方案1】:

你考虑过 RedisJSON 吗? 像这样的东西(我没有测试过,我手边没有RedisJSON)

JSON.SET "2020-04-20" . []       // create the object once

JSON.ARRAPPEND "2020-04-20". '{  // every thread issues a command like this.
      "item": {
        "success": "true",
        "message": "thread 123"
      } }'

JSON.ARRAPPEND "2020-04-20". '{  // every thread issues a command like this.
      "item": {
        "success": "true",
        "message": "thread 456"
      } }'

JSON.ARRAPPEND 应该是原子的。

【讨论】:

  • 是的,redisjson 提供了我想要实现的功能。但我之前不知道 redis 提供的设置功能。我正在使用 jedis 客户端,在那里我找到了 srem、smembers、sadd。所有函数都有 O(1) 时间复杂度。这就是我需要的。
【解决方案2】:

我使用 redis set 功能解决了这个问题。 我在我的项目中使用 jedis 客户端。

It has very useful funtions like:-
 1) sadd => insertion of element.O(1)
 2) srem => deletion of element in set.O(1)
 3) smembers => getting all results.O(N)

这是我需要的。 在我的情况下,日期是关键,其他细节(json 的一个对象)是集合的成员。因此,当在集合中添加成员时,我将我的 json 转换为数据到字符串,并且在获取数据时,我将它从字符串转换回 json。 这解决了我的问题。

注意:- 还有可以使用的列表功能。但是列表的时间复杂度不是 O(1)。就我而言,我确信我不会有重复的,所以 set 对我有用。

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2015-12-08
    • 2019-03-15
    • 1970-01-01
    • 2015-06-17
    • 2020-07-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多