使用 Spring Boot 在 Redis 中嵌套键

Nested keys in redis using Spring Boot

我想 运行 在 spring 中使用 quartz 引导作业,其中多个线程将执行该方法。 我想要的是将每次处理的结果保存在redis中,这样我就可以知道工作做得有多好。

我想把数据以这种形式存在redis中

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

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

可能吗?

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

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

你考虑过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 应该是原子的。

我使用 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)。就我而言,我确定我不会有重复项,所以设置对我有用。