java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot整合RedisStack

Springboot整合RedisStack的实现示例

作者:Listen·Rain

本文介绍了SpringBoot整合RedisStack的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1.pom依赖

<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

spring.application.name=demo-redisstack
server.port: 8088
spring.data.redis.host: localhost
spring.data.redis.port: 6379

3.RedisStackService

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

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

到此这篇关于Springboot整合RedisStack的实现示例的文章就介绍到这了,更多相关Springboot整合RedisStack内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文