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;
 }
}
相关推荐
JL1511 分钟前
如何用 MySQL 持久化、历史快照与游标实现多步 Redo/Undo
前端·数据库·mysql
SL-staff12 分钟前
APS排产规则底座实践:如何用生产全局配置统一自动拆分、成批基数与齐套策略
大数据·数据库·人工智能·智能制造·aps·mes·排产规则
Wang's Blog18 分钟前
PostgreSQL笔记64:分区插件生态与扩展查询协议深度解析
数据库·笔记·postgresql
小蒜学长21 分钟前
基于Django的社区团购购物平台的设计与实现(代码+数据库+LW)
数据库·后端·python·django
刘婉晴27 分钟前
【AI提效】利用 qwenwork 智能体平台(免费)实现 webgoat 靶场 SQL 注入速通
数据库·sql
__zRainy__36 分钟前
Node系列 · 数据库:MySQL 安装
数据库·后端·mysql·node.js
T011561844 分钟前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
sibylyue1 小时前
MariaDB / H2
数据库·mariadb
zone_z1 小时前
07 · 等待事件与 OWI 方法:从 OSW 到 BUG 的完整破案实录
linux·数据库·oracle·ffmpeg·bug·troubleshooting
A.说学逗唱的Coke1 小时前
【数据库专题】ClickHouse 深度实战:从列式存储原理到 PB 级海量日志与可观测性分析
数据库·clickhouse·硬件架构