阅读量:0
一、使用redis实现(不推荐,会增加业务代码维护)
@Service public class ClazzServiceImpl implements ClazzService { @Autowired private ClazzDao clazzDao; //注入mapper @Autowired private RedisTemplate<String, Object> redisTemplate; //调用redis使用 @Override public Clazz getById(Integer id) { //查询业务 //查询redis中是否存有缓存 ValueOperations<String, Object> forValue = redisTemplate.opsForValue(); Object o = forValue.get("clazz::" + id); //如果有直接将redis查询的数据返回 if(o!=null){ return (Clazz) o; } //如果没有查询数据库并将数据库数据保存到redis缓存中 Clazz clazz = clazzDao.selectById(id); if(clazz!=null){ forValue.set("clazz::" + id,clazz); } return clazz; } @Override public Clazz update(Clazz clazz) { //修改业务 int i = clazzDao.updateById(clazz); if(i>0){ //修改redis缓存的内容为修改后的数据 redisTemplate.opsForValue().set("clazz::"+clazz.getCid(),clazz); } return clazz; } @Override public int delete(Integer cid) { //删除业务 int i = clazzDao.deleteById(cid); if(i>0){ //删除redis缓存 redisTemplate.delete("clazz::"+cid); } return i; } }
二、使用缓存注解完成功能
编写配置类并在启动类中使用@EnableCaching注解
@Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) //缓存过期10分钟 ---- 业务需求。 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//设置key的序列化方式 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) //设置value的序列化 .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; }
使用
@Service public class ClazzServiceImpl implements ClazzService { @Autowired private ClazzDao clazzDao; @Autowired private RedisTemplate<String, Object> redisTemplate; //Cacheable:表示查询时使用的注解 等价于:redis的clazz::id @Cacheable(cacheNames ={ "clazz"}, key = "#id") @Override public Clazz getById(Integer id) { //查询数据库 Clazz clazz = clazzDao.selectById(id); return clazz; } @Override public Clazz save(Clazz clazz) { int insert = clazzDao.insert(clazz); return clazz; } //CachePut:表示修改时使用的注解 等价于:redis的clazz::id @CachePut(cacheNames = "clazz", key = "#clazz.cid") public Clazz update(Clazz clazz) { //修改数据库 int i = clazzDao.updateById(clazz); return clazz; } //CacheEvict:表示删除时使用的注解 等价于:redis的clazz::id @CacheEvict(cacheNames = "clazz", key = "#cid") @Override public int delete(Integer cid) { int i = clazzDao.deleteById(cid); return i; } }