使用 Simple Spring Memcached 使整个命名空间无效

Invalidate entire namespace using Simple Spring Memcached

有没有人试过使整个 memcached 命名空间失效?

例如我有两个具有不同键的读取方法

@Override
@ReadThroughSingleCache(namespace = UrlClientExclusion.TABLE_NAME, expiration = 24 * HOUR)
public List<UrlClientExclusion> list(@ParameterValueKeyProvider String idClient) {

@Override
@ReadThroughSingleCache(namespace = UrlClientExclusion.TABLE_NAME, expiration = 24 * HOUR)
public UrlClientExclusion find(@ParameterValueKeyProvider int idUrlClientExclusion) {

并且我想在 update/delete 操作

上删除整个命名空间 UrlClientExclusion.TABLE_NAME

我不能使用密钥列表方法,因为应用程序的实例很多

@InvalidateMultiCache(namespace = UrlClientExclusion.TABLE_NAME)
public int update(UrlClientExclusion urlClientExclusion, /*@ParameterValueKeyProvider List<Object> keylist*/ /* it is impossibile for me put all keys in this list*/) {

所以解决方案是删除整个命名空间。

执行此操作的注释是什么? 是否可以构建自定义注解来删除整个命名空间?怎么样?

非常感谢

我不知道如何使用 simple-spring-memcached 库处理这个问题。但我建议您改用 Spring's Cache Abstraction 。通过这种方式,您可以将缓存存储更改为您的偏好之一,例如ConcurrentHashMapEhcacheRedis 等。这只是您的应用程序的配置更改。对于命名空间的逐出,你可以这样做:

@CacheEvict(cacheNames="url_client_exclusion", allEntries=true) 
public int update(...)

遗憾的是,Pivotal 未提供对 Memcached 的官方支持,但如果您确实需要使用 Memcached,您可以查看 Memcached Spring Boot 符合 Spring 缓存抽象的库。

有一个示例 Java 应用程序,您可以在其中了解如何使用此库。在那里您还可以找到 @CacheEvict 用法的示例 (link)。

Memcached 不支持命名空间,SSM 提供命名空间作为逻辑抽象。由于 memcached 不会将键分组到命名空间中,因此无法刷新给定命名空间中的所有键。 Memcached 仅支持 flushing/removing 个单键或所有键。

您可以从 memcached 实例中刷新所有数据,或者需要提供应删除的确切键。