【Redis】持久化与事务
文章目录
- 1. 持久化
- 1.1 RDB(定期)
- 1.1.1 触发方式
- 1.1.2 触发流程
- 1.2. AOF(实时)
- 1.2.1 设置AOF
- 1.2.2 刷新策略
- 1.2.3 重写机制
- 2. 事务
- 2.1 redis事务概念
- 2.2 事务操作

Mysql有几个特性:
- 原子性
- 一致性
- 隔离性,redis是串行的,自带隔离性
- 持久性,redis的持久化跟这个是一回事
1. 持久化
所以,要想办法将redis保存在内存上的的数据存在磁盘上;但是直接将数据存到磁盘上,是不是违反了redis快的特性了呢? - - 是的
为了达到快、持久的特性,redis会在内存、磁盘上均存储数据,并且两份数据理论上应该相同;将数据从内存写入到硬盘有不同的策略。
代价:消耗了更多的空间
Redis ⽀持RDB
(redis database)和AOF
(append only file)两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题,当下次重启时利⽤之前持久化的⽂件即可实现数据恢复,当查询数据时,依旧是从内存中查找
1.1 RDB(定期)
1.1.1 触发方式
RDB策略定期的将redis内存中的数据,形成一个“快照”,写入到硬盘中。
- 手动触发
- save:会阻塞其它redis命令,不建议使用
- bgsave:后台运行(fork),子进程进行生成快照,写文件的工作
- 自动触发
配置文件中设置,修改配置文件后,一般需要重启服务器
两个条件都满足,才执行
其中,save ""
是关闭自动生成
1.1.2 触发流程
手动触发的执行流程:
RDB文件的位置:
保存:RDB⽂件保存再dir配置指定的⽬录(默认/var/lib/redis/)下,⽂件名通过dbfilename配置(默认dump.rdb)指定。
可以通过执⾏config setdir {newDir}
和config setdbfilename {newFilename}
运⾏期间动态执⾏,当下次运⾏时RDB⽂件会保存到新⽬录。
至始至终,RDB文件只有一个
压缩:Redis默认采⽤LZF算法对⽣成的RDB⽂件做压缩处理,压缩后的⽂件远远⼩于内存大小,默认开启,可以通过参数config set rdbcompression{yes|no}
动态修改。
校验:如果Redis启动时加载到损坏的RDB⽂件会拒绝启动。这时可以使⽤Redis提供的redis-check-dump
⼯具检测RDB⽂件并获取对应的错误报告。
测试一下:
redis生成快照时,不仅仅是手动触发,也可以自动触发
- 配置文件中设置触发条件
- redis服务器正常关闭时,会触发
- 执行主从复制时,主节点也会自动生成rdb快照,然后把rdb快照文件内容传输给从节点(后面讲)
若异常退出(kill - 9 、断电),不会保存
bgsave 操作流程是创建子进程,子进程完成持久化操作,持久化速度太快了(数据少),难以观察到子进程.
持久化会把数据写入到新的文件中,然后使用新的文件替换旧的文件,这个是容易观察到的;可以使用 linux 的 stat 命令,査看文件的 inode 编号
如果直接使用 save 命令,此时是不会触发子进程 & 文件替换逻辑;save 就直接在当前进程中,往同一个文件中写入数据了
RDB的优缺点
- RDB是⼀个紧凑压缩的⼆进制⽂件,代表Redis在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。
- ⽐如每6⼩时执⾏bgsave备份,并把RDB⽂件复制到远程机器或者⽂件系统中(如hdfs)⽤于灾备。
- Redis加载RDB恢复数据远远快于AOF的⽅式
- 因为其是使用二进制方式组织数据的
- RDB⽅式数据没办法做到实时持久化/秒级持久化。
- 因为bgsave每次运⾏都要执⾏fork创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。
- RDB⽂件使⽤特定⼆进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有⻛险。
1.2. AOF(实时)
1.2.1 设置AOF
AOF持久化:以独⽴⽇志的⽅式记录每次写命令,重启时再重新执⾏AOF⽂件中的命令达到恢复数据的⽬的。
AOF的主要作⽤是解决了数据持久化的实时性,⽬前已经是Redis 持久化的主流⽅式。
当开启aof的时候,就会读取aof这个文件的内容,用来恢复数据(此时rdb就不生效了)
- 开启AOF功能需要设置配置:
appendonly yes
,默认不开启。- AOF⽂件名通过appendfilename 配置(默认是appendonly.aof)设置。保存⽬录同RDB持久化⽅式⼀致,通过dir配置指定。
- AOF的⼯作流程操作:命令写⼊(append)、⽂件同步(sync)、⽂件重写(rewrite)、重启加载(load)
appendonly开启后,自动保存
AOF是一个文本文件,redis的每一次操作,都会被记录到文件中
1.2.2 刷新策略
引入AOF后,redis既要写内存,又要写磁盘,它的速度会不会受影响呢? - - 并没有
- 所有的写⼊命令会追加到aof_buf(缓冲区)中。
- AOF缓冲区根据对应的策略向硬盘做同步操作。
- 随着AOF⽂件越来越⼤,需要定期对AOF⽂件进⾏重写,达到压缩的⽬的。
- 当Redis服务器启动时,可以加载AOF⽂件进⾏数据恢复
AOF过程中为什么需要aof_buf
这个缓冲区?Redis使⽤单线程响应命令,如果每次写AOF⽂件都直接同步硬盘,性能从内存的读写变成IO读写,必然会下降。先写⼊缓冲区可以有效减少IO次数,同时,Redis还可以提供多种缓冲区同步策略,让⽤⼾根据⾃⼰的需求做出合理的平衡。
redis给出了一些缓冲区刷新的策略,根据不同的场景供我们选择
1.2.3 重写机制
随着命令不断写⼊AOF,⽂件会越来越⼤,为了解决这个问题,Redis引⼊AOF重写机制压缩⽂件体积。
AOF⽂件重写是把Redis进程内的数据转化为写命令同步到新的AOF⽂件(剔除、合并一些操作,从而达到“瘦身的目的”)
重写后的AOF为什么可以变⼩?有如下原因:
- 进程内已超时的数据不再写⼊⽂件。
- 旧的AOF中的⽆效命令,例如del、hdel、srem等重写后将会删除,只需要保留内存中数据的最终版本
- 多条写操作合并为⼀条,例如
lpush key a、lpush key b、lpush key c
从可以合并为lpush key a b c
。- 较⼩的AOF⽂件⼀⽅⾯降低了硬盘空间占⽤,⼀⽅⾯可以提升启动Redis时数据恢复的速度
AOF重写过程可以手动触发和⾃动触发:
- 手动触发:调⽤
bgrewriteaof
命令。 - 自动触发:根据
auto-aof-rewrite-min-size
和auto-aof-rewrite-percentage
参数确定⾃动触发时机。- auto-aof-rewrite-min-size:表⽰触发重写时AOF的最小文件大小,默认为64MB。
- auto-aof-rewrite-percentage:代表当前AOF占用大小相⽐较上次重写时增加的⽐例
AOF重写流程
如果当前进程正在执⾏AOF重写,请求不执⾏;如果当前进程正在执⾏bgsave操作,重写命令延迟到bgsave完成之后再执⾏。
子进程只需要把内存中当前的数据获取出来,以 AOF 的格式写入到一个新的 AOF 文件中
(内存中的数据的状态,就已经相当于是把 AOF 文件结果整理后的模样了)
此处子进程写数据的过程,非常类似于 RDB 生成一个镜像快照
- 只不过 RDB 这里是按照二进制的方式来生成的,
- AOF 重写,则是按照 AOF 这里要求的文本格式来生成的,
- 二者都是为了把当前内存中的所有数据状态记录到文件中!!
启动时数据恢复
当Redis启动时,会根据RDB和AOF⽂件的内容,进⾏数据恢复
混合持久化模式:按照aof的方式,每一个请求/操作,都记录到文件中;在触发aof重写后,就会把当前的内存状态按照rdb二进制的格式写入到新的aof文件中,后续在进行操作,仍然是按照aof文本的方式追加在后面。
RDB与AOF的对比:
- RDB视为内存的快照,产⽣的内容更为紧凑,占⽤空间较小,恢复时速度更快。但产⽣RDB的开销较⼤,不适合进⾏实时持久化,⼀般⽤于冷备和主从复制。
- AOF视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩AOF⽂件。
- RDB和AOF都使⽤fork创建⼦进程,利⽤Linux⼦进程拥有⽗进程内存快照的特点进⾏持久化,尽可能不影响主进程继续处理后续命令。
可能出现的面试题:
- redis为什么持久化?有哪些方式?
- RDB与AOF的区别,各自有什么优势?
- RDB文件的生成流程,以及AOF重写的流程
2. 事务
2.1 redis事务概念
Redis的事务和MySQL事务的区别:
- 弱化的原⼦性:redis没有"回滚机制",只能做到这些操作"批量执行",不能做到"⼀个失败就恢复到初始状态"
- 不保证⼀致性:不涉及"约束",也没有回滚。
- MySQL的⼀致性体现的是运⾏事务前和运⾏后,结果都是合理有效的,不会出现中间⾮法状态
- 不需要隔离性:也没有隔离级别,因为不会并发执⾏事务(redis单线程处理请求).
- 不需要持久性:redis是保存在内存的,是否开启持久化,是redis-server⾃⼰的事情,和事务⽆关
Redis 事务本质上是在服务器上搞了⼀个"事务队列",每次客⼾端在事务中进⾏⼀个操作,都会把命令先发给服务器,放到"事务队列"中,但是并不会⽴即执⾏,⽽是会在真正收到EXEC命令之后才真正执⾏队列中的所有操作。
因此,Redis的事务的功能相⽐于MySQL来说,是弱化很多的,只能保证事务中的这⼏个操作是"连续的",不会被别的客⼾端"加塞",仅此⽽已。
redis为什么不像mysql一样呢? - - 所需空间、时间的代价太大
2.2 事务操作
MULTI
开启⼀个事务,执⾏成功返回OK
EXEC
真正执⾏事务
DISCARD
放弃当前事务,此时直接清空事务队列,之前的操作都不会真正执⾏到
当开启事务,并发送多个命令后,此时服务区器重启了,此时的效果就等同于discard.
WATCH
在执⾏事务的时候,如果某个事务中修改的值,被别的客⼾端修改了,此时就容易出现数据不⼀致的问题
# 客⼾端1 先执⾏
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key 100
QUEUED# 客⼾端2 再执⾏
127.0.0.1:6379> set key 200
OK# 客⼾端1 最后执⾏
127.0.0.1:6379> EXECOK
此时,key的值是多少呢??
从输⼊命令的时间看,是客⼾端1先执⾏的setkey100,客⼾端2后执⾏的setkey200,但是从实际的执⾏时间看,是客⼾端2先执⾏的,客⼾端1后执⾏的
127.0.0.1:6379> get key
"100"
这个时候就容易引起歧义,因此,即使不保证严格的隔离性,⾄少也要告诉⽤⼾,当前的操作可能存在⻛险, watch命令就是⽤来解决这个问题的,watch在该客⼾端上监控⼀组具体的key
- 当开启事务的时候,如果对watch的key进⾏修改,就会记录当前key的"版本号".(版本号是个简单的整数,每次修改都会使版本变⼤,服务器来维护每个key的版本号情况)
- 在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开始时的版本号,就会让事务执⾏失败。(事务中的所有操作都不执⾏).
客户端1先执行
127.0.0.1:6379> watch k1 # 开始监控k1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 100 #进⾏修改,从服务器获取k1的版本号是0.记录k1的版本号.(还没真修改呢, 版本号不变)
QUEUED
127.0.0.1:6379> set k2 1000
QUEUED
客⼾端2再执行
127.0.0.1:6379> set k1 200 # 修改成功, 使服务器端的k1 的版本号 0 -> 1
OK
客⼾端1再执行
127.0.0.1:6379> EXEC
# 真正执⾏修改操作, 此时对⽐版本发现, 客⼾端的 k1 的版本号是 0,
#服务器上的版本号是 1, 版本不⼀致! 说明有其他客⼾端在事务中间修改了 k1 !!!
(nil)
127.0.0.1:6379> get k1
"200"
127.0.0.1:6379> get k2
(nil)
此时说明事务已经被取消了,这次提交的所有命令都没有执行。
UNWATCH
取消对key的监控.
相关文章:
【Redis】持久化与事务
文章目录 1. 持久化1.1 RDB(定期)1.1.1 触发方式1.1.2 触发流程 1.2. AOF(实时)1.2.1 设置AOF1.2.2 刷新策略1.2.3 重写机制 2. 事务2.1 redis事务概念2.2 事务操作 Mysql有几个特性: 原子性一致性隔离性,redis是串行的,自带隔离性持久性&…...
Web 自动化之 HTML JavaScript 详解
文章目录 一、HTML 常用标签二、javascript 脚本1、什么是 javascript(js)2、 js变量和函数3、js 弹窗处理4、js 流程控制语句和 switch 结构语句应用 一、HTML 常用标签 HTML:超文本标记语言 超文本:不仅只包含文字,还有超链接、视频…这些…...
【JavaScript】二十九、垃圾回收 + 闭包 + 变量提升
文章目录 1、作用域1.1 局部作用域1.2 全局作用域1.3 作用域链 2、JC垃圾回收机制♻️3、GC算法3.1 引用计数法3.2 标记清除法 4、闭包4.1 定义4.2 闭包的应用:实现数据的私有 5、变量提升 1、作用域 即一个范围,离开了这个范围,这个变量就不…...
Python在自动驾驶实时数据处理中的应用:让AI驾驶更智能、更高效
Python在自动驾驶实时数据处理中的应用:让AI驾驶更智能、更高效 近年来,自动驾驶技术的飞速发展离不开人工智能和数据处理的支撑,而Python作为AI与数据分析的核心编程语言,在自动驾驶实时数据处理方面扮演着不可或缺的角色。从传感器数据解析,到路径规划与决策优化,再到…...
功能安全的关键——MCU锁步核技术全解析(含真实应用方案)
随着智能汽车的发展,整车对功能安全的要求越来越高。特别是像电动助力转向(EPS)、制动控制系统、气囊控制器这类对“出错零容忍”的系统,已经广泛采用一种重要的安全架构——锁步核(Lockstep Core)。 今天我…...
Java实现桶排序算法
1. 桶排序原理图解 桶排序是一种基于分桶思想的非比较排序算法,适用于数据分布较为均匀的场景。其核心思想是将数据分散到有限数量的“桶”中,每个桶再分别进行排序(通常使用插入排序或其他简单的排序算法)。以下是桶排序的步骤&a…...
剖析 FFmpeg:从基本功能到过滤器,实现音视频处理的灵活性
目录 1.解复用2 解码2.1 音频解码2.2 视频解码 3 修饰3.1 avio3.2 重采样 4 过滤器4.1 过滤器基本知识4.2 简单过滤器4.3 复杂滤镜图 1.解复用 解复用就是把容器中的媒体流分离出来,方便我们对媒体流处理。 step1:对媒体文件上下文初始化 AVFormatCont…...
maven如何搭建自己的私服(LINUX版)?
环境准备 安装 JDK :确保系统已安装 JDK 8 或更高版本。可以通过以下命令安装 JDK: 安装 OpenJDK :sudo apt update && sudo apt install openjdk-11-jdk 安装 Oracle JDK :需要添加第三方仓库,例如 WebUpd8 …...
机器视觉的手机FPC油墨丝印应用
在现代智能手机制造过程中,精密的组件装配和质量控制是确保产品性能和用户体验的关键。其中,柔性印刷电路板(FPC)的油墨丝印工艺尤为关键,它不仅影响到电路板的美观,更直接关系到电路的导电性能和可靠性。而…...
AI原生手机:三大技术阵营的终极对决与未来展望
引言:AI手机时代的真正到来 2024年,智能手机行业迎来了一个历史性转折点——AI原生手机从概念走向主流。根据IDC最新报告,中国AI手机出货量同比激增591%,渗透率从2023年的3%飙升至22%。这一数据背后,是手机厂商在硬件…...
CFCA受邀参加盛京银行手机银行7.0发布会
4月30日,盛京银行举办手机银行7.0发布会。 盛京银行手机银行7.0围绕“慧享生活,财富随行”主题,聚焦便捷体验、财富管理、惠民生活,构建12大类服务,升级142项功能,全新设置信用卡频道,推出“云…...
IT/OT 融合架构下的工业控制系统安全攻防实战研究
1. 引言 随着工业 4.0 和智能制造的浪潮席卷全球,信息技术 (IT) 与运营技术 (OT) 的融合已成为不可逆转的趋势。这种融合旨在通过实时数据交换和分析,打破传统的信息孤岛,显著提升生产效率、优化决策、降低运营成本并增强市场竞争力。IT 系统…...
AI优化高频PCB信号完整性:猎板PCB的技术突破与应用实践
随着5G通信、AI服务器及新能源汽车的快速发展,高频PCB的信号完整性已成为决定电子产品性能的关键。本文以猎板PCB的技术实践为例,解析如何通过AI算法与精密制造工艺的结合,实现高频信号传输的极致优化,为行业提供高可靠性的解决方…...
【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理
本文深入剖析Bluedroid蓝牙协议栈中 SDP(服务发现协议)服务记录的全生命周期管理流程,涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构,揭示各模块间的协作机制,包括线程安全设计、回…...
obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
不会立即回收。 具体原因是: 赋值 obj null; 后,对象变成“不可达”,符合垃圾回收条件,但垃圾回收器并不会立刻回收它。垃圾回收是CLR自动控制的非确定性过程,什么时候执行回收取决于系统内存压力、GC策略、分代情况…...
Android 数据持久化之 文件存储
在 Android 开发中,存储文件是一个常见的需求。 本文中介绍 openFileOutput 和 File 两种不同的方式来操作文件。 一、File 方式 根据文件的存储位置和访问权限,可以将文件存储分为内部存储(Internal Storage)和外部存储&#x…...
差分OPA verilogaA 模型
做电路设计,需要提前用理想模型如VerilogA模型做验证。这里分享一个由ahdlib库里单端opamp改造而来的差分opamp。参考何乐年的《模拟集成电路设计与仿真》10.4节423页; 描述的小信号模型如上。 VerilogA 用到了SRI/C,GBWgm/C,gaingm*r1等概念…...
oracle goldengate非并行进程转换为并行进程
oracle goldengate非并行进程转换为并行进程 在上一期的文章中写道了直接创建并行进程的方式对大事务进行分解,这对于新建立同步进程的时候提前规划是很有帮助的,但是如果对已经进行了同步的进程重新建立需要耗时比较长,Oracle提供了非并行进…...
58.[前端开发-前端工程化]Day05-webpack-Git安装-配置-Git命令
Git版本控制工具详解 1 邂逅版本控制工具 认识版本控制(版本控制) 版本控制的功能 版本控制的历史 2 集中式和分布式区别 集中式版本控制 分布式版本控制 3 Git的环境安装搭建 Git的安装 Bash – CMD – GUI 区别 Git的配置分类 Git的配置选项 Git的…...
CF每日5题
每日刷题两小时颐养天年 1855A 800 思维 将不高兴的同学计数cnt 不高兴的同学之间两两交换,一定不会在 p i i p_ii pii的位置上,贡献是cnt/2 如果cnt%2>0,那就多交换一次 void solve() {int n;cin>>n;int cnt0;forr(i,1,n){in…...
Redis实现分布式获取全局唯一自增ID的案例。
【1】简易自增版本(从 1 开始 1,2,3,...) 项目结构 下面是一个基于 RedisTemplate 实现的分布式全局唯一自增 ID 生成器的案例。适用于 Java Spring Boot 环境,利用 Redis 的原子操作 INCR 指令。 ✅ 原理说明 Redis 提供的 INCR 命令是原子性的&…...
创建型模式:工厂方法(Factory Method)模式
一、简介 工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。在 C# 中,工厂方法模式提供了一种更灵活的对象创建方式,将对象的创建和使用分离,提高了代码的可维护性和…...
大型语言模型在网络安全领域的应用综述
大型语言模型在网络安全领域的应用综述 简介1. 引言1.1 背景与意义1.2 LLMs 的基本概念1.3 LLMs 在网络安全中的优势1.4 报告目标 2. 文献综述方法2.1 研究问题2.2 文献检索策略2.3 文献筛选标准 3. LLMs 在网络安全领域的应用3.1 软件和系统安全 (Software and System Securit…...
TDEngine 与 Grafana
目录 实践目录 Grafana 参考文档 实践目录 10.60.100.194:/home/dualven/tdengine Grafana systemctl status grafana-server http://10.60.100.194:3000/ 这个端口与mydoor的new server服务冲突 (同时只开一个) 参考文档 运行监…...
iPhone手机连接WiFi异常解决方法
iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…...
微服务不注册到nacos的方法
引言:在开发中,有时候多个开发一起开发,可能会同时注册到dev环境中,这样可能会影响dev环境,那么在idea添加2个参数即可解决 spring.cloud.nacos.discovery.register-enabled falsespring.cloud.nacos.discovery.enabled false...
Spring Boot + Vue 实现在线视频教育平台
一、项目技术选型 前端技术: HTML CSS JavaScript Vue.js 前端框架 后端技术: Spring Boot 轻量级后端框架 MyBatis 持久层框架 数据库: MySQL 5.x / 8.0 开发环境: IDE:Eclipse / IntelliJ IDEA JDK&…...
【嵌入式开发-SPI】
嵌入式开发-SPI ■ SPI简介■ SPI (Standard SPI)■ DSPI (Dual SPI)■ QSPI是 Queued SPI的简写 ■ SPI简介 SPI协议其实是包括:Standard SPI、Dual SPI和Queued SPI三种协议接口,分别对应3-wire, 4-wire…...
【链表扫盲】FROM GPT
链表是一种线性数据结构,由节点(Node)组成,每个节点包含两个部分: 数据域(data): 存储节点值。指针域(next): 存储指向下一个节点的引用。 链表…...
如何在macOS上通过SSHFS挂载远程文件系统
在macOS系统中,想要便捷地访问远程计算机上的目录?借助SSH文件系统(SSHFS)就能轻松实现。SSHFS是一款文件系统客户端,它基于SSH文件传输协议(SFTP)建立安全连接,进而实现对远程文件的…...
Android studio profiler使用
主要讲内存泄露排查 1、把怀疑内存泄露的页面都跑一边,然后回到初始页面 2、打开profile的home,找到Analysis Memory Usage,点击右下角start profiler task,开始分析内存,等待分析完成,分析过程中页面是卡…...
排序算法-选择排序
选择排序是一种简单直观的排序算法,其核心思想是每次从未排序的部分中选出最小(或最大)的元素,放到已排序部分的末尾。 选择排序步骤 初始化:将序列分为已排序部分(初始为空)和未排序部分&…...
云计算的基础概论
一、云计算基础概念 1. 云计算定义 • 英文:Cloud Computing • 定义:通过互联网(Internet)按需提供可扩展的计算资源(如服务器、存储、数据库、网络、软件等),用户无需管理底层基础设施。 …...
仿LISP运算 - 华为OD机试真题(A卷、JavaScript题解)
华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难,效率慢,我们提供一对一算法辅导, 针对个人情况定制化的提高计划(全称1V1效率更高)。 看…...
数据透视表控件DHTMLX Pivot v2.1发布,新增HTML 模板、增强样式等多个功能
DHTMLX Pivot数据透视表能快速地对数据进行计数、总计、平均和执行许多其他操作。近日,DHTMLX Pivot发布了2.1版本,该版本扩展了开发人员通过新增的 CSS 样式选项、HTML 模板以及数字和日期的自定义格式修改表格外观的能力。此外,该版本还增加…...
简易的考试系统设计(Web实验)
简易的考试系统设计(Web实验) 1.实验内容与设计思想(一)实验需求(二)设计思路 2.代码展示3.实验小结 1.实验内容与设计思想 (一)实验需求 1.编写两个页面程序,一个HTML…...
C++之set和map的运用
目录 序列式容器和关联式容器 熟识set 在STL中的底层结构: set的构造和迭代器 set的增删查 multiset和set的差异 练习题: 熟识map map类的介绍 pair类型介绍 map的构造 map的增删查 map的数据修改 测试样例: multimap和map的差…...
基于智能家居项目 RGB彩灯(P9813)
一、P9813 是什么? P9813 是一颗专门用来控制 RGB LED灯珠 的芯片,也就是说,它能控制红色、绿色、蓝色三种灯光的亮度,从而调出各种颜色。它最常见的用途就是在各种“会变色”的灯带中。 它的通信方式非常简单,只需要…...
EMQX 作为 MQTT Broker,支持 MQTT over TCP 和 MQTT over WebSocket 两种协议
1. EMQX 支持的协议与端口 协议类型默认端口用途说明MQTT over TCP1883标准的 MQTT 协议,基于 TCP 传输(用于后端服务、物联网设备等)。MQTT over TLS8883加密的 MQTT over TCP(TLS/SSL 加密,安全性更高&am…...
软件测试学习笔记
第1章 绪论 软件测试 本质上说,就是寻找软件的缺陷、错误,对其质量度量的方法与过程。软件测试的一切活动都围绕着两个目标(验证是否符合需求,识别差异)而行进。它是测试思维、策略方针、设计实施的基本出发点。 学…...
Vue3 + Node.js 实现客服实时聊天系统(WebSocket + Socket.IO 详解)
Node.js 实现客服实时聊天系统(WebSocket Socket.IO 详解) 一、为什么选择 WebSocket? 想象一下淘宝客服的聊天窗口:你发消息,客服立刻就能看到并回复。这种即时通讯效果是如何实现的呢?我们使用 Vue3 作…...
python 上海新闻爬虫
1. 起因, 目的: 继续做新闻爬虫。我之前写过。此文先记录2个新闻来源。后面打算进行过滤,比如只选出某一个类型新闻。 2. 先看效果 过滤出某种类型的新闻,然后生成 html 页面,而且,自动打开这个页面。 比如科技犯罪…...
【Axure高保真原型】中继器表格批量上传数据
今天和大家分享中继器表格批量上传数据的原型模板,效果包括: 点击上传按钮,可以真实的打开本地文件夹选择文件; 选择的文件如果不是表格格式(xls、xlsx、xlt、csv),就会显示提示弹窗࿱…...
复刻低成本机械臂 SO-ARM100 单关节控制(附代码)
视频讲解: 复刻低成本机械臂 SO-ARM100 单关节控制(附代码) 代码仓库:GitHub - LitchiCheng/SO-ARM100: Some Test code on SO-ARM100 昨天用bambot的web的方式调试了整个机械臂,对于后面的仿真的sim2real来说&#x…...
视频编解码学习7之视频编码简介
视频编码技术发展历程与主流编码标准详解 视频编码技术是现代数字媒体领域的核心技术之一,它通过高效的压缩算法大幅减少了视频数据的体积,使得视频的存储、传输和播放变得更加高效和经济。从早期的H.261标准到最新的AV1和H.266/VVC,视频编码…...
【NextPilot日志移植】整体功能概要
整体日志系统的实现功能 该日志系统主要实现了飞行日志的记录功能,支持多种日志记录模式,可将日志存储到文件或通过 MAVLink 协议传输,同时具备日志加密、空间管理、事件记录等功能。具体如下: 日志记录模式:支持按武…...
Windows系统下使用Kafka和Zookeeper,Python运行kafka(二)
1.配置 Zookeeper 进入解压后的 Zookeeper 目录(例如 F:\zookeeper\conf),复制 zoo_sample.cfg 文件并命名为 zoo.cfg(如果 zoo.cfg 已经存在,则直接编辑该文件)。 打开 zoo.cfg 文件,配置相关…...
《构建社交应用用户激励引擎:React Native与Flutter实战解析》
React Native凭借其与JavaScript和React的紧密联系,为开发者提供了一个熟悉且灵活的开发环境。在构建用户等级体系时,它能够充分利用现有的前端开发知识和工具。通过将用户在社交应用中的各种行为进行量化,比如发布动态的数量、点赞评论的次数…...
Oracle OCP认证考试考点详解083系列13
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 61. 第61题: 题目 解析及答案: 关于基于RPM的Oracle数据库安装,以下哪两项是正确的? A) …...
【AI】DeepWiki 页面转换成 Markdown 保存 - Chrome 扩展
GitHub: https://github.com/zxmfke/deepwiki-md-chrome-extension 背景 个人比较喜欢整理项目架构,更多都是保存成 markdown 的格式保存,然后发博客。deepwiki 刚好把 github 仓库代码的架构输出出来了,不过没有办法下载成 markdown 格式&…...