参考:cache注解
主要有4个注解:@Cacheable @CachePut @CacheEvict @Caching
@Cacheable
@Cacheable(cacheNames = "userList",keyGenerator = "keyGenerator")
@Override
public List selectAll() {
return userMapper.selectAll();
}
redis中会生成一个name是userList,key为selectAll的记录
其中key是根据redisconfig中的keyGenerator生成的,此处我是用方法名和参数来生成key
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
sb.append(method.getName());
int index=0;
for (Object obj : objects) {
sb.append(index+":"+obj.toString());
index++;
}
return sb.toString();
}
};
}
@CacheEvict
@CacheEvict(cacheNames = "userList",allEntries = true)
@Override
public int insertUser(User user) {
user.setPassword(ShiroUtils.encryptPassword("SHA-256", user.getPassword(), user.getUsername()));
if (userMapper.selectbyUsername(user.getUsername()) != null) {
throw new RuntimeException("0003");
}
return userMapper.insertSelective(user);
}
当插入新的数据时,应该删除userList的缓存,allEntries = true表示 删除所有名为userList的记录,不需要指定key,如果不想全部删除,就指定key删除特定的缓存
@Caching
有时候我们需要指定多个cache注解,就可以使用@caching注解
@Caching(evict = {
@CacheEvict(cacheNames = "userList",allEntries = true),
@CacheEvict(cacheNames = "users",key = "#id")
})
@Override
public int updateUser(int id, User user) {
User user1 = userMapper.selectByPrimaryKey(id);
if ( user1== null) {
throw new RuntimeException("0006");
} else {
//判断用户为普通用户还是系统管理员
//若为普通用户,则无法修改权限role
if(!SecurityUtils.getSubject().hasRole("superadmin"))
{
user.setRole(user1.getRole());
}
user.setId(id);
return userMapper.updateByPrimaryKeySelective(user);
}
}
比如更新了数据之后,就需要删除userList缓存,还有users下的这个id的缓存,所以这里@cacheEvict中需要指定特定的key,而不是allEntries=true
@CachePut
@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。比如更新了单个数据,此时就可以使用@CachePut
@CachePut((cacheNames = "users",key = "#id")
@Override
public int updateUser(int id, User user) {
//todo
}
最近用到了redis缓存,就粗粗自己记录一下,嘿嘿嘿