Перейти к основному содержимому

Spring Cache — создание собственного генератора ключей

· 2 мин. чтения

1. Обзор

В этом кратком руководстве мы покажем, как создать собственный генератор ключей с помощью Spring Cache.

Для ознакомления с вышеупомянутым модулем, пожалуйста, обратитесь к этой статье .

2. Генератор ключей

Это отвечает за создание каждого ключа для каждого элемента данных в кэше, который будет использоваться для поиска элемента данных при извлечении.

Реализацией по умолчанию здесь является SimpleKeyGenerator , который использует предоставленные параметры метода для генерации ключа. Это означает, что если у нас есть два метода, которые используют одно и то же имя кеша и набор типов параметров, то велика вероятность, что это приведет к коллизии.

Это также означает, что данные кэша могут быть перезаписаны другим методом.

3. Пользовательский генератор ключей

KeyGenerator должен реализовать только один единственный метод:

Object generate(Object object, Method method, Object... params)

Если он не реализован или используется неправильно, это может привести к перезаписи данных кэша.

Посмотрим на реализацию:

public class CustomKeyGenerator implements KeyGenerator {

public Object generate(Object target, Method method, Object... params) {
return target.getClass().getSimpleName() + "_"
+ method.getName() + "_"
+ StringUtils.arrayToDelimitedString(params, "_");
}
}

После этого у нас есть два возможных способа его использования; первый — это объявление bean-компонента в ApplicationConfig .

Важно отметить, что класс должен расширяться от CachingConfigurerSupport или реализовывать CacheConfigurer :

@EnableCaching
@Configuration
public class ApplicationConfig extends CachingConfigurerSupport {

@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
Cache booksCache = new ConcurrentMapCache("books");
cacheManager.setCaches(Arrays.asList(booksCache));
return cacheManager;
}

@Bean("customKeyGenerator")
public KeyGenerator keyGenerator() {
return new CustomKeyGenerator();
}
}

Второй способ - использовать его только для определенного метода:

@Component
public class BookService {

@Cacheable(value = "books", keyGenerator = "customKeyGenerator")
public List<Book> getBooks() {
List<Book> books = new ArrayList<>();
books.add(new Book("The Counterfeiters", "André Gide"));
books.add(new Book("Peer Gynt and Hedda Gabler", "Henrik Ibsen"));
return books;
}
}

4. Вывод

В этой статье мы рассмотрели способ реализации собственного генератора ключей Spring Cache .

Как всегда, полный исходный код примеров доступен на GitHub .