作用: 为了减少对数据库的访问频率。从而提高项目的性能。
什么样的数据适合放入缓存中
1. 查询频率高
2. 修改频率低
3. 数据安全行要求低的
@Service
public class UserService {
@Resource
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
public User findById(Long id){
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
ValueOperations valueOperations = redisTemplate.opsForValue();
//1.先从redis中获取数据
Object o = valueOperations.get("user::findById::" + id);
//2.如果存在 则直接返回
if(o!=null){
return (User) o;
}
//3.如果不存在则查询数据库 并把查询的结果放入redis中
User user = userMapper.selectById(id);
if(user!=null){
valueOperations.set("user::findById::"+id,user,30, TimeUnit.MINUTES); //缓存的过期时间
}
return user;
}
public void delete(Long id){
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
ValueOperations valueOperations = redisTemplate.opsForValue();
//1.先删除缓存中具有的数据
redisTemplate.delete("user::findById::"+id);
//2. 删除数据库中具有的数据
userMapper.deleteById(id);
}
public void update(User user){
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
ValueOperations valueOperations = redisTemplate.opsForValue();
//2.再修改数据库中的数据
userMapper.updateById(user);
//1.修改缓存中的数据
valueOperations.set("user::findById::"+user.getId(),user);
}
public void insert(User user){
userMapper.insert(user);
}
}
缓存注解: 我只需要再相应方法上加入相应的缓存注解则可以完成缓存的功能
1.加入缓存的配置类
写config包 加入类 写 用于反序列化注解
在server层 加入相应的注解
@Cacheable(cacheNames = "user::findById",key="#id") @CacheEvict(cacheNames = "user::findById",key = "#id") //把缓存中指定数据删除 并执行方法体中的代码
@CachePut(cacheNames = "user::findById",key="#user.id") //把数据库中的数据修改后,把返回的数据放入到缓存中
加入启动缓存注解:
开始测试::
查询:
修改:
新增:
删除成功:
注解的方式 还是挺方便的