redis的使用场景-热点数据缓存(把经常访问的数据放入缓存减少数据库压力)
创始人
2024-11-17 19:33:07

一、使用redis实现(不推荐,会增加业务代码维护)

@Service public class ClazzServiceImpl implements ClazzService {   @Autowired  private ClazzDao clazzDao;	//注入mapper  @Autowired  private RedisTemplate redisTemplate;	//调用redis使用  @Override  public Clazz getById(Integer id) {	//查询业务      //查询redis中是否存有缓存      ValueOperations 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 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 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;  } }

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...