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

java redis set 集合操作中 如何有效移除自定义对象

Java redis set集合操作中如何有效移除自定义对象

关键在于确保对象的序列化与反序列化结果完全一致。

一、问题核心

Redis的Set集合存储的是字符串值,若直接存入Java对象,需通过序列化转为字符串。移除操作(SREM)依赖序列化后的字符串是否匹配,若序列化不一致则无法删除。常见问题:

  • 字段顺序不一致(如JSON默认按字母排序)
  • 包含额外字段(如transient字段未排除)
  • 序列化配置差异(如日期格式、空值处理)

二、解决方案

1. 使用JSON序列化(推荐Jackson/Gson)
  • 优点:可控制字段顺序、排除无关字段、统一配置。
  • 关键配置
    // Jackson配置示例(确保字段顺序稳定)
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
    objectMapper.disable(SerializationFeature.INDENT_OUTPUT); // 禁用缩进
    objectMapper.setSerializationInclusion(Include.NON_NULL); // 忽略null字段
    
2. 序列化与反序列化一致性
  • 添加对象到Set
    User user = new User("Alice", 30);
    String serializedUser = objectMapper.writeValueAsString(user);
    jedis.sadd("userSet", serializedUser);
    
  • 移除对象
    User target = new User("Alice", 30);
    String targetSerialized = objectMapper.writeValueAsString(target);
    Long removed = jedis.srem("userSet", targetSerialized);
    
3. 避免Java原生序列化
  • 问题:依赖implements Serializable,易受类版本(serialVersionUID)影响,不同JVM可能结果不同。
  • 替代方案:JSON或Protobuf等跨平台格式。

三、完整代码示例

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import redis.clients.jedis.Jedis;public class RedisCustomObjectRemoval {private static final ObjectMapper mapper = new ObjectMapper();static {// 统一序列化配置mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);mapper.disable(SerializationFeature.INDENT_OUTPUT);}public static void main(String[] args) throws Exception {try (Jedis jedis = new Jedis("localhost")) {// 添加对象User user1 = new User("Alice", 30);jedis.sadd("users", mapper.writeValueAsString(user1));// 移除对象(必须序列化一致)User user2 = new User("Alice", 30);Long count = jedis.srem("users", mapper.writeValueAsString(user2));System.out.println("删除数量: " + count); // 输出1}}static class User {private String name;private Integer age;public User(String name, Integer age) {this.name = name;this.age = age;}// Jackson需Getter方法public String getName() { return name; }public Integer getAge() { return age; }}
}

四、常见问题处理

1. 字段顺序不一致
  • 原因:JSON库默认按字段名排序(如字母顺序)。
  • 解决:强制按类中声明顺序排序(Jackson需配置@JsonPropertyOrder注解):
    @JsonPropertyOrder({"name", "age"}) // 指定字段顺序
    static class User {// ...
    }
    
2. 类结构变更导致数据不一致
  • 场景:新增/删除字段后,旧数据无法反序列化。
  • 解决
    • 数据迁移:遍历Set,反序列化旧数据并转换为新格式。
    • 兼容性配置:Jackson通过@JsonIgnoreProperties(ignoreUnknown = true)忽略未知字段。
3. 性能优化
  • 缓存序列化结果:若对象不变,可缓存其序列化字符串。
    private static final Map<User, String> serializedCache = new ConcurrentHashMap<>();
    String getSerialized(User user) {return serializedCache.computeIfAbsent(user, u -> mapper.writeValueAsString(u));
    }
    
4. 特殊字符处理
  • 编码统一:确保Redis客户端和服务端均使用UTF-8编码。
  • 示例代码中无需额外处理,JSON库默认处理特殊字符。

五、扩展方案:使用二进制序列化

若需极致性能,可改用二进制序列化(如Protobuf、Kryo),但需权衡可读性:

// Kryo示例(需引入依赖)
Kryo kryo = new Kryo();
kryo.register(User.class);
try (Output output = new Output(new ByteArrayOutputStream())) {kryo.writeObject(output, user);jedis.sadd("users", output.getBuffer());
}

最后

其实我们经常忽略的是,先改变了对象,然后再去删除。就导致 自定义
对象不想等了。

  • 核心原则:序列化结果必须完全一致。
  • 推荐方案:JSON + 严格配置(字段顺序、排除空值)。
  • 避坑指南:避免toString()、Java原生序列化,及时处理类变更。
http://www.xdnf.cn/news/7612.html

相关文章:

  • 深信服golang面经
  • 【Python 算法零基础 4.排序 ③ 插入排序】
  • 零基础入门Selenium自动化测试:自动登录edu邮箱
  • waitress 简介
  • Dify实战案例《AI面试官》更新,支持语音交互+智能知识库+随机题库+敏感词过滤等...
  • 5月20日day31打卡
  • 自定义geojson生成物体的样式
  • Pichome 开源网盘程序index.php 文件读取漏洞(CVE-2025-1743)
  • 完善网络安全等级保护,企业需注意:
  • (2)JVM 内存模型更新与 G1 垃圾收集器优化
  • SymPy|主元、重新表示、分数、约分表达式、极限、级数、ode、获取值、输出形式
  • BRIGHTONE : 520-On-Chain WOHOO Carnival
  • 学习日记-day11-5.20
  • 【强化学习】深度强化学习 - Deep Q-Network(DQN)算法
  • 代码随想录算法训练营Day59
  • 谷歌宣布推出 Android 的新安全功能,以防止诈骗和盗窃
  • HarmonyOS5云服务技术分享--账号关联开发指南
  • 蓝桥杯框架-按键数码管
  • 使用Java实现Navicat密码的加密与解密
  • 渐开线少齿差传动学习笔记
  • 集星獭 | 重塑集成体验:新版编排重构仿真电商订单数据入库
  • 更新2011-2025经济类联考 396-真题+解析 PDF
  • 30天自制操作系统day5(vram和显存)(GDT和IDT)(c语言结构体)(汇编-c)(ai辅助整理)
  • [Web服务器对决] Nginx vs. Apache vs. LiteSpeed:2025年性能、功能与适用场景深度对比
  • 第5天-python饼图绘制
  • 系统集成项目管理工程师学习笔记之启动过程组
  • 防御策略与安全加固
  • 电子科技大学软件工程实践期末
  • OK536N-C测评:开箱体验以及在Linux下如何管理开发板
  • MacBook Air A2179(Intel版)安装macOS Catalina所需时间