redis中序列化后的对象后当如何修改
redis中序列化
- Redis 中存储的序列化对象是不可变
- 需要频繁修改对象属性, 我存储对象为hash结构如何?
- 总结
君问归期未有期,巴山夜雨涨秋池。——唐代李商隐《夜雨寄北》
Redis 中存储的序列化对象是不可变
在 Redis 中存储的序列化对象是不可变的,因为它们被序列化为字节数组并存储在 Redis 中,无法直接访问对象属性。如果您想修改对象属性,您需要将对象反序列化为一个 Java 对象,然后修改属性值,再将修改后的对象重新序列化并存储回 Redis 中。
以下是一个示例代码,它从 Redis 中获取序列化对象、将其反序列化为一个 Java 对象、修改对象属性值、然后再次将修改后的对象序列化并存储回 Redis 中:
@Autowired
private RedisTemplate<String, Object> redisTemplate;public void updateProperty(String key) throws IOException {byte[] bytes = redisTemplate.opsForValue().get(key);if (bytes == null) {throw new IllegalArgumentException("Key not found in Redis");}MyObject myObject = deserialize(bytes); // 将字节数组反序列化为 Java 对象myObject.setIntProperty(myObject.getIntProperty() + 1); // 修改对象属性值byte[] updatedBytes = serialize(myObject); // 将修改后的对象序列化为字节数组redisTemplate.opsForValue().set(key, updatedBytes); // 将修改后的对象存储回 Redis
}private MyObject deserialize(byte[] bytes) throws IOException, ClassNotFoundException {ByteArrayInputStream bis = new ByteArrayInputStream(bytes);ObjectInputStream ois = new ObjectInputStream(bis);return (MyObject) ois.readObject();
}private byte[] serialize(MyObject myObject) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(myObject);return bos.toByteArray();
}
在这个示例中,我们首先使用 RedisTemplate 的 opsForValue() 方法获取 ValueOperations 对象,然后使用 get() 方法获取 Redis 中存储的序列化对象的字节数组。然后,我们使用 deserialize() 方法将字节数组反序列化为 Java 对象,修改对象属性值,再使用 serialize() 方法将修改后的对象序列化为字节数组,最后将修改后的对象存储回 Redis 中。
需要注意的是,对象的反序列化和序列化是一种昂贵的操作,它需要将对象从字节数组转换为 Java 对象,或将 Java 对象转换为字节数组。如果您需要频繁修改对象属性,建议将对象存储为 Redis 基本数据类型,如字符串或整数,避免了反序列化和序列化的开销。
需要频繁修改对象属性, 我存储对象为hash结构如何?
需要频繁地修改对象属性,将对象存储为 Redis 的 Hash 结构可能是更好的选择。Redis 的 Hash 结构是一个键值对集合,可以存储多个字段和值,并提供了快速访问和修改单个字段的功能。
以下是一个示例代码,它将对象存储为 Redis 的 Hash 结构,并提供了一些方法来访问和修改对象的属性:
@Autowired
private RedisTemplate<String, Object> redisTemplate;public void saveMyObject(MyObject myObject) {String key = "myObject:" + myObject.getId();Map<String, Object> map = new HashMap<>();map.put("intProperty", myObject.getIntProperty());map.put("stringProperty", myObject.getStringProperty());redisTemplate.opsForHash().putAll(key, map);
}public MyObject getMyObject(int id) {String key = "myObject:" + id;Map<Object, Object> map = redisTemplate.opsForHash().entries(key);MyObject myObject = new MyObject();myObject.setId(id);myObject.setIntProperty((Integer) map.get("intProperty"));myObject.setStringProperty((String) map.get("stringProperty"));return myObject;
}public void updateIntProperty(int id, int newValue) {String key = "myObject:" + id;redisTemplate.opsForHash().put(key, "intProperty", newValue);
}public void updateStringProperty(int id, String newValue) {String key = "myObject:" + id;redisTemplate.opsForHash().put(key, "stringProperty", newValue);
}
在这个示例中,我们将对象存储为 Redis 的 Hash 结构,使用对象的 ID 作为键,将对象的属性名和属性值作为字段和值存储在 Hash 结构中。saveMyObject() 方法存储对象,getMyObject() 方法获取对象,updateIntProperty() 和 updateStringProperty() 方法分别更新整型和字符串类型的属性。
总结
需要注意的是,存储对象为 Hash 结构需要将对象属性名和属性值都转换为字符串类型。在获取对象时,我们需要将属性值转换回原始类型。此外,如果您的对象属性很多,存储为 Hash 结构可能会占用大量的内存,因此请确保仅存储必要的属性。
不需要频繁修改的属性存储为 Redis 字符串或其他合适的 Redis 数据结构
最后,您需要根据您的应用程序需求来选择适合的 Redis 数据结构和存储方式,以及确保数据访问和修改的原子性和一致性
相关文章:
redis中序列化后的对象后当如何修改
redis中序列化Redis 中存储的序列化对象是不可变需要频繁修改对象属性, 我存储对象为hash结构如何?总结君问归期未有期,巴山夜雨涨秋池。——唐代李商隐《夜雨寄北》 Redis 中存储的序列化对象是不可变 在 Redis 中存储的序列化对象是不可变的,因为它们…...
膜拜!阿里自爆十万字Java面试手抄本,脉脉一周狂转50w/次
最近,一篇题为《阿里十万字Java面试手抄本》的文章在社交媒体平台上引起了广泛关注。这篇文章由一位阿里工程师整理了阿里Java面试的经验,并分享给了大家。这篇文章一经发布,就在短时间内获得了数十万的转发量,让许多Java程序员受…...
Yolov5改进: Yolov5-FasterNet网络推理加速
文章目录 1. FasterNet介绍1. 1 FasterNet性能1.2 FasterNet作为Backbone2. 基于C3-Faster实现Yolov5 轻量化2.1 C3-Faster的实现2.2 C3-Faster 在YOLOv5中的使用(1) 在common.py 中添加`C3-Faster`代码(2) 修改yolo.py 中的代码(2) 修改yolov5 yaml文件3. 训练1. FasterNet介绍…...
在ubuntu下安装五笔输入法(百度输入法)
想要在ubuntu下安装一款合适的五笔输入法,不是一件容易的事。现在我找到了一个好用的输入法分享给大家。 环境:Ubuntu22.04桌面版。 软件:百度Linux输入法-支持全拼、双拼、五笔 步骤一: 需要大家先下载百度的五笔输入法。 http…...
python自动发送邮件(html、附件等),qq邮箱和网易邮箱发送和回复
在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件。今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...
数学-快速幂
从一个简单的问题说起: 给出整数m,n和p,要求计算(m ^ n) % p的结果。 #include <iostream> using namespace std;int main() {long long m, n, p;cin >> m >> n >> p;long long ans 1;for (long long i 0; i < …...
DevEco鸿蒙应用开发-第一个App
目录下载开发环境创建工程登录华为账户测试应用下载开发环境 前往官网下载 DevEco 开发环境:https://developer.harmonyos.com/cn/develop/deveco-studio#download 下载并安装,请记住你选择的 IDE 与 SDK 安装位置,后续可能会用到ÿ…...
又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费
chartgpt大火之后,随之而来的就是一大类衍生物了。 然后,今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费,我们可以直接利用它来辅助我们编程,真正做到事半功倍。 注意&#…...
CSS的浮动(下)
🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…...
软件测试-性能测试流程
压测任务具体包含: 0.前期准备 尽量参与业务需求评审,可以对业务有更深入的了解,了解哪些功能是核心功能,哪些可能存在性能瓶颈,以便在性能需求评审的时候能给出有建设性的意见 1.性能需求分析、评审 明确测试范围(哪些业务接口)、目标(tps、rt、成功率) 关于性能需…...
【python实操】年轻人,别用记事本保存数据了,试试数据库吧
为什么用数据库? 数据库比记事本强在哪? 答案很明显,你的文件很多时候都只能被一个人打开,不能被重复打开。当有几百万数据的时候,你如何去查询操作数据,速度上要快,看起来要清晰直接 数据库比我…...
铁威马NAS教程之利用docker快速搭建个人在线书库
这是一个基于Calibre的简单的图书管理系统,支持在线阅读。主要特点是:美观的界面、支持多用户、支持在线阅读、支持邮件推送、支持OPDS、支持一键安装,网页版初始化配置,轻松启动网站等等。 那么,如何利用docker快速搭…...
504. 七进制数——【Leetcode每日一题】
504. 七进制数 给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。 示例 1: 输入: num 100 输出: “202” 示例 2: 输入: num -7 输出: “-10” 提示: −107<num<107-10^7 < num < 10^7−107<num<107 思路&…...
RocketMQ源码(24)—DefaultMQPushConsumer延迟消息源码
基于RocketMQ release-4.9.3,深入的介绍了DefaultMQPushConsumer延迟消息源码。 文章目录1 load加载延迟消息数据1.1 parseDelayLevel解析延迟等级2 start启动调度消息服务3 DeliverDelayedMessageTimerTask投递延迟消息任务3.1 executeOnTimeup执行延迟消息投递3.2…...
计算机视觉知识点(一)——交并比(IoU)及其若干改进
交并比(IoU)前言IoU公式及示意图IoU Loss缺点GIoU Loss公式及示意图缺点DIoU公式及示意图CIoU前言 目标检测是一个常见的计算机视觉任务,在目标检测任务中,交并比作为评判检测框的标准具有很重要的意义,在实际的应用中…...
一篇文章教你从零到一搭建自动化测试框架(附视频教程+源码)
目录 前言 1. 什么是自动化测试框架? 2. 没有万能的测试框架,适合自己项目的,能提高工作效率的就是好框架。 3. 设计框架的思路: 4.如何开展自动化测试 前言 关于测试框架的好处,比如快速回归提高测试效率&#x…...
【备战蓝桥杯】----01背包问题(动态规划)
🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...
Golang1.18新特性介绍——泛型
社区长期高呼的泛型特性在Golang 1.18中终于正式发布,Go泛型实现与传统的C有较大差异,更像Rust的泛型实现。本文详细介绍Golang泛型及其特性,包括泛型语法、类型参数、类型约束、类型近似以及constraints包提供内置类型等。 最近写Dao代码&am…...
【SpringBoot17】SpringBoot中使用Quartz管理定时任务
定时任务在系统中用到的地方很多,例如每晚凌晨的数据备份,每小时获取第三方平台的 Token 信息等等,之前我们都是在项目中规定这个定时任务什么时候启动,到时间了便会自己启动,那么我们想要停止这个定时任务的时候&…...
杨辉三角形 (蓝桥杯) JAVA
目录题目描述:暴力破解(四成):二分法破解(满分):题目描述: 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
