【问题标题】:Memcached + SpringBoot read cache key value from a constant fileMemcached + SpringBoot 从常量文件中读取缓存键值
【发布时间】:2020-03-19 21:57:05
【问题描述】:

我想在缓存和驱逐数据时从 java 常量文件中读取 memcached 键。我不想从属性文件中读取,只是从常量文件中读取。

例如在缓存数据时:

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: 在 null 上找不到属性或字段“CACHE_BY_BOOK_ID”

因为它尝试从属性文件中读取密钥。

我不确定是否可以动态地从常量文件中读取密钥,但这就是问题所在。如果可能的话,你能帮帮我吗?谢谢。

【问题讨论】:

    标签: java spring spring-boot caching memcached


    【解决方案1】:

    用于访问@Cacheable 注释中使用的常量值的SpEL 不正确。您需要使用包指定完整的类名,例如如果你的包是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) {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-02-17
      相关资源
      最近更新 更多