1.什么是Redis
Redis是一款开源的内存Key-Value存储,支持多种数据结构,官方网站为 https://redis.io
2.Spring对Redis的支持
-
Spring Data Redis
- 支持的客户端 Jedis / Lettuce
- RedisTemplate
- Repository支持
-
安装redis
利用docker获取镜像
docker pull redis
启动 redis
docker run --name redis -d -p 6379:6379 redis
检查redis状态
docker ps
3.简单使用
配置依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
application.yml配置
redis:
host: localhost
maxTotal: 5
maxIdle: 5
testOnBorrow: true
applicaiton启动类
@Slf4j
@SpringBootApplication
public class SpringBucksApplication implements ApplicationRunner {
@Autowired
private JedisPool jedisPool; //自动注入JedisPool实例
@Autowired
private JedisPoolConfig jedisPoolConfig; //自动注入JedisPoolConfig实例
public static void main(String[] args) {
SpringApplication.run(SpringBucksApplication.class, args);
}
@Bean
@ConfigurationProperties(prefix = "redis") //读取redis配置
public JedisPoolConfig jedisPoolConfig() {
return new JedisPoolConfig();
}
@Bean(destroyMethod = "close") //JedisPool关闭时调用close方法
public JedisPool jedisPool(@Value("${redis.host}") String host) {
return new JedisPool(jedisPoolConfig(), host);
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info(jedisPoolConfig.toString()); //打印配置信息
try (Jedis jedis = jedisPool.getResource()) { //利用try(Resource r)在{}方法块运行结束时会将jedis自动关闭
//利用jedis插入哈希表数据
jedis.hset("spring-menu",
"benz",
"50w");
jedis.hset("spring-menu",
"audi",
"70w");
//取出spring-menu中所有数据并打印
Map<String, String> menu = jedis.hgetAll("spring-menu");
log.info("Menu:{} ", menu);
String price = jedis.hget("spring-menu", "audi");
log.info("audi - {}", price);
}
}
}
实际上在启动类中只需借助注解与构造方法,先配置JedisPoolConfig,再配置JedisPool即可使用Jedis,前提是配置好redis的host。
运行结果
4.使用Redis缓存
本节通过Spring的缓存抽象来使用Redis进行缓存,所使用的POJO与数据库同上篇Mongo笔记一致。
配置依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.properties
spring.cache.type=redis
spring.cache.cache-names=coffee
spring.cache.redis.time-to-live=5000
spring.cache.redis.cache-null-values=false
spring.redis.host=localhost
Service配置
@Slf4j
@Service
@CacheConfig(cacheNames = "car")
public class CarService {
@Autowired
private CarMapper carMapper;
@Cacheable
public List<Car> findAllCar(){
return carMapper.getAll();
}
@CacheEvict
public void reloadCar(){
}
}
@CacheConfig(cacheNames = "car")
指定了缓存的名字,@Cacheable
代表将未在缓存中的方法结果执行后存入缓存,如果方法结果已在缓存中则直接从缓存中取。@CacheEvict
用于缓存的清理。
application启动类
@Slf4j
@EnableCaching(proxyTargetClass = true)
@SpringBootApplication
@MapperScan("com.xeathen.cachedemo.mapper")
public class CacheDemoApplication implements ApplicationRunner {
@Autowired
private CarService carService;
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("Count: {}", carService.findAllCar().size());
for (int i = 0; i < 10; i++) {
log.info("Reading from cache.");
carService.findAllCar();
}
Thread.sleep(5000);
log.info("Reading after refresh.");
carService.findAllCar().forEach(c -> log.info("Car {}", c.getName()));
}
}
@EnableCaching
当然是用来开启Spring的缓存支持,在 run
方法中持续执行 CarService
的 findAllCar()
方法,我在配置文件中开启了Mybatis的Sql输出,可以观察到查询结果是由Sql执行获得的还是直接从缓存中取得的。 Thread.sleep(5000);
线程睡眠时间设置为5秒钟是因为我在配置文件中设定了缓存的存活时间是5秒。
5.运行结果
- 第一次执行Sql
- 从缓存中获取结果
- 第二次执行Sql
- 打印结果
6.小结
本篇介绍了Redis在Spring中的简单整合和借助Spring的缓存抽象使用Redis进行缓存,下篇中将补充Redis在Spring中的其他用法。