2、kettle知识点系列之kettle向redis同步数据

2023-11-10

kettle向redis同步数据

网上kettle向redis同步数据的完整案例不是很多,本文将以案例形式对整个过程进行详细讲解。

一、案例描述

本文以最简单的案例描述,大家在应用过程中可根据实际情况进行调整。现有学生表和成绩表。如何将表中的数据按照如下要求同步至redis?
1、将学生表的数据同步至redis,学生表的id为redis的key
2、按照如下结构同步每个学生的信息以及所关联的成绩。redis的key使用学生id_学生姓名形式。

{
"学生详细信息":[],
"成绩信息":[],
"学生id":"",
"学生姓名":""
}

二、数据准备

1、student表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `xh` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '001');
INSERT INTO `student` VALUES ('2', '李四', '002');
INSERT INTO `student` VALUES ('3', '王五', '003');

SET FOREIGN_KEY_CHECKS = 1;

2、grade表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for grade
-- ----------------------------
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`  (
  `id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `classname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `score` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `stuid` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of grade
-- ----------------------------
INSERT INTO `grade` VALUES ('1', '语文', '90', '1');
INSERT INTO `grade` VALUES ('2', '数学', '100', '1');
INSERT INTO `grade` VALUES ('3', '英语', '80', '1');
INSERT INTO `grade` VALUES ('4', '语文', '85', '2');
INSERT INTO `grade` VALUES ('5', '数学', '100', '2');
INSERT INTO `grade` VALUES ('6', '英语', '95', '2');
INSERT INTO `grade` VALUES ('7', '语文', '98', '3');
INSERT INTO `grade` VALUES ('8', '数学', '87', '3');
INSERT INTO `grade` VALUES ('9', '英语', '65', '3');

SET FOREIGN_KEY_CHECKS = 1;

三、工具类准备

1、启动redis
2、使用redis管理工具进行连接

链接:https://pan.baidu.com/s/1a7a2GBV9SGThr0efx8EFSA 
提取码:e8wj

3、下载kettle中连接redis的相关jar包(jedis-3.1.0.jar和fastjson-1.2.47.jar)

链接:https://pan.baidu.com/s/1q1jymAEo9mI7GDHNrGuRyw 
提取码:4kjw

下载后将jar文件放在kettle根目录下的lib文件中。切记要重启,否则不生效

四、 案例实现

1、案例一:将学生表的数据同步至redis,学生表的id为redis的key

(1)kettle任务
作业:
在这里插入图片描述
为了后续方便,将redis相关设置提出。
设置抽取变量
在这里插入图片描述
(2)转换内容
转换:
在这里插入图片描述
表输入:
在这里插入图片描述
JSON output:
在这里插入图片描述
在这里插入图片描述

Java 代码-向redis写数据
可进行设置redis连接、向redis写数据以及设置过期时间等。
在这里插入图片描述
java代码如下:


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;

private Jedis jedis=null;
private JedisPool pool=null;
Pipeline pipe = null;
int cache_size=10000; // 批量提交大小
int cur_size=0; // 当前数据缓存量


public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;
		String redis_ip = getVariable("REDIS_IP", "");
		String redis_port = getVariable("REDIS_PORT", "");
		String redis_password = getVariable("REDIS_PWD", "");
		int redis_db = Integer.parseInt(getVariable("REDIS_DB", ""));

		cache_size = Integer.valueOf(getVariable("redis.cache_size", "10000"));
		logBasic(redis_ip+":"+redis_port);
		logBasic("redis_password:"+redis_password);

		// 连接池方式
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(8);
		config.setMaxTotal(18);
		pool = new JedisPool(config, redis_ip, Integer.valueOf(redis_port), 2000, redis_password);
		jedis = pool.getResource();		
		jedis.select(redis_db);// 切换数据库
		pipe = jedis.pipelined(); // 创建pipeline 对象
		
		logBasic("Server is running: " + jedis.ping());

  }


  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
	pipe.sync();
	jedis.close();
	pool.close();

    return false;
  }


  r = createOutputRow(r, data.outputRowMeta.size());

	String key = get(Fields.In, "id").getString(r);
	String value = get(Fields.In, "JsonData").getString(r);
	logDebug(key +"***"+ "\t" + value);


	// 写入redis
	pipe.set(key, value);

	//设置redis过期时间:单位为秒
	pipe.expire(key, 3600);
	
	cur_size++;
	if (cur_size % cache_size == 0 && cur_size > 0) {// 当达到缓存最大值时提交
		pipe.sync(); // 同步
		cur_size=0; // 复位
	}
		

  putRow(data.outputRowMeta, r);

  return true;
}

(3)redis效果
在这里插入图片描述
使用json解析网址查看的结果如下。

https://www.json.cn/
{
    "data":[
        {
            "xh":"001",
            "name":"张三",
            "id":"1"
        }
    ]
}

2、案例二:按照如下结构同步每个学生的信息以及所关联的成绩。redis的key使用学生id_学生姓名形式。
(1)作业
基本与案例一类似,不在赘述
在这里插入图片描述
在这里插入图片描述
(2)获取关键参数
在这里插入图片描述
(3)同步业务数据到redis
在这里插入图片描述

在这里插入图片描述
多余的环节不在赘述,只展示关键点:
在这里插入图片描述
在这里插入图片描述
Java 代码-向redis写数据源码:
如果不对组装结果进行处理,输出的内容如下,比较杂乱。因此我在此处写了工具类对这个结果进行了处理组装。
未处理结果:

{
    "data":[
        {
            "tagjson":"{\"student\":[{\"xh\":\"001\",\"name\":\"张三\",\"id\":\"1\"}]}"
        },
        {
            "tagjson":"{\"grade\":[{\"score\":\"90\",\"classname\":\"语文\",\"stuid\":\"1\",\"id\":\"1\"},{\"score\":\"100\",\"classname\":\"数学\",\"stuid\":\"1\",\"id\":\"2\"},{\"score\":\"80\",\"classname\":\"英语\",\"stuid\":\"1\",\"id\":\"3\"}]}"
        }
    ]
}

处理过程:Java 代码-向redis写数据源码


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;
import unit.TestJsonUntil;
private Jedis jedis=null;
private JedisPool pool=null;
Pipeline pipe = null;
int cache_size=10000; // 批量提交大小
int cur_size=0; // 当前数据缓存量


public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;
		String redis_ip = getVariable("REDIS_IP", "");
		String redis_port = getVariable("REDIS_PORT", "");
		String redis_password = getVariable("REDIS_PWD", "");
		int redis_db = Integer.parseInt(getVariable("REDIS_DB", ""));

		cache_size = Integer.valueOf(getVariable("redis.cache_size", "10000"));
		logBasic(redis_ip+":"+redis_port);
		logBasic("redis_password:"+redis_password);

		// 连接池方式
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(8);
		config.setMaxTotal(18);
		pool = new JedisPool(config, redis_ip, Integer.valueOf(redis_port), 2000, redis_password);
		jedis = pool.getResource();		
		jedis.select(redis_db);// 切换数据库
		pipe = jedis.pipelined(); // 创建pipeline 对象
		
		logBasic("Server is running: " + jedis.ping());

  }


  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
	pipe.sync();
	jedis.close();
	pool.close();

    return false;
  }


  r = createOutputRow(r, data.outputRowMeta.size());

String jsondata = get(Fields.In, "JsonData").getString(r);
	String  value =  TestJsonUntil.formatTestJson(jsondata);

String key = TestJsonUntil.getID(value);

	logDebug(key +"***"+ "\t" + value);


	// 写入redis
	pipe.set(key, value);

	//设置redis过期时间:单位为秒
	pipe.expire(key, 3600);
	
	cur_size++;
	if (cur_size % cache_size == 0 && cur_size > 0) {// 当达到缓存最大值时提交
		pipe.sync(); // 同步
		cur_size=0; // 复位
	}
		

  putRow(data.outputRowMeta, r);

  return true;
}

所用到的工具类,此处是我写的java组件,打包后放入kettle根目录下的lib中即可。记得放入后需要重启。

package unit;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: qzc
 * @Date: 2023/03/13/11:51
 * @Description:
 */
public class TestJsonUntil {

    public static String getID(String  str){
        String retstr="";
        JSONObject json = JSONObject.parseObject(str);
        if(null !=json){
            retstr= (json.getString("stuid")+"-"+json.getString("name"));

        }
        return retstr;
    }

    public static String formatTestJson(String  str){
        JSONObject jsonObject  = new JSONObject();
        jsonObject.put("stuid",null);
        jsonObject.put("name",null);
        jsonObject.put("student",null);
        jsonObject.put("grade",null);
        try {
            JSONObject json = JSONObject.parseObject(str);
            if(null != json){
                JSONArray jsonArray =JSONArray.parseArray(json.get("data").toString()) ;
                if(null != jsonArray  &&  jsonArray.size()>0){
                    //定义集合
                    JSONArray stuArr = new JSONArray();
                    JSONArray grdArr = new JSONArray();
                    for(int i =0;i<jsonArray.size();i++){
                        JSONObject jsondata = jsonArray.getJSONObject(i);
                        if(null != jsondata  && null != jsondata.getJSONObject("tagjson") ){
                            JSONObject tagjson = JSONObject.parseObject(jsondata.getJSONObject("tagjson").toJSONString());
                            if(null != tagjson ){
                                JSONArray curjsonArr = new JSONArray();
                                String currtype=null;

                                if(null != tagjson.get("student")){
                                    currtype="student";
                                    curjsonArr = JSONArray.parseArray(tagjson.get("student").toString());
                                }else if(null != tagjson.get("grade")){
                                    currtype="grade";
                                    curjsonArr = JSONArray.parseArray(tagjson.get("grade").toString());
                                }
                                if(null != curjsonArr  &&  curjsonArr.size()>0){
                                    for(int j =0;j<curjsonArr.size();j++){
                                        JSONObject tag = curjsonArr.getJSONObject(j);

                                        if(null == jsonObject.get("name") && null != currtype && "student".equals(currtype)){
                                            jsonObject.put("name",tag.get("name"));
                                        }
                                        if(null == jsonObject.get("stuid") && null != currtype && "student".equals(currtype)){
                                            jsonObject.put("stuid",tag.get("id"));
                                        }

                                        if(null != currtype && "grade".equals(currtype)){
                                            grdArr.add(tag);
                                        }else if(null != currtype && "student".equals(currtype)){
                                            stuArr.add(tag);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //将处理后的数据放入jsonobject
                    jsonObject.put("grade",grdArr);
                    jsonObject.put("student",stuArr);
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return jsonObject.toJSONString();
    }

//
//    public static void main(String[] args) {
//        String str ="{\"data\":[{\"tagjson\":\"{\\\"student\\\":[{\\\"xh\\\":\\\"001\\\",\\\"name\\\":\\\"张三\\\",\\\"id\\\":\\\"1\\\"}]}\"},{\"tagjson\":\"{\\\"grade\\\":[{\\\"score\\\":\\\"90\\\",\\\"classname\\\":\\\"语文\\\",\\\"stuid\\\":\\\"1\\\",\\\"id\\\":\\\"1\\\"},{\\\"score\\\":\\\"100\\\",\\\"classname\\\":\\\"数学\\\",\\\"stuid\\\":\\\"1\\\",\\\"id\\\":\\\"2\\\"},{\\\"score\\\":\\\"80\\\",\\\"classname\\\":\\\"英语\\\",\\\"stuid\\\":\\\"1\\\",\\\"id\\\":\\\"3\\\"}]}\"}]}";
//        String  strs  = TestJsonUntil.formatTestJson(str);
//        String str2 = TestJsonUntil.getID(strs);
//        System.out.println(str2);
//
//    }
}

处理完成后输出的结果如下:
在这里插入图片描述
这样输出显然结构很清晰。

{
    "stuid":"1",
    "student":[
        {
            "xh":"001",
            "name":"张三",
            "id":"1"
        }
    ],
    "grade":[
        {
            "score":"90",
            "classname":"语文",
            "stuid":"1",
            "id":"1"
        },
        {
            "score":"100",
            "classname":"数学",
            "stuid":"1",
            "id":"2"
        },
        {
            "score":"80",
            "classname":"英语",
            "stuid":"1",
            "id":"3"
        }
    ],
    "name":"张三"
}

五、总结

总体来说整个过程不难,大家可以根据自己的实际需要进行调整。在正常的生成过程中业务往往及其复杂,单纯的靠kettle组件处理一些复杂的数据可能比较麻烦,这时候我觉得可以借助java组件处理业务逻辑,这样会使整个作业相对来说更加简洁方便。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2、kettle知识点系列之kettle向redis同步数据 的相关文章

  • 如何在多个Lua State(多线程)之间传递数据?

    我在中启动Redis连接池redis lua 通过从 C 调用 我得到了redis lua state 此 Lua 状态全局启动一次 仅在其他线程中启动get从中 当有一个 HTTP 请求 工作线程 时 我需要从redis lua stat
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get
  • Spring Redis 排序键

    我在 Redis Spring Data Redis 中有以下键 localhost gt Keys 1 id 1 Name C5796 Site DRG1 2 id 2 Name CX1XE Site DG1 3 id 3 Name C5
  • Redis 在键过期时更新排序集

    我有一个 Redis 服务器 其中包含一组键值对和一个排序集 提供这些键值对的键的索引 键值对可以进入 已完成 状态 此时需要在 1 小时后删除它们 这可以通过在键上设置到期时间来简单地实现 但从排序集中清除它们似乎更成问题 我可以有一个过

随机推荐

  • 由于找不到MSVCR120.dll,无法继续执行代码

    原因 这是因为 MSVCR120 dll 这个dll程序消失了 所以会出现这样的情况 解决方法 下载 MSVCR120 dll 这个dll文件 下载地址 DLL文件下载 在搜索框中输入确实的DLL文件 点击搜索即可 如下图 点击文件名 往下
  • 1.Django安装和项目创建

    Django 框架是用Python语言开发的 所以安装Django 就像安装其他的 Python库一样 执行如下命令即可 pip install django 你可以执行如下命令检查Django是否安装好 并且查看安装的Django版本 p
  • Web自动化测试,怎样断言和形成报告?

    目录 1 自动化断言 1 1断言概念 1 2断言介绍 1 3代码案例 2 自动化报告 2 1HTMLTestRunner 2 1 1HTMLTestRunner 的下载和安装 2 1 2HTMLTestRunner使用 2 2Beautif
  • 图像噪声与图像信噪比(一)

    图像噪声与图像信噪比 一 噪声是指图像密度的随机变动 具体指的是胶片的颗粒或者说数字图像上像素级的变动 这是一个关键的图像质量因素 和图像清晰度一样重要 它和图像的动态范围相关性较强 即一定亮度范围内相机可以提供的优秀的信噪比和反差 因为它
  • 应急响应流程及windows/linux用到的命令

    应急响应流程 1 收集信息 搜集客户信息和中毒信息 备份 2 判断类型 判断是否是安全事件 是何种安全事件 勒索病毒 挖矿 断网 ddos等 3 深入分析 日志分析 进程分析 启动项分析 样本分析 4 清理处置 杀掉恶意进程 删除恶意文件
  • #今日论文推荐# ECCV 2022

    今日论文推荐 ECCV 2022 旷视提出半监督目标检测模型Dense Teacher 取得SOTA性能 这篇论文提出了一个新的半监督目标检测模型 Dense Teacher 推翻了当前流行的用 thresholding 生成 hard p
  • virtualBox桥接模式下openEuler镜像修改IP地址、openEule修改IP地址、openEule设置IP地址

    安装好openEuler后 设置远程登入前 必不可少的一步 主机与虚拟机之间的通信要解决 下面给出详细步骤 第一步 检查虚拟机适配器模式 桥接模式 第二步 登入虚拟机修改IP cd etc sysconfig network scripts
  • C++11的半同步半异步线程池

    C 11的半同步半异步线程池 简介 同步队列 Take函数 Add函数 Stop函数 SyncQueue完整代码 线程池 主函数测试 简介 半同步半异步线程池用的比较多 实现也比较简单 其中同步层包括同步服务层和排队层 指的是将接收的任务排
  • TIM_SetCompare1()函数没起作用

    最近使用stm32f103c8t6做控制器 需要实时调整PWM的占空比 由于TIM SetComparex 是常用的修改PWM占空比的函数 现象 在主函数里面调用TIM SetComparex 函数 但是有时候该函数起作用 有时候该函数不起
  • 用户画像及项目实例:电商用户画像

    用户画像及项目实例 所谓用户画像就是标签的汇总 从用户不同方面信息中提取有价值特征来构建标签库 并从标签库中探索信息 从而构建用户画像 用户画像建模 第一步 统一用户唯一标识 用户唯一标识是整个用户画像的核心 方便跟踪和分析一个用户的特征
  • 【C语言】数据结构的基本概念与评价算法的指标

    1 数据结构的基本概念 1 1 基本概念和术语 1 1 1 数据 数据是信息的载体 是描述客观事物属性的数 字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据是计算机程序加工的原料 1 1 2 数据元素 数据元素是数据的基
  • 防御第五次作业

    一 结合以下问题对当天内容进行总结 1 什么是恶意软件 可以指代病毒 蠕虫 特洛伊木马 勒索软件 间谍软件 广告软件和其他类型的有害软件 恶意软件的主要区别在于它必须是故意为恶 任何无意间造成损害的软件均不视为恶意软件 恶意软件的总体目标是
  • 【vue3+ts】TypeError: Cannot read properties of undefined (reading ‘commit‘)

    项目场景
  • oracle 给表或字段添加备注语法

    comment on column TableName ColumnName is 备注名 comment on table TableName is 备注名
  • 一些写得非常不错的C++网络编程库

    如果你对网络编程有兴趣的话 可以从以下内容来学习 想写好程序最基本的方法就是多看 等看明白了 多写 这样自然就成为所谓的高手 不过CPL认为更贴切的应该叫熟练手吧 转载 http www crystalclearsoftware com c
  • 计算机本科生毕业设计题目(三)

    资源下载 计算机本科生毕业设计题目 资源下载 计算机论文题目精选50篇 文章目录 一 安卓 二 java 三 ASP NET C 题目 毕设通用50篇 一 安卓 安卓 001 个人事务管理系统 安卓 002 手机订餐系统 安卓 003 无线
  • 【Redis入门笔记 07】数据库持久化

    目录 持久化是个啥 持久化策略 RDB 持久化策略 AOF 持久化是个啥 我们都知道电脑中的内存一般指的是 DRAM 属于易失性存储器 里面的电容是会漏电的 需要通电来定期刷新 当断电以后内存中的数据会慢慢消失 以速度著称的 redis 就
  • 宋浩概率论与数理统计-第三章-笔记

    概率论与数理统计 第三章 3 1 1 二维随机变量及其分布函数 联合分布 边缘分布 3 1 2 二维离散型的联合分布和边缘分布 3 1 3 二维连续型的联合分布和边缘分布 联合分布 边缘分布 3 2 1 条件分布 3 2 2 离散型的条件分
  • 创建qml自定义视频源(Qt6.3.1+取景器帧)

    前言 笔者之前记录的是Qt5 15的 当前Qt6系列无法使用 笔者本次记录下Qt6中 如何创建qml自定义视频源 一 获取视频帧 这个笔者在之前的文档中记录过 本次算是重复了 1 通过videoSink获取 关键代码如下 Camera id
  • 2、kettle知识点系列之kettle向redis同步数据

    kettle向redis同步数据 网上kettle向redis同步数据的完整案例不是很多 本文将以案例形式对整个过程进行详细讲解 一 案例描述 本文以最简单的案例描述 大家在应用过程中可根据实际情况进行调整 现有学生表和成绩表 如何将表中的