Redis中的持久化
什么是 Redis 持久化?
Redis 是一个内存数据库,也就是说它主要把数据存储在内存中,这样可以实现非常高的读写速度。通常,内存数据库是非常快速且高效的,但它也有一个很大的问题:数据丢失的风险。因为当 Redis 服务关闭或系统崩溃时,所有存储在内存中的数据都将丢失。
为了解决这个问题,Redis 提供了持久化机制,它可以将内存中的数据保存到磁盘中。通过持久化,Redis 能够在重启后重新加载数据,保证数据不丢失。
Redis 持久化的作用
持久化的主要作用是:保证数据安全性。虽然 Redis 的高性能依赖于内存,但持久化可以让你在高性能的同时,确保数据不会因为程序崩溃或重启而丢失。
Redis 持久化的两种方式
Redis 提供了两种持久化机制,分别是 RDB(快照)持久化和 AOF(追加文件)持久化。每种方式都有不同的特点,适用于不同的场景。
1. RDB 持久化(快照)
RDB 持久化通过创建数据快照的方式,将当前内存中的数据定期保存到磁盘上的 .rdb
文件中。每当满足指定的条件时(比如每隔一定时间,或者有一定数量的操作发生),Redis 就会自动生成一个快照文件并保存。
- 快照生成的时机:你可以通过配置文件来设置生成快照的条件,例如:
- 每 900 秒保存一次,如果有至少 1 个键被修改
- 每 300 秒保存一次,如果至少有 10 个键被修改
- 优势:生成快照的过程是异步的,不会对 Redis 的正常操作造成太大影响,性能较好。
- 缺点:如果在快照保存过程中 Redis 崩溃或重启,可能会丢失上次快照之后的数据。
2. AOF 持久化(追加文件)
AOF 持久化则通过记录 Redis 执行的每个写操作命令来实现持久化。每当 Redis 执行一个写操作(例如 SET
、DEL
等),AOF 会将该命令追加到一个 .aof
文件中。这样即使 Redis 重启时,AOF 文件中记录的命令会重新执行,恢复到原来的数据状态。
- 记录写操作:AOF 记录所有的写命令,可以通过它恢复到崩溃之前的状态。AOF 可以配置为每次操作都同步到磁盘,也可以设置为每秒同步一次。
- 优势:AOF 的持久化方式提供了更高的数据安全性,因为它记录了每个操作的详细信息。
- 缺点:AOF 文件随着时间增长,可能会变得非常大,而且写操作也会对性能有一定的影响。虽然可以通过 AOF 重写(重写 AOF 文件来优化文件大小和性能)来减小文件的大小,但它仍然会占用更多的磁盘空间。
3. 混合持久化(RDB + AOF)
为了结合 RDB 和 AOF 的优点,Redis 提供了混合持久化机制。这种方式会将数据保存为 RDB 快照,同时也记录写操作命令。这样既能够利用 RDB 的性能优势,又能通过 AOF 提供更高的数据安全性。
混合持久化会在生成 RDB 快照的同时,保留 AOF 操作记录,这样可以加速数据恢复,并且保证数据的完整性。
为什么需要 Redis 持久化?
- 性能与安全的平衡:如果仅依赖内存,虽然读写速度极快,但一旦服务崩溃,所有数据都会丢失。持久化将数据保存到磁盘,能保证数据在 Redis 重启后不丢失,提供了数据恢复的能力。
- 故障恢复:无论是由于系统崩溃、网络断开还是其他意外情况,持久化机制都可以帮助你快速恢复数据,避免数据丢失的风险。
- 数据备份:定期保存数据快照,能够在灾难发生时提供备份方案。尤其是对于一些重要的应用,保持数据备份非常关键。
总结
Redis 的持久化机制提供了在内存数据库中保存数据的方式。RDB 通过定期保存内存数据的快照来实现,而 AOF 则记录每一个写操作命令。根据应用场景和需求,用户可以选择不同的持久化策略,甚至可以结合两者来保证数据的安全性与性能。
持久化的设置需要根据业务的具体需求来决定,比如对数据丢失的容忍度、性能需求以及恢复时间等方面的考量。
AOF 日志
AOF 日志的基本原理
AOF 日志通过记录每一个写操作(如 SET
、DEL
等)来持久化 Redis 的数据。每当 Redis 执行一个写操作时,它会将该操作以 命令 的形式记录到 AOF 文件中。这样,在 Redis 重启时,可以通过重新执行这些命令来恢复数据。
AOF 的记录方式是将每个操作追加到一个 AOF 文件 中。这个文件的命名一般是 appendonly.aof
,并且会存储在 Redis 数据库目录下。
AOF 的实现步骤
-
每次写操作都会记录:
每当 Redis 执行一个写操作时,AOF 就会将这个操作追加到 AOF 文件的末尾。举个例子,当执行SET key value
时,Redis 会把这个操作转化为类似SET key value
的文本命令,并将其写入 AOF 文件中。 -
同步策略: Redis 允许你配置 AOF 的同步策略,即 AOF 文件写入磁盘的频率。同步策略的配置项是
appendfsync
,有三种不同的选项:- always:每次有写操作时,都会同步到磁盘。这种方式最为安全,但会影响性能。
- everysec:每秒钟同步一次。这个选项在性能和安全之间做了平衡,是 Redis 默认的配置。
- no:不主动进行同步操作,依赖操作系统的缓存来决定何时同步。性能最好,但会存在数据丢失的风险。
-
AOF 文件的增长: 随着时间的推移,AOF 文件会不断增长,因为它记录了每一个写操作的命令。对于长期运行的 Redis 服务来说,AOF 文件可能会变得非常大,这会影响磁盘空间并降低恢复速度。
-
AOF 重写(Rewrite): 为了避免 AOF 文件过于庞大,Redis 提供了 AOF 重写 机制。AOF 重写是一个后台操作,它会创建一个新的 AOF 文件,只记录恢复当前数据库状态所需要的最少命令。比如,如果 Redis 中有很多重复的
SET
命令,AOF 重写会把这些命令合并成一个单一的命令,从而减少文件的大小。AOF 重写的触发条件是:
- 当 AOF 文件的大小超过当前 Redis 内存占用的某个比例时(比如 AOF 文件的大小是内存占用的 100%)。
- 手动触发重写命令
BGREWRITEAOF
,它会启动一个后台进程来重写 AOF 文件。
AOF 重写是 增量式的,不会影响 Redis 的正常操作,也不会丢失数据。重写过程只会将老的 AOF 文件和新写的命令合并成一个更小、更高效的文件。
-
恢复数据: 当 Redis 启动时,会加载 AOF 文件中的所有写操作命令并依次执行,直到数据库恢复到崩溃或关闭前的状态。这个恢复过程需要读取并执行 AOF 文件中的每一条记录,确保数据一致性。
恢复时,AOF 文件中的命令会被按顺序执行,Redis 通过这个过程重新构建内存中的数据。由于 Redis 是按顺序执行 AOF 中的每条命令的,所以它在恢复时会非常精确。
AOF 日志的优势与劣势
优势:
- 更高的数据安全性:由于 AOF 记录了每个写操作,它能够在 Redis 崩溃或重启后准确地恢复数据。即使发生异常中断,AOF 的数据丢失概率非常低。
- 支持持久化每一个操作:与 RDB 快照不同,AOF 持久化可以记录下所有的写操作,并且可以配置为不同的同步策略,允许用户根据需求平衡性能和数据安全。
劣势:
- AOF 文件会增大:随着时间的推移,AOF 文件会越来越大,因为每个写操作都会被记录下来,尤其是写操作频繁的情况。虽然可以通过 AOF 重写来减小文件大小,但它仍然会占用较多磁盘空间。
- 性能开销:AOF 的性能开销比 RDB 大,因为每一个写操作都需要记录到 AOF 文件。尤其是在
appendfsync
设置为always
或everysec
时,会对磁盘 I/O 性能产生一定影响。
RDB快照
什么是 RDB?
RDB 是 Redis 提供的另一种持久化方式,它通过定期对 Redis 的数据集进行快照(snapshot)保存,以便在 Redis 重启后恢复数据。RDB 的基本理念就是保存整个数据库的状态,它不会记录每一次操作,而是以某个时间点为快照,保存 Redis 当前所有数据的副本。
RDB 的实现原理
RDB 的工作原理非常简单:它通过在 Redis 服务器中生成一个内存快照,并将其保存为一个二进制文件。当 Redis 重启时,RDB 文件中的数据就会被加载到内存中,从而恢复数据。
RDB 快照的生成过程:
-
触发条件:RDB 快照是根据 配置的条件 来触发的,而不是每次写操作都保存。默认情况下,Redis 会根据设置的规则定期生成快照,或者在特定的情况下(如手动命令或故障恢复时)触发快照。
-
手动触发:你可以通过命令
SAVE
或BGSAVE
手动触发快照。SAVE
:会阻塞 Redis 进程,直到快照操作完成(这是同步操作)。BGSAVE
:会在后台生成快照,不会阻塞 Redis 进程(这是异步操作)。BGSAVE
是常用的方式,通常会用它来进行 RDB 保存。
-
内存数据到磁盘:当 Redis 执行快照时,它会将当前所有数据从内存复制到磁盘中。这个过程会创建一个 RDB 文件(通常是
dump.rdb
)。这个文件是二进制格式的,可以快速读取和恢复数据。
RDB 快照的实现步骤:
-
创建子进程: 当 Redis 执行
BGSAVE
命令时,Redis 会创建一个新的子进程。父进程会继续处理客户端请求,而子进程会开始生成快照。 -
写入 RDB 文件: 子进程通过将当前内存中的数据(包括键、值以及键的过期时间等信息)写入磁盘,生成一个 RDB 文件。这个过程是通过 fork 系统调用实现的,子进程会复制父进程的内存,并且只将变动的部分写入磁盘。
-
压缩存储: 在写入 RDB 文件时,Redis 会对数据进行一些压缩和优化,减少磁盘空间的使用。这些操作包括:
- 压缩过期键:过期的键在 RDB 文件中不会被写入。
- 数据存储格式:Redis 会使用一种高效的格式来存储数据,比如 Redis 字符串、哈希表、集合等数据结构会有不同的存储方式。
-
完成后替换文件: 当子进程完成数据写入时,它会将生成的
dump.rdb
文件替换掉原有的文件。这样,新的 RDB 文件就成为 Redis 的持久化文件。
RDB 的持久化过程
在 Redis 的启动过程中,RDB 文件用于恢复数据。Redis 会检查 dump.rdb
文件是否存在,若存在,它会加载该文件中的数据,并将数据恢复到内存中。
触发 RDB 快照的条件
RDB 快照并不会每次操作都保存,而是按照配置文件中的条件定期触发。你可以通过 redis.conf
配置文件中的 save
参数设置 RDB 快照的触发条件。
save
参数的格式如下:
save <seconds> <changes>
表示 在 seconds
秒内 如果有超过 changes
次的写操作,则生成一次 RDB 快照。
默认配置:
save 900 1 # 如果 900 秒(15 分钟)内有 1 次写操作,触发 RDB 快照
save 300 10 # 如果 300 秒(5 分钟)内有 10 次写操作,触发 RDB 快照
save 60 10000 # 如果 60 秒内有 10000 次写操作,触发 RDB 快照
这些条件可以根据需求修改,如果没有满足这些条件,Redis 不会主动执行 RDB 持久化。
RDB 快照的优势
- 性能高:RDB 快照是一次性保存数据库的整个状态,通常比较快速。生成 RDB 文件时 Redis 会创建子进程,父进程不会被阻塞,因此对主进程的性能影响较小。
- 恢复速度快:RDB 文件是一个二进制格式的文件,Redis 在启动时加载 RDB 文件并恢复数据的速度非常快,适合需要快速恢复的场景。
- 磁盘空间节省:相较于 AOF,RDB 文件通常更小,因为它只保存快照,不记录每个操作的历史数据。
RDB 快照的劣势
- 数据丢失风险较高:如果 Redis 在快照执行前崩溃,所有未持久化的数据都可能会丢失。特别是
save
配置的时间窗口较长时,可能会丢失大量数据。 - 持久化不及时:如果使用默认的 RDB 配置,Redis 的快照不是实时进行的,因此可能会出现短时间内多次操作未被持久化的情况。
- 性能开销:虽然 Redis 会通过
BGSAVE
在后台生成快照,但仍然会对系统造成一定的性能开销,尤其是在数据量很大的情况下。
配置 RDB 持久化
可以通过以下几种方式配置 Redis 的 RDB 持久化行为:
save
配置:通过save
参数配置快照的触发条件(已介绍)。dbfilename
配置:指定生成的 RDB 文件的名称。默认为dump.rdb
。dir
配置:指定生成 RDB 文件的存储目录。
例如:
save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir /var/lib/redis
总结
RDB 是 Redis 提供的另一种持久化机制,它通过定期生成数据快照来保存 Redis 的状态。RDB 快照不会每次写操作都保存,而是根据配置的条件定期生成。当 Redis 重启时,通过加载 RDB 文件可以快速恢复数据。与 AOF 相比,RDB 的性能更好,但它可能会丢失某些数据,因此在数据安全要求非常高的场景下,通常建议结合使用 AOF 和 RDB。
RDB 与 AOF 的比较
- 数据安全性:AOF 提供了更高的数据安全性,因为它记录每个写操作。而 RDB 只会保存某个时刻的快照,若 Redis 在快照前崩溃,可能会丢失很多数据。
- 性能:RDB 适用于需要高性能和快速恢复的场景。它通过生成内存快照来保存数据,而 AOF 每次都需要记录命令,因此 RDB 在性能上通常优于 AOF。
- 文件大小:RDB 文件通常比 AOF 文件小,因为它只是保存数据库的快照,而 AOF 会记录每个操作,文件会不断增大。
混合持久化
混合持久化(Hybrid Persistence)是 Redis 为了弥补 RDB 和 AOF 在各自使用场景中的不足,推出的一种新的持久化机制,旨在结合 RDB 和 AOF 的优点,优化持久化操作的性能和数据安全性。
为什么需要混合持久化?
-
RDB 快照的丢失风险:RDB 在生成快照时,如果 Redis 在快照完成前崩溃,那么这段时间内的数据就会丢失。尤其是在配置了较长的时间窗口(例如 15 分钟内进行一次快照)时,丢失的数据可能相对较多。
-
AOF 的性能开销:AOF 会记录每一个写操作(即每个命令),这样它可以提供较高的数据安全性。但由于 Redis 每次操作都需要写入 AOF 文件,这会带来较大的性能开销,尤其是在数据写入频繁的场景下,AOF 文件会不断增大,增加磁盘负担。
-
快速恢复:RDB 文件由于其压缩格式,可以提供非常快速的恢复速度,而 AOF 文件虽然可以提供更高的数据安全性,但恢复速度相对较慢,因为 Redis 启动时需要逐条执行文件中的命令。
混合持久化的实现原理
混合持久化(在 Redis 4.0 版本中引入)结合了 RDB 和 AOF 的特点,试图在确保数据不丢失的同时提升性能,并加快恢复速度。它的基本理念是:
- 使用 RDB 快照进行全量持久化。
- 同时记录 AOF 操作日志来保证增量数据的持久化。
工作流程:
-
混合持久化的启动:
- 当 Redis 执行 RDB 快照时,它不仅会创建一个 RDB 文件,还会在快照中包含某些 最新的操作命令。这个 RDB 文件会保留 Redis 当前数据库的完整快照。
- 同时,Redis 会将 修改过的数据命令(AOF 操作)也记录到一个 AOF 文件中。
-
保存的数据格式:
- 在混合持久化模式下,RDB 文件的格式稍有不同,它不仅仅是保存 Redis 的内存快照,还会将 自上次快照后执行的写操作(例如
SET
、HSET
、LPUSH
等)一并保存,这些操作会被记录在 RDB 文件的 特殊区域 中。 - AOF 文件则不再记录每次操作,而是仅记录那些 Redis 自上次生成快照之后的命令。
- 在混合持久化模式下,RDB 文件的格式稍有不同,它不仅仅是保存 Redis 的内存快照,还会将 自上次快照后执行的写操作(例如
-
恢复过程:
- 当 Redis 重启时,它首先加载 RDB 文件,这一步会快速恢复数据。
- 然后,Redis 会从 AOF 文件(或 RDB 文件中的特殊区域)中读取自上次快照以来的增量操作,并恢复这些操作。这样即使在 Redis 崩溃后,丢失的数据会大大减少。
混合持久化的优点
-
提升恢复速度:恢复过程首先从 RDB 文件中加载数据,保证了启动速度非常快,而恢复增量数据时仅需要读取 AOF 中最新的部分,避免了 AOF 文件重放的性能问题。
-
降低 AOF 文件的大小:传统的 AOF 文件会记录每一条命令,即便是同一个键值进行重复操作时,AOF 文件也会记录每一条命令。混合持久化则只会记录最新的增量操作,因此 AOF 文件的大小会更小。
-
减少数据丢失:使用混合持久化时,Redis 不仅依赖 RDB 快照,还结合了 AOF 增量数据,这样即使 Redis 在保存快照之前崩溃,丢失的数据也会比仅使用 RDB 时要少。
混合持久化的配置与使用
在 Redis 配置中,可以通过设置 aof-use-rdb-preamble
来启用混合持久化。默认情况下,这个选项是启用的,这意味着在执行 RDB 快照时,Redis 会生成一个包含 AOF 增量命令的混合快照。
配置项:
aof-use-rdb-preamble yes
这个配置会使 Redis 在执行 RDB 持久化时,同时记录操作命令到 AOF 文件,从而实现混合持久化。如果你不希望使用混合持久化,可以通过将其设置为 no
来禁用。
混合持久化的缺点
尽管混合持久化能带来性能上的提升,但它也存在一些潜在的劣势:
- 更多的资源消耗:混合持久化需要同时处理 RDB 和 AOF 两种持久化方式,因此在磁盘使用和内存占用方面会比单一的持久化方式更高。
- 数据恢复过程较为复杂:尽管恢复速度比 AOF 快,但在崩溃恢复时需要同时处理 RDB 和 AOF 文件,这在某些场景下可能导致数据恢复过程变得复杂。
适用场景
混合持久化适用于以下场景:
- 对数据安全性要求较高:如果你的应用需要保证尽可能低的数据丢失,并且希望提高恢复速度,混合持久化是一个不错的选择。
- 高频写操作的场景:在高写负载的情况下,混合持久化能够通过减少 AOF 写入次数来减少 Redis 的负载,同时保证数据持久化。
总结
混合持久化是 Redis 中为了结合 RDB 和 AOF 各自优缺点的一种机制,它通过在 RDB 快照中包含增量的 AOF 操作,保证了数据持久化的性能和安全性。它不仅能提供 RDB 的高效恢复速度,还能通过 AOF 操作来减少数据丢失,在很多场景下提供了比单独使用 RDB 或 AOF 更优的解决方案。
相关文章:
Redis中的持久化
什么是 Redis 持久化? Redis 是一个内存数据库,也就是说它主要把数据存储在内存中,这样可以实现非常高的读写速度。通常,内存数据库是非常快速且高效的,但它也有一个很大的问题:数据丢失的风险。因为当 Red…...

Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称
常规限定文本长度 ( 通过 UntiyEngine.UI.Inputfiled 附带的长度限定 ) 痛点1 无法对中文,数字,英文进行识别,同样数量的汉字和同样数量的英文像素长度是不一样的,当我们限定固定长度后,在界面上的排版不够美观 痛点2…...

SMO+PLL滑膜观测器、MARS模型参考自适应观测器simulink仿真
模型内容介绍: (1)SMOPLL滑膜观测器通过SMO估计电机的转速和位置信息,并利用PLL技术对这些信息进行跟踪和校正,以实现高精度的电机控制; (2)MARS是一种基于模型参考自适应控制理论…...
例题解析:利用异或运算(XOR)找出单独的数
异或运算(XOR) 异或运算是一种位运算,通常用符号 ^ 表示。它的运算规则如下: 如果两个二进制位相同,结果为 0。如果两个二进制位不同,结果为 1。 具体来说,对于两个二进制位 a 和 bÿ…...

如何处理微信小程序大量未捕获的异常
1)如何处理微信小程序大量未捕获的异常 2)如何关闭代码创建的纹理的读写,或者创建不带读写的图片 3)回收带有贴图和Collider的Mesh,如何正确用对象池维护 4)Cloth组件使用在一个篮筐上,运行后篮…...
C#-StringBuilder
string:特殊的引用 每次重新赋值或者拼接时会分配新的内存空间,如果一个字符串经常改变会非常浪费空间。 StringBuilder:C#提供的一个用于处理字符串的公共类 修改字符串而不创建新的对象,需要频繁修改和拼接的字符串可以使用它…...

SQLI LABS | Less-39 GET-Stacked Query Injection-Intiger Based
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来): http://localhost/sqli-labs/Less-39/ 本关是堆…...

linux安装zookeeper和kafka集群
linux安装zookeeper和kafka集群 一、Zookeeper集群部署安装zookeeper1. 下载2. 上传, 解压3. 配置 Zookeeper 节点4. 创建 myid 文件5. 启动参数更改6. sh文件授权7. 启动集群8. 防火墙开启端口 验证集群 二、kafka集群安装安装Kafka1. 下载Kafka安装包2. 上传到服务器…...

洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态
Linux系统的资源使用情况,你可以通过使用命令如free、top和netstat来实时监控内存、CPU及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。 本篇教程的灵感源自一位小伙伴的真实经历:…...

“双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!
作为一年一度的消费盛会,2024年“双十一”购物狂欢节早已拉开帷幕。蹲守直播间、在主播热情介绍中点开链接并加购,也已成为大多数人打开“双11”的重要方式。然而,在这火热的购物氛围背后,主播频频“翻车”、优质主播稀缺、客服响…...
Python调用企业微信的扫一扫
在企业微信里面新建了一个应用,指向了搭建服务器上Django写的web应用。 web应用需要使用扫描二维码的功能,就使用了大家都评价效果好的微信的扫一扫,事实也证明微信的扫一扫很好,但实现这个功能还是花了自己不少时间,很…...
速盾:CDN和OBS能共用流量包吗?
CDN和OBS是两种不同的云服务,它们在内容分发和存储方面有着不同的功能和优势。虽然它们都可以用于提供高效的内容分发和存储服务,但是它们的流量包是不能共用的。 CDN,即内容分发网络,是一种通过将内容存储在全球分布的服务器上&…...

第8章 利用CSS制作导航菜单
8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计,一般放置在页面的顶部。水平 导航适用性强,几乎所有类型的网站都可以使用,设计难度较低。 如果导航过于普通,无法容纳复杂的信息结构,就需要在…...
C# 集合与泛型
文章目录 前言1.什么是集合?2.非泛型集合(了解即可)2.1常见的非泛型集合 3.泛型的概念4.常用的泛型集合4.1 List < T > <T> <T>4.2 Dictionary<TKey, TValue>4.3 Queue < T > <T> <T>4.4 S t a c…...
el-date-picker 设置开始时间和结束时间
<el-date-picker v-model"ruleForm.RECORDDATE" type"date" placeholder"日期" format"YYYY/M/D" value-format"YYYY/M/D" style"width: 100%;" :disabled-date"publishDateAfter" > </el-dat…...
【Docker】 常用命令
文章目录 介绍Docker和容器化技术什么是Docker?Docker的优势和应用场景Docker的应用场景包括但不限于: 安装和配置Docker安装Docker引擎配置Docker环境 Docker镜像命令搜索镜像拉取镜像查看本地镜像删除本地镜像 Docker容器命令创建容器启动容器停止容器…...

docker compose - 设置名字
只使用 docker compose up 启动容器,默认名字为当前文件夹的名字 设置 project-name,docker 客户端会显示设置的名字,方便区分 docker compose --project-name webtest up错误: docker compose up --project-name webtest 效果…...

工业拍卖平台、信息发布、租赁商城平台系统适用于全行业解决方案。
工业拍卖平台系统是为工业领域的资产交易、设备处置等提供线上拍卖服务的数字化平台。 主要功能: 拍卖信息发布:平台会展示待拍卖的工业资产详细信息,包括设备的名称、型号、规格、使用年限、生产厂家等基本信息,以及资产的图片…...
一个win32 / WTL下多线程库(CThread类)的使用心得
说是多线程库,其实就是一个单独的.h文件,可以方便的放入WTL/win32工程中。 下载地址:CThread. 里面也简单介绍了 用法。 具体用法,首先自定义一个子线程类继承CThreadImpl<T>,注意他是个模板类。 class CMySu…...

使用wordpress搭建简易的信息查询系统
背景 当前有这样的一个需求,要实现让客户能够自助登录系统查询一些个人的信息,市面上没有特别符合我的需求的产品,经过一段时间的研究,想出了一个用wordpress实现简易信息查询系统,有两种方式。 方式一:使…...

极昆仑智慧与数元灵科技达成战略合作
近日,北京极昆仑智慧科技有限公司与北京数元灵科技有限公司正式签署产品级融合战略合作协议,双方将围绕 "AIBI商业智能分析" " Hybrid RAG 大模型问答" 等核心大模型应用,实现技术架构与业务场景的深度集成,…...

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。
基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升,对水资源管理和水位监测的需求…...

Framework开发之IMS逻辑浅析1--关键线程及作用
关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰,写字笔,键盘等),每种类型都对应一种驱动设备,而每个硬件驱动设备又对应Linux的一个目录文件…...

【Linux】centos软件安装
目录 Linux下安装软件的办法什么是yum使用yum试着安装软件查看yum源配置额外的第三方库 Linux下安装软件的办法 做为一个操作系统,与win和mac一样,安装软件无可厚非。那Linux下安装软件有哪些办法呢?第一种是直接下载源代码本地编译安装&…...

理解世界如淦泽,穿透黑幕需老谋
理解世界如淦泽,穿透黑幕需老谋 卡西莫多 2025年06月07日 安徽 极少主动跟别人提及恩师的名字,生怕自己比孙猴子不成器但又比它更能惹事的德行,使得老师跟着被拖累而脸上无光。不过老师没有象菩提祖师训诫孙猴子那样不能说出师傅的名字&a…...

新成果:GaN基VCSEL动态物理模型开发
作为高速数据传输与光电信号处理的核心器件,垂直腔面发射激光器(VCSEL)在高速光通信、激光雷达等领域应用广泛,其动态特性直接关联器件调制速率及稳定性等关键参数。近期,天津赛米卡尔科技有限公司技术团队开发了GaN基…...

MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点
MS39531N 是一款正弦驱动的三相无感直流电机驱动器,具有最小振动和高效率的特点 简述 MS39531 是一款正弦驱动的 三相无感直流电机驱动器 ,具有最小振动和高效率的特点。该驱动器内部集成了基本的闭环速度控制功能,能够根据特定的应用定制电…...
html如何在一张图片上的某一个区域做到点击事件
在HTML中,可以通过<map>和<area>标签来实现对图片的某个区域添加点击事件。这种方法通常用于创建图像地图(Image Map),允许用户点击图片的不同区域触发不同的事件。 以下是实现步骤和代码示例: 1. 准备图…...
2. 库的操作
2.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存储编码 [DEFAULT] COLLATE collation_name # 校验集: 比较/选择/读…...
Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南
Ref vs. Reactive:Vue 3 响应式变量的最佳选择指南 在 Vue 3 的 Composition API 中,ref 和 reactive 是创建响应式数据的两种主要方式。许多开发者经常困惑于何时使用哪种方式。本文将深入对比两者的差异,帮助您做出最佳选择。 核心概念解…...