redis存储json格式设置

本文介绍如何在Spring Boot项目中引入Redis依赖,配置连接Redis服务器,并通过自定义CacheManager实现数据以JSON格式存储。包括配置示例、序列化方式及默认序列化机制说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)pom依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

(2)连接redis主机url

spring.redis.host=192.168.78.101

(3)定制输出格式为json格式

//注册到容器中即可
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        //初始化一个RedisCacheWriter
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
        //设置json格式序列化
        RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
        RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
                .fromSerializer(jsonSerializer);
        RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(pair);
        //初始化RedisCacheManager
        return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
    }

(4)测试
没有配置CacheManager
因为没有配置的话,默认加载jdk序列化的机制
在这里插入图片描述

配置CacheManager
在这里插入图片描述

### Spring Boot 中使用 Redis 存储 JSON 数据的教程 在 Spring Boot 项目中,可以通过 `RedisTemplate` 或 `StringRedisTemplate` 来实现 Redis 的集成,并将 JSON 数据存储Redis 中。以下是完整的示例和说明。 #### 1. 引入依赖 首先,在项目的 `pom.xml` 文件中添加以下依赖以支持 Redis 集成[^4]: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` #### 2. 配置 Redis 连接 在 `application.yml` 或 `application.properties` 文件中配置 Redis 的连接信息: ```yaml spring: redis: host: localhost port: 6379 timeout: 5000ms ``` #### 3. 使用 RedisTemplate 存储 JSON 数据 通过 `RedisTemplate` 可以直接将对象存储Redis 中。以下是一个简单的示例[^2]: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @Autowired private RedisTemplate<String, Object> redisTemplate; @PostMapping("/save") public String saveUser(@RequestBody MyUser user) { redisTemplate.opsForValue().set("user:" + user.getId(), user); return "User saved successfully!"; } @GetMapping("/get/{id}") public MyUser getUser(@PathVariable Long id) { return (MyUser) redisTemplate.opsForValue().get("user:" + id); } } ``` 在此示例中,`MyUser` 对象被直接存储Redis 中。需要注意的是,这种方式可能会导致数据结构不纯净以及跨语言兼容性问题[^3]。 #### 4. 使用 StringRedisTemplate 和手动序列化 为了优化存储效率并解决跨语言兼容性问题,可以使用 `StringRedisTemplate` 并手动进行 JSON 序列化和反序列化: ```java import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private StringRedisTemplate stringRedisTemplate; // Jackson 对象映射器 private static final ObjectMapper objectMapper = new ObjectMapper(); public void saveUser(MyUser user) throws JsonProcessingException { String key = "user:" + user.getId(); // 手动序列化对象为 JSON 字符串 String json = objectMapper.writeValueAsString(user); // 将 JSON 字符串存储Redis stringRedisTemplate.opsForValue().set(key, json); } public MyUser getUser(Long id) throws JsonProcessingException { String key = "user:" + id; String json = stringRedisTemplate.opsForValue().get(key); if (json != null) { // 手动反序列化 JSON 字符串为对象 return objectMapper.readValue(json, MyUser.class); } return null; } } ``` 此方法的优点在于可以避免存储冗余的类名信息,并且可以轻松地与其他语言交互。 #### 5. 配置日期格式 如果 JSON 数据中包含日期字段,可以在 `ObjectMapper` 中配置日期格式以确保正确序列化和反序列化[^5]: ```java objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.registerModule(new JavaTimeModule()); ``` #### 示例实体类 以下是一个简单的 `MyUser` 实体类示例: ```java public class MyUser { private Long id; private String name; private Integer age; // 构造函数、getter 和 setter 方法 public MyUser() {} public MyUser(Long id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } ``` ### 注意事项 - 在使用 `RedisTemplate` 时,默认的序列化方式可能会导致数据冗余和跨语言兼容性问题。 - 如果需要频繁访问 JSON 数据中的特定字段,可以考虑将 JSON 数据拆分为 Redis 的哈希结构[^3]。 - 使用 `StringRedisTemplate` 和手动序列化的方式可以更好地控制存储的数据格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值