Redis模块-RedisJson
目录
一、RedisJson介绍
二、RedisJson模块的安装
三、RedisJson特点
1. 高性能 JSON 存储与检索
2. 灵活的 JSON 操作
3. 与 Redis 生态无缝集成
4. 适用于微服务和无服务器架构
四、RedisJson储存结构
五、RedisJSON 的典型使用场景
1. 用户会话(Session)管理
2. 实时配置管理
3. 缓存复杂 API 响应
4. 消息队列与事件存储
5. 物联网(IoT)设备状态管理
6. 实时分析(Analytics)
六、RedisJson与springboot结合
一、RedisJson介绍
RedisJSON 是 Redis 的一个模块,允许在 Redis 中直接存储、查询和操作 **JSON 文档**(类似 MongoDB 的文档存储)。它提供了高性能的 JSON 数据处理能力,适用于需要灵活数据结构的场景。
二、RedisJson模块的安装
1、需要先搭建redis,redis版本需要6.0以上。
2、在redis的安装目录下创建module文件夹。
3、将下载好的rejson.so、redisearch.so上传。(可以前往官网进行下载模块)
4、修改redis的config配置文件
修改 文件 为可执行权限
chmod +x rejson.so
chmod +x redisearch.so修改 redis.conf,搜索 loadmodule
loadmodule /data/redis/module/rejson.so
loadmodule /data/redis/module/redisearch.so
5、重启redis
在redis目录下执行
./bin/redis-server conf/redis.conf
三、RedisJson特点
1. 高性能 JSON 存储与检索
-
内存存储:Redis 基于内存,读写速度极快(微秒级响应)。
-
原生 JSON 支持:无需序列化/反序列化,直接存储和查询 JSON。
2. 灵活的 JSON 操作
-
支持 JSONPath:可以使用类似 XPath 的语法查询 JSON 字段(如
$.user.name
)。 -
原子性操作:支持对 JSON 字段的增删改查(如
JSON.SET
、JSON.GET
、JSON.DEL
)。
3. 与 Redis 生态无缝集成
-
兼容 Redis 数据结构:可与 String、Hash、List 等混合使用。
-
支持 TTL(过期时间):可以为 JSON 数据设置自动过期。
4. 适用于微服务和无服务器架构
-
低延迟:适合 API 网关、用户会话管理等高频访问场景。
-
无 Schema 约束:适合动态数据结构(如 NoSQL 场景)
四、RedisJson储存结构
RedisJSON 使用 二进制树结构 存储 JSON 数据:
-
将 JSON 解析为树形结构
-
每个节点存储原始 JSON 中的对应元素
-
使用类似 JSONPath 的路径快速定位节点
五、RedisJSON 的典型使用场景
1. 用户会话(Session)管理
-
存储用户信息:如登录状态、权限、个性化配置(JSON 格式)。
2. 实时配置管理
-
动态应用配置:如功能开关、A/B 测试参数。
3. 缓存复杂 API 响应
-
缓存 GraphQL/REST API 结果:避免重复计算,加速响应。
4. 消息队列与事件存储
-
存储结构化事件数据:如用户行为日志、审计记录。
5. 物联网(IoT)设备状态管理
-
存储传感器数据:如设备状态、历史记录(JSON 数组)。
6. 实时分析(Analytics)
-
存储和聚合 JSON 格式的指标:如用户行为分析。
六、RedisJson与springboot结合
1、引入redis、redisJson 相关pom依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.3.7.RELEASE</version></dependency><dependency><groupId>com.redislabs</groupId><artifactId>jrejson</artifactId><version>1.5.0</version></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version></dependency>
2、设置redis、JReJSON的配置类
package cn.konne.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.redislabs.modules.rejson.JReJSON;
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.Jedis;@Configuration
@EnableCaching
public class ReidsConfig {@Bean@SuppressWarnings(value = { "unchecked", "rawtypes", "deprecation" })public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);Redis2JsonSerializer serializer = new Redis2JsonSerializer(Object.class);ObjectMapper mapper = new ObjectMapper();mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);serializer.setObjectMapper(mapper);template.setValueSerializer(serializer);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.afterPropertiesSet();return template;}@Beanpublic Jedis jedis() {Jedis jedis = new Jedis("********服务器ip", 6379);jedis.auth("********密码"); // 认证密码return jedis;}@Beanpublic JReJSON jReJSON(Jedis jedis) {return new JReJSON(jedis);}}
3、RedisJson操作工具类
package cn.konne.service;import com.redislabs.modules.rejson.JReJSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.redislabs.modules.rejson.Path;import java.util.Collection;/**
* @author MJ
* @date 2025/8/5
*/
@Service
public class RedisJsonService {@Autowiredprivate JReJSON jReJSON;/*** 保存整个JSON对象*/public void set(String key, Object object) {jReJSON.set(key, object);}/*** 获取整个JSON对象*/public <T> T get(String key, Class<T> type) {return jReJSON.get(key, type);}/*** 获取JSON对象的特定字段*/public <T> T get(String key, Class<T> type, String path) {return jReJSON.get(key, type, new Path(path));}/*** 设置JSON对象的特定字段*/public void set(String key, String path, Object value) {jReJSON.set(key, value, new Path(path));}/*** 删除JSON对象的特定字段*/public void del(String key, String path) {jReJSON.del(key, new Path(path));}/*** 检查key是否存在*/public boolean exists(String key) {return jReJSON.get(key) != null;}/*** 删除整个key*/public void delete(String key) {jReJSON.del(key);}/*** 向JSON数组追加元素* @param key Redis键* @param path 数组路径* @param elements 要追加的元素* @return 追加后的数组长度*/public Long arrAppend(String key, String path, Object... elements) {return jReJSON.arrAppend(key, Path.of(path), elements);}/*** 获取JSON数组长度* @param key Redis键* @param path 数组路径* @return 数组长度*/public Long arrLen(String key, String path) {return jReJSON.arrLen(key, Path.of(path));}/*** 获取数组指定索引的元素* @param key Redis键* @param path 数组路径(包含索引)* @param clazz 返回类型* @return 数组元素*/public <T> T arrGet(String key, String path, Class<T> clazz) {return jReJSON.get(key, clazz, Path.of(path));}/*** 在数组指定位置插入元素* @param key Redis键* @param path 数组路径* @param index 插入位置(0为第一个,负数表示从末尾计算)* @param element 要插入的元素* @return 插入后的数组长度*/public Long arrInsert(String key, String path, int index, Object element) {return jReJSON.arrInsert(key, Path.of(path), (long) index, element);}/*** 批量追加元素到数组* @param key Redis键* @param path 数组路径* @param elements 要追加的元素集合* @return 追加后的数组长度*/public Long arrAppendAll(String key, String path, Collection<?> elements) {return jReJSON.arrAppend(key, Path.of(path), elements.toArray());}
}
4、RedisJson测试
package cn.konne.init;import cn.konne.domain.Address;
import cn.konne.domain.User;
import cn.konne.service.RedisJsonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;/*** @author MJ* @date 2025/8/5*/
@Component
public class RedisJson {@AutowiredRedisJsonService redisJsonService;@PostConstructpublic void redisJson(){// 创建地址Address address = new Address("123 Main St", "New York", "USA");// 创建用户List<String> strings = new ArrayList<>();strings.add("唱");strings.add("跳");strings.add("rap");User user = new User("1", "john_doe", "john@example.com", 30,strings, address);// 保存整个用户对象redisJsonService.set("user:1", user);// 获取整个用户对象User retrievedUser = redisJsonService.get("user:1", User.class);System.out.println("Retrieved User: " + retrievedUser);// 获取特定字段String email = redisJsonService.get("user:1", String.class, ".email");System.out.println("修改前的 Email: " + email);// 更新特定字段redisJsonService.set("user:1", ".email", "new_email@example.com");// 获取更新后的字段String updatedEmail = redisJsonService.get("user:1", String.class, ".email");System.out.println("修改后的 Email: " + updatedEmail);//向JSON数组追加元素Long l = redisJsonService.arrAppend("user:1", ".hobbies", "吃", "玩");System.out.println("新数组 长度为:"+l);//获取数组指定索引的元素String firstTag = redisJsonService.arrGet("user:1", ".hobbies[0]", String.class);System.out.println("数组第一个索引的值为:"+firstTag);// 删除用户redisJsonService.delete("user:1");// 检查用户是否存在boolean exists = redisJsonService.exists("user:1");System.out.println("User exists: " + exists);}
}
5、其他相关代码
package cn.konne.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author MJ* @date 2025/8/5*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {private String city;private String street;private String zipCode;
}
package cn.konne.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;/*** @author MJ* @date 2025/8/5*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private String id;private String name;private String email;private Integer age;private List<String> hobbies;private Address address;
}
至此,RedisJson的简单使用已经完成,后续会对RedisJson进行高级使用以及难点分析。