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

相关推荐
代码调试师5 分钟前
【毕设分享】基于SpringBoot的旅游向导分配管理系统57145
spring boot·毕业设计·源码·课程设计·毕设·大作业·程序定制
2301_322414280426 分钟前
活力孕康复APP 47737- 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·mysql·微信小程序·idea·微信开发者工具
君顾130 分钟前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
vx_Biye_Design1 小时前
springboot游泳馆系统93765-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·spring·课程设计
名字还没想好☜1 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之短信服务多供应商动态切换(阿里云与LeanCloud)
java·spring·阿里云
Doubbbbbbble云2 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
小溪学编程2 小时前
AQS 原理详解:从 CLH 队列到 ReentrantLock 的实现
java·开发语言
专业程序开发源2 小时前
springbootLivehouse票务系统-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·课程设计·pygame
蜗牛互联网2 小时前
语音AI开始边听边说,改变的不只是响应速度
java·人工智能·后端·语音识别