使用 Simple-Spring-Memcached Annotation

因为公司有的项目还运行在 MyBatis2 上边,并且 SSM 暂时还不可以直接使用在 MyBatis3 上边(可以通过 Spring Cache 或者直接使用 mybatis-memcached 来实现,但后一种方式不适合那种需要对 Cache 进行精细控制的场景)。所以这里主要写一下 SSM3 Annotation 的使用。完整的Spring3 + Memcached + MyBatis2 代码在 ssm3-mybatis2-memcached

1. SSM Annotation

SingleCache 类

操作单个 POJO 的 Cache 数据,由 ParameterValueKeyProvider 和 CacheKeyMethod 来标识组装 key。

Java Code:

@ReadThroughSingleCache(namespace = "user", expiration = 600)
public User getUser(@ParameterValueKeyProvider Long id)

Memcache Log:

get user:1
set user:1

MultiCache 类

操作 List 型的 Cache 数据(看做是 SingleCache 的批处理),由 ParameterValueKeyProvider 和 CacheKeyMethod 来标识组装 key。

Java Code:

@ReadThroughMultiCache(namespace = "user/getUsersByUserIds", expiration = 600)
public List<User> getUsersByUserIds(@ParameterValueKeyProvider final List<Long> ids)

If ids=[1,2,3], Then Memcache Log:

get user:1 user:2 user:3
set user:1
set user:2
set user:3	    

AssignCache 类

操作所有类型的 Cache 数据。适用于无参方法或者需要自定义 Key 的场景。指定 key 操作 Cache 数据,由 annotation 中的 assignedKey 指定 key。

Java Code:

@ReadThroughAssignCache(assignedKey = "user/getAllUsers", namespace = "role", expiration = 600)
public List<User> getAllUsers()

2. SingleCache Annotation

@ReadThroughSingleCache

作用:生成 Cache。

过程:

  • 在执行方法之前先检查缓存。
  • 如果找到相应的 Key,返回 Value,方法 return。
  • 如果没有找到相应的 Key,查询数据库,再 set cache,方法 return。

Key 生成规则:ParameterValueKeyProvider 指定的参数,如果该参数对象中包含 CacheKeyMethod 注解的方法,则调用其方法,否则调用 toString 方法。

@InvalidateSingleCache

作用:清除 Cache 中的数据。

key 生成规则:

  • 使用 ParameterValueKeyProvider 注解时,与 ReadThroughSingleCache 一致。
  • 使用 ReturnValueKeyProvider 注解时,key 为返回的对象的 CacheKeyMethod 或 toString 方法生成。

Java Code:

@InvalidateSingleCache(namespace = "user/list")
public void invalidateGetUsersByRoleId(@ParameterValueKeyProvider Long id)        

@UpdateSingleCache

作用:更新 Cache 中的数据。

Key 生成规则:ParameterValueKeyProvider 指定。

  • ParameterDataUpdateContent:方法参数中的数据,作为更新缓存的数据。
  • ReturnDataUpdateContent:方法调用后生成的数据,作为更新缓存的数据。
  • 上述两个注解,必须与 Update* 系列的注解一起使用。

Java Code:

@UpdateSingleCache(namespace = "user", expiration = 60)
public void updateUser(@ParameterValueKeyProvider @ParameterDataUpdateContent User user)

@UpdateSingleCache(namespace = "user", expiration = 60)
@ReturnDataUpdateContent
public void updateUser(@ParameterValueKeyProvider User user)

参考:使用SSM注解做缓存操作