Springboot整合RedisStack

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.搜索功能

相关推荐
Buke..1 分钟前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
风流 少年20 分钟前
Spring AI 2.0:阿里云百炼平台(智能体应用)
redis·spring·阿里云
半生过往28 分钟前
前端学 Java 课程笔记
java·前端·笔记
肠畔码农30 分钟前
深度解密 Redis 分布式锁:从单机原子语义到集群架构博弈
redis·分布式·架构
mmsx1 小时前
基于 Android 的校园信息管理系统源码
android·java·okhttp
Buke..1 小时前
【APP 逆向】哔哩哔哩 sign 参数逆向(上):Frida 反调试绕过与 unidbg 调用
java·开发语言·爬虫·python·安卓
竹枝溪1 小时前
Tomcat与Servlet全套小白教程
java·servlet·tomcat·cookie·filter·session·listener
UseLessQQ2 小时前
云计算k8s集群部署
java·kubernetes·云计算
我命由我123452 小时前
人脸识别 - 人脸识别选帧
java·人工智能·python·算法·安全·java-ee·人脸识别
宠友信息2 小时前
IM系统开发技术路线分析,即时通讯源码助力快速搭建聊天应用
java·spring boot·redis·websocket·mysql·uni-app·vue