feat: Add @TTL to allow expiration of keys
This commit is contained in:
parent
0f75a1c261
commit
edc88bdb9a
@ -21,7 +21,7 @@ import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* A repository belonging to a {@link IDatabase}.
|
||||
* A repository belonging to an {@link IDatabase}.
|
||||
*
|
||||
* @author Braydon
|
||||
* @param <D> the database this repository uses
|
||||
|
@ -7,9 +7,12 @@ package me.braydon.feather.database.impl.redis;
|
||||
|
||||
import io.lettuce.core.api.sync.RedisCommands;
|
||||
import lombok.NonNull;
|
||||
import me.braydon.feather.common.Tuple;
|
||||
import me.braydon.feather.data.Document;
|
||||
import me.braydon.feather.database.Repository;
|
||||
import me.braydon.feather.database.impl.redis.annotation.TTL;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -79,7 +82,20 @@ public class RedisRepository<ID, E> extends Repository<Redis, ID, E> {
|
||||
}
|
||||
for (E entity : entities) { // Set our entities
|
||||
Document<String> document = new Document<>(entity); // Create a document from the entity
|
||||
commands.hmset(keyPrefix + ":" + document.getKey(), document.toMappedData());
|
||||
String key = keyPrefix + ":" + document.getKey(); // The key of this entity
|
||||
commands.hmset(key, document.toMappedData()); // Set the mapped document in the database
|
||||
|
||||
// Handling @TTL annotations
|
||||
for (Tuple<Field, String> tuple : document.getMappedData().values()) {
|
||||
Field field = tuple.getLeft();
|
||||
if (!field.isAnnotationPresent(TTL.class)) { // Missing @TTL
|
||||
continue;
|
||||
}
|
||||
long ttl = field.getAnnotation(TTL.class).value(); // Get the ttl value
|
||||
if (ttl > 0L) { // Value is above zero, set it
|
||||
commands.expire(key, ttl);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (multi) { // Execute the commands in bulk
|
||||
commands.exec();
|
||||
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (c) 2023 Braydon (Rainnny). All rights reserved.
|
||||
*
|
||||
* For inquiries, please contact braydonrainnny@gmail.com
|
||||
*/
|
||||
package me.braydon.feather.database.impl.redis.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* Fields flagged with this annotation will
|
||||
* expire after the amount of defined seconds.
|
||||
*
|
||||
* @author Braydon
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
@Documented @Inherited
|
||||
public @interface TTL {
|
||||
/**
|
||||
* The time-to-live value.
|
||||
* <p>
|
||||
* If the value is zero or
|
||||
* below, then there will
|
||||
* be no expiration.
|
||||
* <p>
|
||||
* The key this TTL rule is assigned
|
||||
* to will expire in the defined amount
|
||||
* of seconds from when the key was updated.
|
||||
* </p>
|
||||
*
|
||||
* @return the value in seconds
|
||||
*/
|
||||
long value() default -1L;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user