【问题标题】:How to set TTL for map entry in aerospike如何为 aerospike 中的地图条目设置 TTL
【发布时间】:2020-07-19 08:38:13
【问题描述】:

我们有以下 aerospike 设置配置,并希望地图中的条目应在“x”天后自动删除。使用 Spring data aerospike 应该如何实现相同的功能?

@Document(collection = "cust")
public class Customer {

   @Id
   @Field(value = "PK")
   private String custId;

   @Field(value = "mobileNumber")
   private String mobileNumber;

   @Field(value = "creationTime")
   private String creationTime;
 
   @Field(value = "corrDetails")
   private HashMap<String, Object> corrDetails;
 
}

此外,我的地图中有大约 10 - 12 个 对,每个具有不同的结构,我只希望 1 个特定的 在 x 天后过期!!

依赖看起来像:-

<dependency>
            <groupId>com.aerospike</groupId>
            <artifactId>aerospike-client</artifactId>
            <version>4.1.3</version>
        </dependency>

        <dependency>
            <groupId>com.aerospike</groupId>
            <artifactId>spring-data-aerospike</artifactId>
            <version>${aerospike.data.version}</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/spring-data-aerospike-2.0.0.RELEASE.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.aerospike</groupId>
            <artifactId>aerospike-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.aerospike</groupId>
            <artifactId>aerospike-helper-java</artifactId>
            <version>1.2.2</version>
        </dependency>

【问题讨论】:

    标签: java spring-data-jpa spring-data aerospike aerospike-ce


    【解决方案1】:

    Aerospike 服务器中没有将 TTL 分配给地图数据类型中的 K:V 对的本机功能/能力。您必须从应用程序构建它。即在插入 K:V 对时存储所需的过期时间戳和 K:V 数据,然后定期扫描整个数据库以删除过期的 KV 对或在读取时删除过期的 K:V 对(强度较小但携带过期的 K :V 对直到阅读)- 真的没有优雅的选择。也许重新审视数据模型。

    Aerospike 确实具有使整个记录过期和删除的能力,即将 TTL 分配给整个记录 - 然后它有一个内部线程来为您执行过期和删除。因此,如果您可以将要保留 x 天的 K:V 对存储为单独的记录,那么这很简单。但是在 bin 级别或 bin 数据级别(如地图数据类型)的任何内容,您都必须从应用程序中处理。

    【讨论】:

    • 感谢您回复本帖。是的,我们也意识到了。我们没有要输入到地图的 K、V 对的固定模型。对于不同的 K,V 对,这可以是不同的结构。但只是好奇和想知道,如果我必须预先定义和修复我的 SET 的结构(即在项目开始时),这不会破坏像 AS !! 这样的内存数据结构的目的吗?
    • Aerospike 不是结构化数据存储的子集 - 反之亦然。您可以存储结构化的 - 预定义的数据模型或非结构化的数据 - 完全相同。也就是说,您可以让 aerospike 中的集合中的每条记录具有相同的数据结构,或者每条记录可以具有不同的数据结构 - Aerospike 以记录为中心 - 而不是以“表或集合”为中心。 SET 只是 aerospike 中记录的元数据,而不是数据结构定义。
    • 感谢您的回复。但问题是,如何将“非结构化数据”维护到 aerospike 中?假设我有 5 条不同结构的记录,它们将如何映射到单个 SET 格式?您的意思是,我们应该在 java 中定义“对象”类型的字段,然后将其保留在到达其中的任何数据上吗?这正是我们想要实现的,即我们不能在一开始就指定集合的​​结构,正如您在我上面的问题中看到的那样,我们正在定义集合的定义。任何对示例的引用都将非常有帮助!
    • 同样,在 Aerospike 中,集合名称只是记录上的一个标签。例如,Aerospike 中跨记录的数据可能是这样的:
    【解决方案2】:

    同样,在 Aerospike 中,集合名称只是记录上的一个标签。所以 Aerospike 中跨记录的数据可以是这样的:

    1. Rec Key=1, data: bin1=5, bin2="abc" 并且可以指定(可选)-> 属于“myset1”,
    2. Rec Key=2, data: bin1="cdg", bin2=7 可以指定->属于“myset1”,
    3. Rec Key="abc" data: bin1=[list data type], bin2={map data type}, bin3="xyz", bin4=4 and you specified -> 属于“myset2”

    ...希望你明白这一点。数据模式纯粹是在记录级别,集合名称只是一种建模方便 - 如果您不指定集合,记录将转到默认的“空”集合 - 集合名称作为“标签”附加到该特定记录。然后,您可以处理标签(集名称)为“myset1”的所有记录。但是在 Aerospike 中,属于同一命名空间中不同集合的所有记录都随机分布在该命名空间的存储空间上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多