Java 使用redisspring对Redis进行多字段查询
这将是一个非常重要的问题,因为我是SpringRedis的新手 我目前正在学习Redis数据库,我正在开发一个关于优先级的功能,我不得不使用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
@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
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 ...