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;
 }
}
相关推荐
Quincy_Freak19 小时前
银河麒麟aarch64如何高效做数据分析?分享一款内网离线数据分析利器
大数据·数据库·数据挖掘·数据分析·aarch64
yurenpai(27届找实习中)19 小时前
redis_点评(25.附件店铺—把数据库里的店铺按【类型分组】,批量导入Redis 的 GEO 地理位置结构)
java·redis·缓存
香气袭人知骤暖19 小时前
PG数据库 Docker 容器自动备份方案
数据库·docker·容器
闪电悠米20 小时前
黑马点评-优惠券秒杀-05_local_lock_cluster_problem
java·spring boot·redis·缓存
me83220 小时前
【Linux】Linux 目录命名规范溯源(Linux各个目录究竟是干嘛的)
linux·运维·数据库
土狗TuGou20 小时前
SQL内功笔记 · 第2篇:列的约束
数据库·笔记·sql
java_cj20 小时前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql
java_cj20 小时前
数据库范式化设计与性能优化全攻略
数据库·后端·性能优化·架构·开源
Noushiki20 小时前
MySQL索引优化实战:高效查询的黄金法则
数据库·sql·mysql
TDengine (老段)20 小时前
TDengine Commit 与 Flush 机制 — 从内存到磁盘的数据落盘全流程
大数据·数据库·物联网·架构·时序数据库·iot·tdengine