redis序列化与反序列化

一、存储和取回字符串类型 (String)

推荐存储方式:
  • 存储: redisService.set(finalKey, value)
  • 取回: redisService.get(finalKey)

对于字符串类型数据,Redis 本身就能直接存储,无需任何额外的序列化/反序列化步骤。

二、存储和取回 List<T> 类型(泛型 List)

推荐存储方式:
  • 存储:List 序列化为 JSON 字符串后,使用 redisService.set(finalKey, json) 存储。
  • 取回: 从 Redis 中获取 JSON 字符串后,反序列化为 List<T> 对象,使用 redisService.get(finalKey) 获取字符串,然后用 JSON.parseArrayJackson 等工具反序列化。
示例:
// 存储 List
List<String> list = Arrays.asList("item1", "item2", "item3");
String json = JSON.toJSONString(list);  // 使用 FastJSON 序列化为 JSON 字符串
redisService.set(finalKey, json);

// 取回 List
String jsonString = redisService.get(finalKey);
List<String> listFromRedis = JSON.parseArray(jsonString, String.class);

三、存储和取回 Page<T> 类型(分页对象)

Page 对象通常是由框架(如 Spring Data)生成的,它包含了分页信息(如页码、总数等),以及当前页的数据。你可以像 List<T> 一样处理它,将 Page 序列化为 JSON 字符串存储,取回时再反序列化为 Page<T>

推荐存储方式:
  • 存储:Page<T> 序列化为 JSON 字符串后存储。
  • 取回: 从 Redis 中获取 JSON 字符串后,使用 JSON.parseObject()Jackson 反序列化为 Page<T> 对象。
示例:
// 假设 pageInfo 是一个 Page 类型的对象
Page<String> pageInfo = new PageImpl<>(Arrays.asList("item1", "item2"), PageRequest.of(0, 10), 2);
String json = JSON.toJSONString(pageInfo);  // 将 Page 序列化为 JSON 字符串
redisService.set(finalKey, json);

// 取回并反序列化为 Page
String jsonString = redisService.get(finalKey);
Page<String> pageFromRedis = JSON.parseObject(jsonString, new TypeReference<Page<String>>() {});

四、存储和取回 Java Bean(类对象)

推荐存储方式:
  • 存储: 将 Java Bean 对象序列化为 JSON 字符串后存储。
  • 取回: 使用 JSON 反序列化将字符串转换回相应的 Java Bean 对象。
示例:
// 定义一个 Java Bean 类
public class User {
    private String name;
    private int age;

    // Getter and Setter
}

// 存储 Java Bean
User user = new User();
user.setName("John");
user.setAge(30);
String json = JSON.toJSONString(user);  // 将 User 对象序列化为 JSON 字符串
redisService.set(finalKey, json);

// 取回并反序列化为 Java Bean
String jsonString = redisService.get(finalKey);
User userFromRedis = JSON.parseObject(jsonString, User.class);

五、存储和取回复杂对象(如嵌套类、嵌套泛型等)

对于嵌套复杂对象(比如类中有 List、Map、Page 等复杂数据结构),你依然可以采用将对象序列化为 JSON 字符串的方式来存储。注意,在反序列化时,必须确保泛型类型信息正确。

示例:
public class UserWithFriends {
    private String name;
    private List<String> friends;

    // Getter and Setter
}

// 存储复杂对象
UserWithFriends user = new UserWithFriends();
user.setName("John");
user.setFriends(Arrays.asList("Alice", "Bob"));
String json = JSON.toJSONString(user);  // 将对象序列化为 JSON 字符串
redisService.set(finalKey, json);

// 取回并反序列化为复杂对象
String jsonString = redisService.get(finalKey);
UserWithFriends userFromRedis = JSON.parseObject(jsonString, UserWithFriends.class);

六、Redis 序列化方式对比:使用 setObjectgetObject

redisService.setObjectredisService.getObject 是一些 Redis 客户端实现的扩展方法,通常用于简化序列化/反序列化的操作。这些方法将对象直接序列化为字节数组存储,取回时会自动反序列化成原始对象。

使用 setObjectgetObject 的优点:
  • 简化序列化操作,不需要手动将对象转为 JSON 字符串。
  • 对于简单对象,setObjectgetObject 是比较方便的方式。
示例:
// 存储对象
User user = new User();
user.setName("John");
user.setAge(30);
redisService.setObject(finalKey, user);  // 自动序列化

// 取回对象
User userFromRedis = redisService.getObject(finalKey, User.class);  // 自动反序列化

七、总结:各种存储方式的选择

  1. 字符串 (String):直接使用 redisService.set(finalKey, value)redisService.get(finalKey) 存取,不需要序列化。
  2. 泛型 List<T>Page<T>、复杂对象:通过 JSON 序列化和反序列化来存取,使用 JSON.toJSONString() 存储,使用 JSON.parseObject()JSON.parseArray() 取回。可以使用 redisService.set(finalKey, json)redisService.get(finalKey) 存取。
  3. Java Bean(简单对象):可以直接用 JSON 序列化 JSON.toJSONString()JSON.parseObject()
  4. 复杂对象(如嵌套类、泛型等):使用 TypeReferenceJSON 进行复杂类型的序列化和反序列化。
回答: Redis序列化反序列化是指将数据在Redis中进行存储和读取时的编码和解码过程。在Redis中,有多种序列化方式可供选择。其中,JdkSerializationRedisSerializer是默认的序列化方式,它使用Java的标准序列化机制将对象转换为字节数组进行存储。另外还有StringRedisSerializer,它将对象转换为字符串进行存储;JacksonJsonRedisSerializer,它使用Jackson库将对象转换为JSON格式进行存储;OxmSerializer,它使用XML格式进行存储;以及GenericFastJsonRedisSerializer,它使用FastJson库将对象转换为JSON格式进行存储。\[2\] 在使用RedisTemplate进行序列化反序列化时,可以通过设置RedisTemplate的valueSerializer属性来指定使用的序列化方式。例如,可以使用GenericFastJsonRedisSerializer来进行序列化反序列化操作。\[1\]此外,还可以使用executePipelined方法来批量执行Redis操作,其中可以指定序列化反序列化的方式。\[3\]通过选择合适的序列化方式,可以提高Redis的存储效率和读取速度,同时也可以确保数据的正确性和一致性。 #### 引用[.reference_title] - *1* *2* *3* [RedisRedisTemplate配置方式(序列和反序列化)](https://blog.youkuaiyun.com/u013733643/article/details/124805222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值