Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用redisspring对Redis进行多字段查询_Java_Spring Boot_Redis_Response Time - Fatal编程技术网

Java 使用redisspring对Redis进行多字段查询

Java 使用redisspring对Redis进行多字段查询,java,spring-boot,redis,response-time,Java,Spring Boot,Redis,Response Time,这将是一个非常重要的问题,因为我是SpringRedis的新手 我目前正在学习Redis数据库,我正在开发一个关于优先级的功能,我不得不使用Redis来实现这个功能。 下面是我的挑战/疑问 现在我们有一个数据模型,如下所示: @RedisHash("Org_Work") public class OrgWork { private @Id @Indexed UUID id; private @Indexed String CorpDetails; private @Index

这将是一个非常重要的问题,因为我是SpringRedis的新手

我目前正在学习Redis数据库,我正在开发一个关于优先级的功能,我不得不使用Redis来实现这个功能。 下面是我的挑战/疑问

现在我们有一个数据模型,如下所示:

@RedisHash("Org_Work")
public class OrgWork {

   private @Id @Indexed UUID id;
   private @Indexed String CorpDetails;
   private @Indexed String ContractType;
   private @Indexed String ContractAssigned;
   private @Indexed String State;
   private @Indexed String Country; 

}
公共接口OrgWorkRepository扩展了Crudepository{
列出FindBycorpDetails和ContractTypeandStateandCountry(字符串公司详细信息、字符串合同类型、字符串合同分配、字符串状态、字符串国家);
}
我们正在开发一个API来查询上述数据模型,前端将向我们发送公司详情、合同类型、合同分配、州和国家字段,我们必须根据Redis数据库查询这些字段,并返回DurationOfWork对象

在这种情况下,我每分钟的通话量约为100000次

请让我知道这是否是正确的方法,以及关于改进响应时间的一些建议

***更新了查询,请参见和:

  • 8.6。举例查询
  • 8.10。查询和查询方法
注释
@Indexed
指示SpringDataRedis(SDR)创建二级索引作为散列字段的索引

这意味着当您插入数据时,SDR将向Redis运行七个命令:

HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork" 
    "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" 
    "CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere" 
    ... "Country" "Costa Rica"
SADD  "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           
SADD  "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
SADD  "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
...
SADD  "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
使用示例查询:

您要创建一个:

这是一个分为两步的过程:

  • 使用
    SINTER
  • 使用
    HGETALL
  • 假设您有一台高质量的服务器,一个合理的数据集大小,并且查询在平均水平上有些特定,那么Redis每分钟100000的工作负载应该是可以管理的

    SINTER
    在最坏情况下的时间复杂度为O(N*M),其中N是最小集合的基数,M是集合数。查询中的每个维度都有一个集合

    HGETALL
    是O(N),其中N是散列的大小,在您的情况下为7


    一如既往,建议您进行一些基准测试,以测试您是否获得了所需的性能,并在需要时进行调整。

    查询“CorpDetails、ContractType、ContractAssigned、State and Country”是否只返回一个结果?我是说,我们能把它当作复合主键吗?或者您想查询这些字段的任意组合?我们希望查询有多条记录。(查询在OrdWorkRepository界面中提到)非常感谢您的解释@LeoMurillo。我还有一个问题。。查询您在下面解释的方式有什么好处
    List FindByCorpDetails和ContractTypeAndStateandCountry(String CorpDetails,String ContractType,String ContractAssigned,String State,String Country)
    我在问题的第二部分中提到的方式?仅是关于如何构建查询的代码风格。我想你已经有一个了,想展示另一个。我发现QBE更面向对象,Crudepository上的自动派生有点像长参数;另外,如果您重命名一个字段,您需要重命名该函数,我认为存在可维护性风险,不确定在这种情况下是否会出现编译错误、警告或什么都没有。品味问题。在幕后,两者都应该到达发送到Redis的相同命令,并表现出相同的性能。顺便说一句,注意方法名称缺失,ContractAssigned,这是一个相当长的名称:-)是的,Leo,我甚至想用你刚才说的方式替换查询,因为它看起来更像OO。如果它得到支持,对我来说是新闻,我认为这不是-这可能值得再问一个问题:-)
    HMSET "OrgWork:19315449-cda2-4f5c-b696-9cb8018fa1f9" "_class" "OrgWork" 
        "id" "19315449-cda2-4f5c-b696-9cb8018fa1f9" 
        "CorpDetails" "CorpDetailsValueHere" "ContractType" "ContractTypeValueHere" 
        ... "Country" "Costa Rica"
    SADD  "OrgWork" "19315449-cda2-4f5c-b696-9cb8018fa1f9"                           
    SADD  "OrgWork:CorpDetails:CorpDetailsValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
    SADD  "OrgWork:ContractType:ContractTypeValueHere" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
    ...
    SADD  "OrgWork:Country:Costa Rica" "19315449-cda2-4f5c-b696-9cb8018fa1f9"
    
    interface OrgWorkRepository extends QueryByExampleExecutor<OrgWork> {
    }
    
    class OrgWorkService {
    
      @Autowired OrgWorkRepository orgWorkRepository;
    
      List<OrgWork> findOrgWorks(OrgWork probe) {
        return orgWorkRepository.findAll(Example.of(probe));
      }
    }
    
    OrgWork orgWorkExample = new OrgWork();                          
    orgWorkExample.setCorpDetails("CorpDetailsValueHere"); 
    orgWorkExample.setContractType("ContractTypeValueHere");
    ...
    List<OrgWork> results = orgWorkService.findOrgWorks(orgWorkExample);
    
    SINTER   …:CorpDetails:CorpDetailsValueHere   …:ContractType:ContractTypeValueHere   ...
    HGETALL "OrgWork:d70091b5-0b9a-4c0a-9551-519e61bc9ef3" 
    HGETALL ...