Springboot整合RedisStack
1.pom依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.28.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.application.properties
xml
spring.application.name=demo-redisstack
server.port: 8088
spring.data.redis.host: localhost
spring.data.redis.port: 6379
3.RedisStackService
java
package com.example.demoredisstack.service;
import com.example.demoredisstack.entity.User;
import jakarta.annotation.PostConstruct;
import org.redisson.api.RJsonBucket;
import org.redisson.api.RedissonClient;
import org.redisson.api.options.JsonBucketOptions;
import org.redisson.api.search.index.FieldIndex;
import org.redisson.api.search.index.IndexOptions;
import org.redisson.api.search.index.IndexType;
import org.redisson.api.search.query.QueryOptions;
import org.redisson.api.search.query.SearchResult;
import org.redisson.client.codec.StringCodec;
import org.redisson.codec.JacksonCodec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RedisStackService {
@Autowired
private RedissonClient redissonClient;
private static final String INDEX_NAME = "idx:users";
private static final String KEY_PREFIX = "user:";
// 项目启动时自动创建索引
@PostConstruct
public void initIndex() {
try {
redissonClient.getSearch().createIndex(INDEX_NAME,
IndexOptions.defaults()
.on(IndexType.JSON)
.prefix(KEY_PREFIX),
FieldIndex.text("$.name").as("name"),
FieldIndex.numeric("$.age").as("age"),
FieldIndex.tag("$.tags").as("tags")
);
} catch (Exception e) {
System.out.println("索引可能已存在或创建失败: " + e.getMessage());
}
}
// 1. 保存 JSON 数据
public void saveUser(User user) {
JsonBucketOptions<Object> codec = JsonBucketOptions
.name(KEY_PREFIX + user.getId()).codec(new JacksonCodec<>(Object.class));
RJsonBucket<Object> jsonBucket = redissonClient.getJsonBucket(codec);
jsonBucket.set(user);
}
// 2. 获取 JSON 数据
public Object getUser(String id) {
JsonBucketOptions<Object> codec = JsonBucketOptions
.name(KEY_PREFIX + id).codec(new JacksonCodec<>(Object.class));
RJsonBucket<Object> bucket = redissonClient.getJsonBucket(codec);
return bucket.get();
}
// 3. 执行搜索 (例如:搜索名字包含 keyword 且年龄大于 minAge 的用户)
public SearchResult searchUsers(String keyword, int minAge) {
// 构建查询语句:名字模糊匹配 AND 年龄范围查询
// @name:keyword 表示全文检索包含 keyword
// @age:[minAge +inf] 表示 age >= minAge
String query = String.format("@name:%s @age:[%d +inf]", keyword, minAge);
return redissonClient.getSearch(StringCodec.INSTANCE).search(INDEX_NAME, query, QueryOptions.defaults());
}
}
4.TestController
java
package com.example.demoredisstack.controller;
import com.example.demoredisstack.entity.User;
import com.example.demoredisstack.service.RedisStackService;
import org.redisson.api.search.query.SearchResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private RedisStackService redisStackService;
// 测试存入数据
@GetMapping("/save")
public String save() {
User user = new User();
user.setId("1001");
user.setName("Alice Developer");
user.setAge(30);
user.setTags(List.of("developer", "docker"));
redisStackService.saveUser(user);
return "User Saved";
}
// 测试获取数据
@GetMapping("/get/{id}")
public Object get(@PathVariable String id) {
return redisStackService.getUser(id);
}
// 测试搜索功能
@GetMapping("/search")
public SearchResult search(@RequestParam String name, @RequestParam(defaultValue = "0") int minAge) {
return redisStackService.searchUsers(name, minAge);
}
}
5.测试结果
1.存入数据

2.获取数据

3.搜索功能
