redis的使用场景-热点数据缓存(把经常访问的数据放入缓存减少数据库压力)

avatar
作者
猴君
阅读量: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;  } }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!