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

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

java 复制代码
@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注解

java 复制代码
@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;
 }

使用

java 复制代码
@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;
 }
}
相关推荐
杨云龙UP21 分钟前
CentOS Linux 7 (Core)上部署Oracle 11g、19C RAC详细图文教程
数据库·oracle
ezl1fe33 分钟前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端
小咖张39 分钟前
spring声明式事务,finally 中return对事务回滚的影响
数据库·java 声明式事务
JSON_L40 分钟前
MySQL 加锁与解锁函数
数据库·mysql
白鲸开源2 小时前
收藏!史上最全 Apache SeaTunnel Source 连接器盘点 (2025版),一篇通晓数据集成生态
大数据·数据库·开源
MonKingWD2 小时前
MySQL事务篇-事务概念、并发事务问题、隔离级别
数据库·后端·mysql
我科绝伦(Huanhuan Zhou)2 小时前
银河麒麟V10一键安装Oracle 11g脚本分享
数据库·oracle
秋千码途4 小时前
一道同分排名的SQL题
数据库·sql
lssjzmn4 小时前
🚀如何基于Redis的ZSet数据结构设计一个通用的,简单的,可靠的延迟消息队列,以RedisTemplate为例
redis
jakeswang5 小时前
应用缓存不止是Redis!——亿级流量系统架构设计系列
redis·分布式·后端·缓存