Java的JSON操作存储List到Redis

Java操作JSON存储List到Redis实战
这篇博客介绍了如何在Java中使用Jackson和json-lib库将List对象转换为JSON格式,并存储到Redis缓存系统中。同时,文章提供了两种不同的读取缓存的方法,详细阐述了实现过程。

使用jackson和json-lib都可以

<dependency> 
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>

<dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency> 

写缓存

JSONArray jsonarray = JSONArray.fromObject(result);
            String js = jsonarray.toString();
            JedisUtil.setString(key, js);


读缓存方法一:

String value=JedisUtil.getString(key);
        if (value != null) {
            ObjectMapper mapper = new ObjectMa
<think>我们正在讨论使用RedisTemplate将Java List保存到Redis中的方法。根据引用[1],我们知道RedisTemplate可以操作多种数据类型,包括List。引用[3]展示了一个使用stringRedisTemplate存储List的例子,它先将List转换为JSON字符串,然后存储为字符串类型。但我们要注意,Redis本身支持List数据结构,所以我们可以直接使用RedisTemplate的列表操作。 使用RedisTemplate保存List有两种常见方式: 1. 使用列表操作(如leftPushAll, rightPushAll)直接存储Redis列表。 2. 将整个List序列化为JSON字符串存储(如引用[3]的方式),但这样存储后就不是Redis的列表结构了,而是字符串。 这里我们主要讨论第一种方式,即保存为Redis的列表。 步骤: 1. 配置RedisTemplate,确保其支持List操作。 2. 获取List操作接口:redisTemplate.opsForList() 3. 使用rightPushAll或leftPushAll方法将整个List存入Redis。 示例代码: 首先,确保已经配置了RedisTemplate。在Spring Boot中,我们可以通过配置类来配置: ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 设置key的序列化器 template.setKeySerializer(new StringRedisSerializer()); // 设置value的序列化器,这里使用Jackson2JsonRedisSerializer template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } } ``` 然后,在需要保存List的地方: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveListToRedis(String key, List<Object> list) { // 使用rightPushAll将整个List添加到Redis列表中(从右侧添加) redisTemplate.opsForList().rightPushAll(key, list); } ``` 注意:这里使用的是rightPushAll,所以元素的顺序和List中的顺序一致。如果使用leftPushAll,则顺序是相反的。 读取Redis中的List: ```java public List<Object> getListFromRedis(String key, long start, long end) { // 获取整个列表,start=0, end=-1表示全部 return redisTemplate.opsForList().range(key, start, end); } ``` 关于序列化:上面的配置中,我们使用了GenericJackson2JsonRedisSerializer来序列化值,这样存储Redis中的对象会是JSON格式,并且带有类型信息,以便反序列化时能正确还原。 引用[3]中使用了stringRedisTemplate,它要求键和值都是字符串。所以它通过JSON.toJSONString将List转为字符串后存储。这种方式存储后,我们无法使用Redis的列表操作(如LPUSH, RPOP等)来操作这个键,因为它是一个字符串而不是列表。所以,如果我们需要使用Redis的列表命令,应该使用opsForList()。 总结: - 如果需要使用Redis的列表特性(如两端插入删除,按索引访问等),则使用opsForList()。 - 如果只需要整体存取,不考虑中间操作,可以选择序列化为字符串存储(使用opsForValue())。 根据用户的需求,他想了解的是使用redisTemplate保存ListRedis的方法,我们给出了两种方式,并重点介绍了使用列表操作的方式。 注意:在存储大量数据时,直接使用rightPushAll可能会因为数据量过大而导致阻塞。对于大数据量的List,可以考虑分批次插入,或者使用管道(pipeline)来提升性能。 相关问题: 1. 使用RedisTemplate保存List时,如何选择序列化方式? 2. 如何使用管道(pipeline)优化大量List数据存储? 3. 从Redis中读取List时,如何避免一次性读取大列表导致的内存问题? 4. 使用stringRedisTemplate保存List与使用RedisTemplate的opsForList有什么区别? 5. 如何确保保存到RedisList数据在多线程环境下的安全? </think>### Java中使用redisTemplate保存ListRedis的方法 在Spring应用中可通过`RedisTemplate`高效地将Java List存储Redis中,以下是具体实现步骤和示例: --- #### 1. **依赖配置** 确保项目中包含Spring Data Redis依赖(Maven配置): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` --- #### 2. **直接存储Redis List类型** 使用`opsForList()`方法直接存储原生Redis列表结构,保留元素顺序和重复值: ```java @Autowired private RedisTemplate<String, Object> redisTemplate; // 存储List public void saveList(String key, List<Object> list) { redisTemplate.opsForList().rightPushAll(key, list); // 按顺序插入 } // 示例调用 List<String> dataList = Arrays.asList("A", "B", "C"); saveList("myListKey", dataList); ``` **特点**: - 数据Redis原生List类型存储 - 支持列表操作(如`LPOP`/`RPUSH`) - 可通过`range(key, 0, -1)`获取全部元素[^1] --- #### 3. **序列化为JSON字符串存储** 使用JSON序列化整个List后存入String类型(适合整体读写): ```java @Autowired private StringRedisTemplate stringRedisTemplate; public void saveListAsJson(String key, List<?> list) { String json = JSON.toJSONString(list); // 使用Fastjson等工具 stringRedisTemplate.opsForValue().set(key, json); } // 示例调用 List<Integer> idList = Arrays.asList(101, 102, 103); saveListAsJson("idListKey", idList); ``` **特点**: - 数据以字符串形式存储 - 需反序列化获取对象(`JSON.parseArray()`) - 适用于整体存取场景[^3] --- #### 4. **数据类型转换注意事项 | Java类型 | Redis存储方式 | 读取方法 | |-------------------|---------------------|--------------------------| | `List<String>` | 原生List | `opsForList().range()` | | 复杂对象List | JSON字符串 | `JSON.parseArray()` | | `List<Integer>` | 需序列化配置 | 配合`ValueSerializer` | > **关键配置**:在`RedisTemplate`中配置序列化器避免类型错误: ```java @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } ``` --- #### 5. **数据读取示例 ```java // 读取原生List List<Object> redisList = redisTemplate.opsForList().range("myListKey", 0, -1); // 读取JSON字符串 String json = stringRedisTemplate.opsForValue().get("idListKey"); List<Integer> idList = JSON.parseArray(json, Integer.class); ``` > **性能提示**:大数据List建议分页读取,避免阻塞: ```java // 分页读取(每次100条) int pageSize = 100; long cursor = 0; do { List<Object> page = redisTemplate.opsForList().range("largeList", cursor, cursor + pageSize - 1); cursor += pageSize; // 处理分页数据 } while (page.size() == pageSize); ``` 通过上述方法,可灵活选择适合业务场景的List存储方式[^1][^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值