在项目中发现从数据库中直接查找数据非常慢,所以想到了使用redis来加速
1. 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
在yml配置中,设置redis地址
spring:redis:host: localhostport: 6379password: xxxxxdatabase: 1lettuce:pool:# 连接池中最大空闲连接max-idle: 8# 连接池中最大阻塞等待时间(如果为负值则说明无限制)max-wait: -1# 连接池中最大的空闲连接数max-active: 8
2. 设置redis序列化器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;/*** 当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,* 但是默认的key序列化器为JdkSerializationRedisSerializer,* 导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器。*/
@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<String ,String> redisTemplate = new RedisTemplate<>();//这里可以根据自己的需要修改,我因为键和值都是字符串类型的所以设置成了<String,String>redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setKeySerializer(RedisSerializer.string());//这里也需要修改return redisTemplate;}
}
3. 项目中使用
@Service
public class InspectionStationInfoServiceImpl extends ServiceImpl<InspectionStationInfoMapper, InspectionStationInfo>implements IInspectionStationInfoService {@Autowiredprivate RedisTemplate redisTemplate;/*** 根据单位id,查询对应机构的首检合格率* @param unitId 单位id* @return 首检合格率*/private String firstInspectionPassRate(String unitId){ValueOperations<String ,String> operations = redisTemplate.opsForValue();String key = String.format("SZJDC:CHECKRESULT:BGBH:%s",unitId);//在redis中获取 首检合格率String rate = operations.get(key);return rate;}}
4. 设置定时任务来将数据存储进redis,规定每天凌晨1点更新
@Component
@Slf4j
public class FirstInspectionPassRateTask {@Autowiredprivate CheckResultMapper checkResultMapper;@Autowiredprivate InspectionStationInfoMapper inspectionStationInfoMapper;@Autowiredprivate RedisTemplate redisTemplate;//每天凌晨一点@Scheduled(cron = "0 0 1 * * ?")public void calculateFirstInspectionPassRate(){log.info("####### 定时任务开启......");//单位id 集合List<String> unitIdList = inspectionStationInfoMapper.selectUnitId();unitIdList = Optional.ofNullable(unitIdList).orElse(new ArrayList<>());ValueOperations<String ,String> operations = redisTemplate.opsForValue();unitIdList.forEach(unitId -> {//根据单位id,查询对应机构的首检合格率String rate = checkResultMapper.firstInspectionPassRate(unitId);String key = String.format("SZJDC:CHECKRESULT:BGBH:%s",unitId);operations.set(key,rate);});}}
后面如果有改变就继续写