当前位置: 首页 > 知识库问答 >
问题:

如何在Redis中指定id的长度

束研
2023-03-14

如何使用Redis在spring boot rest应用程序中从15-25个符号指定“ID”的长度约束?

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  private Long id;

  @Indexed
  private Status status;
}

使现代化

我尝试将id类型更改为String并为符号长度限制设置size,但它不起作用(似乎size注释被忽略)在Redis db使用范围内:

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  @Size(min = 15, max = 25)
  private String id;

  @Indexed
  private Status status;
}

我也尝试过使用自定义验证器,同样的行为——在使用Redis db时,它似乎被忽略了:

@Documented
@Constraint(validatedBy = DigitsLimitValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DigitsLimit {

  String message() default "Digits length is too short or long";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  int min() default 5;

  int max() default 15;

}

验证器:

public class DigitsLimitValidator implements ConstraintValidator<DigitsLimit, BigInteger> {

  private int min;
  private int max;

    @Override
    public void initialize(DigitsLimit value) {
      min = value.min();
      max = value.max();
    }

    @Override
    public boolean isValid(BigInteger value, ConstraintValidatorContext cxt) {
      return value != null && BigIntegerMath.log10(value, RoundingMode.FLOOR) + 1 >= min && BigIntegerMath.log10(value, RoundingMode.FLOOR) + 1 <= max;
    }

  }

型号:

@RedisHash("Foo")
public class Foo implements Serializable {

  @Id
  @DigitsLimit(min = 15, max = 25)
  private BigInteger id;

  @Indexed
  private Status status;
}

在调试模式下,我无法捕获验证程序中的任何断点。

在两次尝试中,我都可以保存任意长度的数字。限制被忽略了。为什么它被忽视了?

共有1个答案

云欣嘉
2023-03-14

如何从15-25个符号中指定“ID”的长度约束

Long类型用作Long是没有意义的。MAX_VALUE“只有”19位数字。

9223372036854775807

要包含这样的值,BigIntger可能是更好的选择。

无法将@Min@Max注释添加到biginger字段中,因为这些值被限制在范围内。所以你不能代表25位数字。

所以你有两种方法:

>

  • 创建一个自定义验证器,以确保您的约束得到尊重。

    将数值替换为字符串。您可以使用javax。验证。限制。大小注释,不适用于数字字段,但适用于CharSequence字段,如String

    例如:

    @Id
    @Size(min=15, max=25)
    private String id;
    

  •  类似资料:
    • 我在redis stream文档中看到了这一点,它说: 是时候试着用消费者群体来阅读一些东西了: XREADGROUP回复与XREAD回复一样。请注意,尽管上面提供了一个组,但它声明我希望使用消费者组mygroup从流中读取数据,我是消费者Alice。每次使用者对使用者组执行操作时,都必须指定其名称,以便在组内唯一标识此使用者。 在上面的命令行中还有另一个非常重要的细节,在强制流选项之后,为密钥m

    • 我在 Ecrion 和 Apache FOP 的试用版中渲染了相同的 XSL-FO,您会注意到这两个渲染器在第 2 行和第 3 行上产生了不同的行长。Ecrion 渲染文本的方式就是我希望 Apache FOP 这样做的方式。 我是否可以将属性添加到

    • 在Google的createEventSeries示例(如下所示)中,日期值在末尾用“est”指定。但是,我希望为重复发生的事件指定日期(请参见本答案中的时间类型#4),例如,“每周一晚上9点,即使DST发生变化。”假设我能算出哪天是我重复发生的事件的第一个星期一。问题是我如何指定当天晚上9点应该考虑到夏令时是否生效? 使用时区名称(Olson ID)指定日期是很直观的,例如,使用示例中的日期“7

    • 问题内容: 我是使用Redis的新手,最近在考虑解决出站系统高并发情况的解决方案时遇到了一个问题,我想使用Redis,每个人都知道从In- Memory访问比IO更快。Redis排序集是可以使用的工具,我们想要一个固定大小的排序集来包含用户的手机号码,我用Google搜索/百度搜索了很多,没有找到任何有意义的消息,所以有人可以告诉我如何指定Redis Sorted设置固定大小?而set应该告诉我对

    • 问题内容: 我看到有人没有在教程中设置长度,而是专门用于计算用户总数,并设置为自动递增。我习惯总是指定长度,因为我认为这是强制性的,但是我想问一下是否可以将其保留为空白,除非明确指定了始终设置长度的日期或密码。(如果不确定,我曾经将其设置为11位或更多) 问题答案: 保留为空时,每个整数字段默认为11,因此您可以将其保留。