当前位置: 首页 > news >正文

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.SETJSON.GETJSON.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进行高级使用以及难点分析。

http://www.dtcms.com/a/319960.html

相关文章:

  • Q-Learning详解:从理论到实践的全面解析
  • 数据合规——解读跨境电商隐私合规白皮书(2024)【附全文阅读】
  • React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context
  • AR技术:制造业质量控制的“智能革新”
  • 第五十三篇:LLaMA.cpp的“量化秘籍”:Q4_K_M、Q5_K_S深度解析
  • Numpy科学计算与数据分析:Numpy数组索引与切片入门
  • Linux学习记录 DNS
  • “认知裂缝边缘”地带
  • 河南萌新联赛2025第(四)场:河南大学
  • Taro 扩展 API 深度解析与实战指南
  • 考研复习-计算机组成原理-第三章-存储系统
  • 广州工艺品摆件三维扫描逆向建模抄数设计-中科米堆CASAIM
  • [三数之和]
  • [安卓按键精灵开发工具]本地数据库的初步学习
  • Day116 若依融合mqtt
  • Minio 分布式集群安装配置
  • 28 HTB Forest 机器 - 容易 (1)
  • (附源码)基于Web的物流信息管理系统
  • 解锁webpack核心技能(二):配置文件和devtool配置指南
  • 机器学习在量化中的应用:如何从逻辑回归到XGBoost实现高效预测?
  • 将Excel数据导入SQL Server数据库,并更新源表数据
  • 河南萌新联赛2025第(四)场:河南大学(补题)
  • 北京JAVA基础面试30天打卡04
  • 一文入门 matplotlib:从基础图表到数据可视化初体验
  • git branch -a无法查看最新的分支
  • CNB私有化部署Dify(零成本)教程
  • 操作系统1.4:操作系统的体系结构
  • ollama 运行gpt-oss 系列教程
  • Numpy科学计算与数据分析:Numpy数组创建与应用入门
  • DevOps简单教程应用