目录结构
$ tree
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ ├── Application.java
│ │ ├── config
│ │ │ └── RedisConfig.java
│ │ ├── controller
│ │ │ └── UserController.java
│ │ ├── service
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ └── UserServiceImpl.java
│ │ └── utils
│ │ └── RedisUtils.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
├── http
│ └── api.http
└── java
└── com
└── example
└── demo
└── ApplicationTests.java
redis依赖
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
完整pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置文件 application.properties
# 连接的那个数据库
spring.redis.database=0
# redis服务的ip地址
spring.redis.host=127.0.0.1
# redis端口号
spring.redis.port=6379
# redis的密码,没设置过密码,可为空
spring.redis.password=
# 时间格式化
# https://www.jianshu.com/p/044e2155870a
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
配置 RedisConfig.java
package com.example.demo.config;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置类
*/
@Configuration
public class RedisConfig {
@Bean // redisTemplate注入到Spring容器
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// 序列化配置
RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();
RedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// key序列化
redisTemplate.setKeySerializer(stringRedisSerializer);
// value序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
工具类 RedisUtils.java
package com.example.demo.utils;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* Redis工具类
* 参考 https://blog.csdn.net/qq_49067108/article/details/119826547
*/
@Service
public class RedisUtils {
@Autowired
private RedisTemplate redisTemplate;
// key前缀,区分不同应用
public static final String Prefix = "spring-boot-redis";
/**
* 获取key
*
* @param key
* @return
*/
private String getKey(String key) {
return Prefix + ":" + key;
}
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public void set(final String key, Object value) {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set(this.getKey(key), JSON.toJSONString(value));
}
/**
* 写入缓存设置时效时间
*
* @param key
* @param value
* @return
*/
public void set(final String key, Object value, Long expireTime) {
ValueOperations<String, Object> operations = redisTemplate.opsForValue();
operations.set(this.getKey(key), JSON.toJSONString(value), expireTime, TimeUnit.SECONDS);
}
/**
* 批量删除对应的value
*
* @param key
*/
public void delete(final String key) {
redisTemplate.delete(this.getKey(key));
}
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public boolean hasKey(final String key) {
return redisTemplate.hasKey(this.getKey(key));
}
/**
* 读取缓存
*
* @param key
* @return
*/
public <T> T get(final String key, Class<T> clazz) {
ValueOperations<String, String> operations = redisTemplate.opsForValue();
String value = operations.get(this.getKey(key));
return JSON.parseObject(value, clazz);
}
}
启动类 Application.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
接口类 UserService.java
package com.example.demo.service;
import com.example.demo.entity.User;
public interface UserService {
public User getUser();
}
实现类 UserServiceImpl.java
package com.example.demo.service.impl;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public User getUser() {
log.info("DataServiceImpl getUser");
// 模拟耗时操作
try {
Thread.sleep(1000 * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
User user = new User();
user.setName("Tom");
user.setAge(20);
user.setBirthday(new Date());
return user;
}
}
控制器 RedisController.java
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import com.example.demo.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class UserController {
@Autowired
private RedisUtils redisUtils;
@Autowired
private UserService userService;
@GetMapping("/getUser")
public User getUser() {
String key = "data";
User user = redisUtils.get(key, User.class);
log.info("RedisController getUser: {}", user);
if (user == null) {
// 数据不存在,获取数据
user = userService.getUser();
redisUtils.set(key, user);
}
return user;
}
}
请求接口测试
GET http://localhost:8080/getUser
Accept: application/json