Redis集成搜索功能
前言
有时候想着,你要是查询一些固定的数据,是不是能从数据库里面查询一次后,就直接可以从redis里面拿啊?下面就是例子的实现
1.添加依赖
<!-- Spring data redis 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- commons-pool2 对象池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.编写yml文件
spring:
Redis:
# 超时时间
timeout: 10000ms
# 服务器地址
host: 127.0.0.1
# 服务器端口
port: 6379
# 数据库
database: 0
#密码默认为空
password:
lettuce:
pool:
# 最大连接数,默认8
max-active: 1024
# 最大连接阻塞等待时间 ,默认-1
max-wait: 10000ms
#最大空闲连接
max-idle: 200
#最小空闲连接
min-idle: 5
3.编写配置文件
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redistemplate = new RedisTemplate<>();
// String类型 Key序列器
redistemplate.setKeySerializer(new StringRedisSerializer());
//Hash类型 Key序列器
redistemplate.setHashKeySerializer(new StringRedisSerializer());
// String类型 value序列器
redistemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// Hash类型 value序列器
redistemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redistemplate.setConnectionFactory(factory);
return redistemplate;
}
}
4.Impl层改写一下
1.以前的Impl层是这样的
@Override
public List<MedicineVo> findAllMedicineSort(MedicineSortVo medicineSortVo) {
return medicineMapper.findAllMedicineSort(medicineSortVo);
}
2.现在的impl层加了一些redis的东西
@Autowired
RedisTemplate redisTemplate;
/**
* 查询medicine表中(药品类型为***)的所有数据
* @return 查询的数据
*/
@Override
public List<MedicineVo> findAllMedicineSort(MedicineSortVo medicineSortVo) {
String medicineSort = medicineSortVo.getMedicineSort();
ValueOperations<String,Object> valueOperations= redisTemplate.opsForValue();
//从redis获取数据
List<MedicineVo> medicineVos = (List<MedicineVo>)valueOperations.get("medicinsort" + medicineSort);
//如果为空,去数据库获取
if (CollectionUtils.isEmpty(medicineVos)){
medicineVos = medicineMapper.findAllMedicineSort(medicineSortVo);
valueOperations.set("medicinsort"+medicineSort,medicineVos);
}
return medicineVos;
}
5.结果为
1.没运行前Redis里面什么都没有
2.运行之后
3.我再运行一次后,我的Mybatis Log打印SQL数据就不打印了,就证明没有从数据库里面再去查询了,而是从Redis里面查询的数据。