Основанный на springboot аннотированный кеш, удобный для интеграции различных видов кеша (redis, MemCache) без изменения существующей логики кода, предотвращающий такие проблемы, как лавинный эффект. По умолчанию основан на ConcurrentHashMap и реализует локальный кеш. Через реализацию ICacheService можно заменить его на redis или MemCache кеш.
<dependency>
<groupId>com.github.doobo</groupId>
<artifactId>union-cache</artifactId>
<version>1.3</version>
</dependency>
// Чтение кеша: сначала проверяем, есть ли кеш по ключу, если есть, то считываем и возвращаем значение из кеша (метод не выполняется), иначе выполняем метод один раз и записываем результат в кеш
@RCache(prefix = "index", key = "key", expiredTime = 10)
@RCache(prefix = CacheConfig.USER_PREFIX, key = "#key", expiredTime = CacheConfig.USER_EXPIRED_TIME, unless = "#result == null || !#result.ok")
// Обновление кеша: используется для метода, после выполнения метода обновляем кеш
@UCache(prefix = CacheConfig.USER_PREFIX, key = "#key", expiredTime = CacheConfig.USER_EXPIRED_TIME)
// Удаление кеша: после выполнения метода удаляем кеш
@DCache(prefix = CacheConfig.USER_PREFIX, key = "#key", unless = "#result == null || !#result.ok")
@RestController
public class IndexController {
/**
* Каждые 30 секунд кеш становится недействительным, выполняется один раз UUID
*/
@GetMapping
@RCache(prefix = "uuid", key = "key", expiredTime = 30)
public Map<String,Object> index(){
return Collections.singletonMap("key", UUID.randomUUID().toString());
}
/**
* Обновить кеш
*/
@GetMapping("update")
@UCache(prefix = "uuid", key = "#uuid", expiredTime = 10)
public Map<String,Object> update(String uuid){
return Collections.singletonMap("key", uuid);
}
/**
* Удалить кеш
*/
@GetMapping("delete")
@DCache(prefix = "uuid", key = "key")
public Boolean delete(String key){
return Boolean.TRUE;
}
/**
* Пакетное удаление
*/
@GetMapping("batch")
@DCache(prefix = "uuid", key = "*", batchClear = true)
public Boolean batchClear(){
return Boolean.TRUE;
}
}
@Service
public class UnionLocalCacheService implements ICacheService{
@Override
public ResultTemplate<Boolean> setCache(UnionCacheRequest request) {
InMemoryCacheUtils.cache().add(request.getKey(), request.getValue(), TimeUnit.SECONDS.toMillis(request.getExpire()));
return ResultUtils.of(true);
}
@Override
public ResultTemplate<Object> getCache(UnionCacheRequest request) {
return ResultUtils.ofUnsafe(InMemoryCacheUtils.cache().get(request.getKey()));
}
@Override
public ResultTemplate<Boolean> clearCache(UnionCacheRequest request) {
InMemoryCacheUtils.cache().remove(request.getKey());
return ResultUtils.of(true);
}
@Override
public ResultTemplate<Integer> batchClear(UnionCacheRequest request) {
int count = InMemoryCacheUtils.cache().batchClear(request.getKey());
return ResultUtils.of(Integer.valueOf(count));
}
@Override
public boolean enableCompress() {
return Boolean.FALSE;
}
@Override
public boolean enableCache() {
return Boolean.TRUE;
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )