Redis 实验
实验目标
熟悉通过 Java 代码来控制 Redis 的流程
需求描述
请提供一个后端接口,用于实现 JSON 对象的 CRUD,该 JSON 对象存在生命周期,一旦过期则直接抛弃(视作不存在该对象)
实验知识点
- 控制 Redis 进行对象的增删改查
- 设置 Redis 的过期策略
实验实现
项目结构
- config
- RedisConfig
- controller
- RedisController
- entity
- Product
- Application
对象设计
- Product
- id
- name
- desc
注意事项:必须实现自 Serializable 接口,否则即使配置 Redis 的序列化工具,也无法实现序列化。
@Data
public class Product implements Serializable {
private long id;
private String name;
private String desc;
}
Redis 配置
通过 @Configuration 配置
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Product> redisTemplate(@Qualifier("jedisConnectionFactory") JedisConnectionFactory jedisConnectionFactory) {
// 声明 RedisTemplate
RedisTemplate<String, Product> redisTemplate = new RedisTemplate<>();
// 设置 ConnectionFactory
redisTemplate.setConnectionFactory(jedisConnectionFactory);
// 设置 Key 的序列化工具
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 Value 的序列化工具
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
@Primary
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName("localhost");
jedisConnectionFactory.setPort(6379);
return jedisConnectionFactory;
}
}
通过 @Component 配置
从 application.yaml 读取配置 By @Value
@Component
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
return redisTemplate;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisHost, redisPort);
return new JedisConnectionFactory(configuration);
}
}
接口设计
-
RedisController
-
add
-
delete
-
update
-
selectById
-
selectAll
-
@RestController
@RequestMapping("/")
public class RedisController {
@Autowired
private RedisTemplate<String, Product> redisTemplate;
@PostMapping("/add")
ResponseEntity<Product> addProduct(@RequestBody Product product) {
System.out.println("addProduct");
redisTemplate.opsForValue().set("product:" + product.getId(), product, Duration.ofSeconds(30));
redisTemplate.expire("product:" + product.getId(), Duration.ofSeconds(10));
// return new ResponseEntity<>(product, HttpStatus.OK); // 复杂的等效写法
return ResponseEntity.ok(product);
}
@PostMapping("/update")
public ResponseEntity<Product> updateProduct(@RequestBody Product product) {
System.out.println("updateProduct");
String key = "product:" + product.getId();
if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
redisTemplate.opsForValue().set(key, product);
return ResponseEntity.ok(product);
} else {
return ResponseEntity.notFound().build();
}
}
@PostMapping("/delete")
public ResponseEntity<String> deleteProduct(@RequestParam Long id) {
System.out.println("deleteProduct");
String key = "product:" + id;
if (Boolean.TRUE.equals(redisTemplate.delete(key))) {
return ResponseEntity.ok("Product with ID: " + id + " deleted successfully");
} else {
return ResponseEntity.notFound().build();
}
}
@GetMapping("/selectById")
public ResponseEntity<Product> selectProductById(@RequestParam Long id) {
System.out.println("selectProductById");
String key = "product:" + id;
Product product = redisTemplate.opsForValue().get(key);
if (product != null) {
return ResponseEntity.ok(product);
} else {
return ResponseEntity.notFound().build();
}
}
@GetMapping("/selectAll")
public ResponseEntity<List<Product>> selectAllProducts() {
System.out.println("selectAllProducts");
Set<String> keys = redisTemplate.keys("product:*");
List<Product> products = new ArrayList<>();
for (String key : keys) {
Product product = redisTemplate.opsForValue().get(key);
products.add(product);
}
return ResponseEntity.ok(products);
}
}
测试流程
- selectAll
- add
- selectAll
- selectById
- update
- selectAll
- selectById
- delete
- selectAll
- selectById
测试数据
{
"id": 1,
"name": "Sample Product",
"desc": "This is a sample product description"
}
{
"id": 2,
"name": "Sample Product",
"desc": "This is a sample product description"
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏