Memcached + SpringBoot 从常量文件中读取缓存键值
Memcached + SpringBoot read cache key value from a constant file
我想在缓存和清除数据时从 java 常量文件中读取内存缓存密钥。我不想从 属性 文件中读取,只是从常量文件中读取。
例如在缓存数据时:
BookConstant.java
public class BookConstant
{
public static final String CACHE_BY_BOOK_ID = "book_id";
}
BookServiceImpl.java
@Override
@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "#BookConstant.CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id)
{
Optional<Book> book = bookRepository.findById(id);
return book.orElse(null);
}
我的目的是生成密钥:
book_id_1234
并且在逐出数据时:
@Override
public Book updateBook(Book book)
{
book.setModifiedDate(new Date());
Book newBook = bookRepository.save(book);
bookSearchService.insertBookIndex(newBook);
memcachedClient.evict(BookConstant.CACHE_BY_BOOK_ID + "_" + book.getId());
return newBook;
}
所以它在缓存数据时抛出错误:
SpelEvaluationException: EL1007E: Property or field 'CACHE_BY_BOOK_ID' cannot be found on null
因为它尝试从 属性 文件中读取密钥。
我不确定是否可以动态地从常量文件中读取密钥,但这就是问题所在。如果可能的话,你能帮帮我吗?谢谢。
用于访问 @Cacheable
注释中使用的常量值的 SpEL 不正确。您需要使用包指定完整的 class 名称,例如如果你的包裹是 com.example
那么指定它是这样的:
@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id) {
//...
}
对于更新,您不需要直接使用 memcachedClient 逐出,而是使用 @CacheEvict
注释,例如
@CacheEvict(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #book.id")
public Book updateBook(Book book) {
// ...
}
我想在缓存和清除数据时从 java 常量文件中读取内存缓存密钥。我不想从 属性 文件中读取,只是从常量文件中读取。
例如在缓存数据时:
BookConstant.java
public class BookConstant
{
public static final String CACHE_BY_BOOK_ID = "book_id";
}
BookServiceImpl.java
@Override
@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "#BookConstant.CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id)
{
Optional<Book> book = bookRepository.findById(id);
return book.orElse(null);
}
我的目的是生成密钥:
book_id_1234
并且在逐出数据时:
@Override
public Book updateBook(Book book)
{
book.setModifiedDate(new Date());
Book newBook = bookRepository.save(book);
bookSearchService.insertBookIndex(newBook);
memcachedClient.evict(BookConstant.CACHE_BY_BOOK_ID + "_" + book.getId());
return newBook;
}
所以它在缓存数据时抛出错误:
SpelEvaluationException: EL1007E: Property or field 'CACHE_BY_BOOK_ID' cannot be found on null
因为它尝试从 属性 文件中读取密钥。
我不确定是否可以动态地从常量文件中读取密钥,但这就是问题所在。如果可能的话,你能帮帮我吗?谢谢。
用于访问 @Cacheable
注释中使用的常量值的 SpEL 不正确。您需要使用包指定完整的 class 名称,例如如果你的包裹是 com.example
那么指定它是这样的:
@Cacheable(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #id")
public Book getById(Long id) {
//...
}
对于更新,您不需要直接使用 memcachedClient 逐出,而是使用 @CacheEvict
注释,例如
@CacheEvict(cacheNames = BookConstant.CACHE_NAME, key = "T(com.example.BookConstant).CACHE_BY_BOOK_ID + '_' + #book.id")
public Book updateBook(Book book) {
// ...
}