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

redis 淘汰策略和持久化

文章目录

  • 一、淘汰策略
    • 1.1 背景
    • 1.2 淘汰策略
  • 二、持久化
    • 2.1 AOF日志
      • 2.1.1 AOF配置
      • 2.1.2 AOF策略
      • 2.1.3 AOF缺点
      • 2.1.4 AOF Rewrite
      • 2.1.5 AOF Rewrite配置
      • 2.1.6 AOF Rewrite缺点
      • 2.1.7 fork进程时的写时复制
      • 2.1.8 大key对持久化的影响
    • 2.2 RDB快照
      • 2.2.1 RDB配置
      • 2.2.2 RDB缺点
    • 2.3 混合持久化
    • 2.4 优缺点总结
    • 2.5 持久化的数据安全

一、淘汰策略

1.1 背景

Redis 之所以有淘汰策略,是因为 Redis 是基于内存的高性能键值存储系统,它将数据全部加载到内存中进行读写操作。但是,内存资源是有限的,当 Redis 使用的内存接近或超过系统可用内存时,就需要通过一些策略来释放内存空间。

1)键过期:通过expire / pexpire 设置key的生存时间。当key的生存周期达到时,将对应的key-value删除。

# 设置 key 的过期时间
expire key seconds
pexpire key milliseconds
# 查看 key 的过期时间
ttl key
pttl key

2)键的空闲时间(空转时长):redis每次操作value时,会记录操作的时间戳和统计对key-value的操作次数。value 的类型有多种,底层由 redisObject 实现,这种通用的数据结构可以存储不同类型的 value。

typedef struct redisObject {unsigned type:4;        // 对象类型:string, hash, list, setunsigned encoding:4;    // 编码方式unsigned lru:LRU_BITS;  // lru:24位,最近一次访问时间,单位秒,// lfu: 高16位,最近一次访问时间;低8位,逻辑访问次数int refcount;           // 引用计数,计数为 0,对象无人引用,可以回收void *ptr;              // 数据指针,指向对象内容
} robj;

lru字段用于记录操作value的时间,也会统计对key-value操作了多少次。可以使用object idletime key获取指定键的空闲时间。空闲时间指的是自上次对该键进行读取或写入操作以来所经过的时间。

# 对象空转时长
object idletime key

3)配置
redis.conf有两个参数配置淘汰策略,maxmemory和maxmemory-policy。
maxmemory限定redis可以使用的最大内存(单位是字节 ),一般设置为当前系统可用内存的一半;
maxmemory-policy用于制定淘汰策略。

# redis.conf
maxmemory <bytes>
maxmemory-policy noeviction

1.2 淘汰策略

1.2.1 针对过期key

  • volatile-lru:从设置了过期时间的键中,选择最近最少使用(Least Recently Used)(最长时间没有使用)的键进行删除。这种模式下, lru整个字段都用于记录时间。
  • volatile-lfu:从设置了过期时间的键中,选择最少使用次数的键进行删除。这种模式下 记录操作的时间和统计对key-value操作次数(8位统计次数,16位记录时间)。
  • volatile-ttl:从设置了过期时间的键中,选择剩余时间最短(最近就要过期)的键进行删除。这种模式下,记录操作的时间和统计对key-value操作次数(8位统计次数,16位记录时间)。
  • volatile-random:从设置了过期时间的键中,随机选择一个进行删除。ttl/pttl指令可以查询key还有多长时间到期。

1.2.2 针对所有key
allkeys-lru:从所有的键中,选择最近最少使用的键进行删除。无论键是否设置了过期时间。
allkeys-lfu,从所有的键中,选择最少使用次数的键进行删除。无论键是否设置了过期时间。
allkeys-random:从所有的键中,随机选择一个进行删除。无论键是否设置了过期时间。

1.2.3 禁止淘汰
noeviction:默认是禁止淘汰,如果数据达到了最大内存限制,在向redis中写入数据时会报错。

二、持久化

Redis 的数据全部在内存中,如果突然宕机,数据就会全部丢失。因此Redis 提供持久化机制,将内存中的数据以文件的形式存储到硬盘上, Redis 重启时加载持久化文件来恢复原来的数据。以此来保证Redis 的数据不会因为故障而丢失。

redis持久化的方式有:

  • AOF(Append-Only File)日志:记录了 Redis 服务器收到的所有写操作命令,每执行一条写操作命令,就以文本格式追加到一个日志文件中,通过回放这些写命令可以还原数据。
  • RDB(Redis Database)快照:以二进制形式将 Redis 数据库的快照(某一时刻的内存数据)保存在硬盘上,实现了数据的持久化存储。
  • 混合持久化:AOF+ RDB

2.1 AOF日志

AOF(Append-Only File)是 Redis 数据库中的一种持久化方式,用于将写操作追加到文件中。

Redis 每执行一条写操作命令,将命令以追加的方式写入 aof日志文件。aof文件存储的是Redis 协议的命令文本格式,例如:记录命令 set key value

 *3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue

Redis 重启时,通过重放(replay)AOF日志中指令序列来恢复 Redis 当前实例
的内存数据结构的状态;

2.1.1 AOF配置

通过修改 Redis 配置文件 redis.conf 进行设置,并在重启 Redis 服务后生效。

AOF(Append-Only File)持久化配置:

  • appendonly:若配置为 yes,启用 AOF 持久化。
  • appendfilename:设置 AOF 文件的名称。
  • appendfsync:设置刷新 AOF 文件到磁盘的策略。可选择的值有 always(每次修改都刷新)、everysec(每秒刷新一次)和 no(由操作系统决定刷新时机)。
  • no-appendfsync-on-rewrite:若配置为 yes,在执行 AOF 重写时禁止执行 AOF 文件刷新操作。
  • auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size:配置 AOF 自动重写的触发条件,其中 auto-aof-rewrite-percentage 表示 AOF 文件大小相对于上次重写后的大小增长的百分比,而 auto-aof-rewrite-min-size 表示 AOF 文件最小大小。
# 开启 aof
appendonly yes
# 关闭 aof复写
auto-aof-rewrite-percentage 0
# 关闭 混合持久化
aof-use-rdb-preamble no
# 关闭 rdb
save ""

2.1.2 AOF策略

fsync 是一个与文件系统相关的系统调用,它用于将文件系统缓存区中的数据立即写入物理磁盘,主动刷盘。

Redis 写入 AOF 日志的过程:wirte 从用户缓冲写到内核缓冲,fysnc 从内核缓冲写到磁盘。

AOF 有三种策略:always、every_sec、no。这三种策略主要差异是fsync()的调用时机:

  • appendfsync always:在每次写操作完成后,都会立即将写命令追加到 AOF 文件,并调用系统的fsync函数将数据同步到磁盘。这是最安全的方式,但也会带来较大的性能开销。
  • appendfsync everysec:在每秒钟的间隔内,将写命令追加到 AOF 文件,然后调用系统的fsync函数将数据同步到磁盘。这种方式提供了较好的性能和较高的数据安全性之间的折中方案。在bio_aof_fsync线程中执行。
  • appendfsync no:不自己调用fsync(),由系统决定什么时候调用fsync()将数据刷到磁盘文件中。

2.1.3 AOF缺点

AOF会把所有的写操作命令都追加到文件中,包括一些冗余过期的数据,比如

127.0.0.1:6379> set jack 100
OK
127.0.0.1:6379> set jack 200
OK
127.0.0.1:6379> set jack 300
OK

AOF会将三个命令都保存到文件中,恢复数据的时候也是执行了这三个命令。但实际只需要最后一次的命令即可。

因此,随着时间越长,AOF 日志会越来越长,如果 redis 重启,重放整个 AOF 日志会非常耗时,导致 redis 长时间无法对外提供服务。

2.1.4 AOF Rewrite

AOF Rewrite 是 Redis 中一种用于优化和压缩 Append-Only 文件(AOF)的机制。

在 Redis 的 AOF 持久化模式中,所有写操作都会以追加方式记录到 AOF 文件中。随着时间的推移,AOF 文件会不断增长,可能变得非常大,占用大量存储空间,并且读取和恢复时也会变得较慢。为了解决这个问题,Redis 提供了 AOF Rewrite 机制,用于重写并优化 AOF 文件。

AOF Rewrite 的过程如下:

  1. 启动 AOF Rewrite:当启动 AOF Rewrite 时,Redis 将fork一个子进程来执行 AOF Rewrite 操作,同时继续接受客户端的新命令。

  2. 创建新的 AOF 文件:子进程首先会创建一个新的空白 AOF 文件,用于存储重写后的命令序列。

  3. 遍历现有 AOF 文件:子进程会读取并解析现有的 AOF 文件,将其中的命令逐个读取并转化为对应的数据结构。

  4. 合并相同命令:在重写过程中,子进程会合并相同的命令,以减少生成的新命令数量。这样可以减小新 AOF 文件的大小并提高读取性能。

  5. 写入新的 AOF 文件:合并后的命令将按顺序写入新的 AOF 文件中。在写入期间,子进程会继续接收并处理来自客户端的新命令。

  6. 更新主进程状态:当子进程完成写入新 AOF 文件后,它将向主进程发送信号,主进程接收到信号后将完成 AOF Rewrite 的最后步骤。

  7. 切换到新的 AOF 文件:主进程将关闭当前的 AOF 文件,并将新的 AOF 文件设置为当前的 AOF 文件。这样,之后的写操作将会追加到新的 AOF 文件中。

  8. 完成 AOF Rewrite:一旦切换完成,AOF Rewrite 过程就完成了。新的 AOF 文件将包含原始 AOF 文件中的所有数据,但经过了优化和压缩。

需要注意的是,在 AOF Rewrite 过程中,Redis 仍然会继续处理客户端的命令请求,不会停止服务。重写期间,Redis增加一个AOF重写缓冲区,主进程将期间执行后的写操作命令记录到AOF重写缓冲区。当子进程完成AOF重写后,会将AOF重写期间的AOF增量(AOF重写缓冲区的数据)追加到新的 AOF 文件中。并将新的 AOF 文件设置为当前的 AOF 文件。
在这里插入图片描述

2.1.5 AOF Rewrite配置

修改 redis.conf 配置,开启 AOF 重写。

# 开启 aof
appendonly yes# 开启 aof复写
# 1. redis 会记录上次aof复写时的size,如果之后累计超过了
原来的size,则会发生aof复写;
auto-aof-rewrite-percentage 100
# 2. 为了避免策略1中,小数据量时产生多次发生aof复写,策略2
在满足策略1的前提下需要超过 64mb 才会发生aof复写;
auto-aof-rewrite-min-size 64mb# 关闭 混合持久化
aof-use-rdb-preamble no
# 关闭 rdb
save ""

2.1.6 AOF Rewrite缺点

AOF Rewrite 在 AOF 基础上实现了瘦身,但是 AOF 复写的数据量仍然很大;加载会非常慢。因为数据恢复还是通过重放(replay)方式,即重新执行命令的方式,需要消耗CPU,需要走命令处理流程。

2.1.7 fork进程时的写时复制

fork 是一个系统调用,在操作系统中创建一个子进程。其中的写时复制(Copy-on-Write,COW)是一种优化技术,用于减少 fork 操作时的内存消耗和复制数据的开销。

写时复制的过程如下:

  1. 父子进程共享相同的物理内存:在执行 fork 时,父进程的内存空间会被完整地复制给子进程。但是实际上,父子进程会共享相同的物理内存页,并且这些页被标记为“只读”。

  2. 写操作触发缺页中断:当父进程(或子进程)尝试对共享的内存页进行写操作时,操作系统会检测到这个写操作,因为这些页是只读的。从而触发缺页中断

  3. 复制需要修改的内存页:当发生写操作并产生缺页中断时,操作系统会为触发缺页错误的父进程分配一块新的物理内存页,并将原始只读页中需要修改的部分复制到新的内存页中。

  4. 更新页表:在完成内存页的复制后,操作系统会更新父进程和子进程的页表,将对应的虚拟内存页映射到新的物理内存页上。子进程的页表指向原来的物理内存,父进程的页表指向新的物理内存。

  5. 继续执行:一旦复制和更新操作完成,父子进程就可以继续各自独立地执行,并且它们在内存中的数据是彼此隔离的。

写时复制的好处是避免了昂贵的内存复制操作。在 fork 之后,父子进程只有在需要进行写操作时才会发生实际的内存复制,避免物理内存的复制时间过长导致父进程长时间阻塞。

当然,这也是AOF Rewrite的时候,为了避免主进程写时复制造成父子进程内存数据不一致,使得重写后 AOF 日志的数据与 Redis 中的数据不一致,Redis 增加了一个 AOF 重写缓冲区。
在这里插入图片描述

2.1.8 大key对持久化的影响

大 key:Key 对应的 Value 很大,占用大量的空间。
1)fsync()压力大。比如AOF的always,它是在主线程中做的持久化,如果value非常的大,会长时间占用主线程,这就是一个耗时的操作,会影响redis的响应性能;大key对AOF的every_sec的影响较小,因为它在另外的线程 (bio_aof_fsync线程)进行持久化的;AOF的no对redis的影响也较小,因为fsync()由系统决定,因此压力在系统上。

2)fork时间比较长。redis中有一个object_info,会记录fork的时间,如果主线程fork超过1s,那么它的效率是非常低的,阻塞主线程。同时,写时复制造成持久化时间过长。

2.2 RDB快照

基于 AOF或 AOF Rewrite文件大的缺点,RDB是一种快照持久化;它通过 fork 进程,在子进程中将某一瞬间内存当中的数据键值对按照存储方式持久化到 RDB文件中;
RDB是基于内存中(所有数据)对象编码(ziplist、quiklist、intset、skiplist、int、embstr、raw等)直接持久化,存储的是经过压缩的二进制数据;由于是二进制数据,不管是落盘速度还是恢复数据速度都是最快的。
在这里插入图片描述

2.2.1 RDB配置

# 关闭 aof 同时也关闭了 aof复写
appendonly no
# 关闭 aof复写
auto-aof-rewrite-percentage 0
# 关闭 混合持久化
aof-use-rdb-preamble no
# 开启 rdb 也就是注释 save ""
# save ""# redis 默认策略如下:
# 注意:写了多个 save 策略,只需要满足一个则开启rdb持久化
# 3600 秒内有以1次修改
save 3600 1
# 300 秒内有100次修改
save 300 100
# 60 秒内有10000次修改
save 60 10000

Redis 提供 save 和 bgsave 命令来生成 RDB 文件

# 自动开启 RDB
# 如果在 seconds 秒内,对 redis 共执行至少 changes 次修改,则自动执行命令
# 主线程生成 RDB 文件,阻塞主线程
save <seconds> <changes> 
# 子线程生成 RDB 文件,不阻塞主线程
bgsave <seconds> <changes>

2.2.2 RDB缺点

1)RDB的持久化方式是以某一时刻所有的内存数据为单位,而AOF持久化是以单条命令为单位。所以若采用 RDB持久化,一旦 redis 宕机,redis 将丢失一段时间的
内存数据,RDB方式丢失数据是最严重的。

2)RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且 CPU性能不是很好的情况下,这种情况会持续1秒,AOF Rewrite 也需要 fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

2.3 混合持久化

从上面知道,RDB文件小且加载快但丢失多,AOF文件大且加载慢但丢失少;混合持久化是吸取 RDB和 AOF两者优点的一种持久化方案;AOF Rewrite 的时候实际持久化的内容是 RDB,等持久化后,持久化期间修改的数据以AOF的形式附加到文件的尾部。

在混合持久化配置下,Redis 会同时进行 RDB 快照和 AOF 日志追加。这样,在遇到灾难性故障时,可以使用 RDB 文件进行快速恢复,而 AOF 文件可以提供更详细的日志记录并保证数据的更高持久性。

混合持久化的流程是:
1)当开启混合持久化时,在 AOF 重写日志时,fork 出来的子进程先根据与主线程共享的内存数据以 RDB 的方式写入新的 AOF 文件。主线程对 Redis 的写操作会记录到 AOF 重写缓冲区。

2)当 RDB 持久化结束后,重写缓冲区里的增量命令以 AOF 的形式追加到新的 AOF 文件。写入完成后,子线程通知主线程将新的的 AOF 文件替换旧的 AOF 文件。这样生成的 AOF 文件是: RDB 格式的全量数据 + AOF 格式的增量数据。

3)Redis 重启时,先加载 RDB 的内容,然后再重放增量 AOF 日志。
在这里插入图片描述

2.3.1 配置
混合持久化实际上是在 AOF Rewrite基础上进行优化;所以需要先开启 AOF Rewrite。

# 开启 aof
appendonly yes
# 开启 aof复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 开启 混合持久化
aof-use-rdb-preamble yes
# 关闭 rdb
save ""

2.3.2 缺点
启用混合持久化会带来额外的存储空间占用和性能开销,因为需要同时维护 RDB 文件和 AOF 文件。

2.4 优缺点总结

AOF

  • 优点:数据可靠,丢失较少。持久化鬼哟踩代价较低(只记录写命令)。
  • 缺点:AOF文件过大,数据恢复慢。

RDB:

  • 优点:RDB文件小,数据恢复快。
  • 缺点:数据一旦丢失,则丢失的数据量比较多。且持久化过程代价比较高(记录内存所以数据)。

混合持久化:

  • 优点:充分利用 RDB 和 AOF 持久化各自的优点,以提供更好的数据安全性和快速恢复能力
  • 缺点:带来额外的存储空间占用和性能开销,因为需要同时维护 RDB 文件和 AOF 文件。

2.5 持久化的数据安全

1)数据安全要考虑两个问题:

  1. 节点宕机(redis 是内存数据库,宕机数据会丢失)
  2. 磁盘故障

上述持久化方式只考虑到了节点宕机问题,但若磁盘故障,则无法恢复数据。因此,需要定期将持久化文件拷贝到其他地方。

2)拷贝持久化文件是安全的。
持久化文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的持久化文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用rename(2) 原子地用临时文件替换原来的持久化文件。

3)具体措施

  1. 创建一个定期任务 (cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。
  2. 确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 find 命令来删除过期的快照。比如说, 你可以保留最近 48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。
  3. 至少每天一次, 将 RDB 备份到数据中心之外,或者至少是备份到运行 redis 服务器的物理机器之外。

相关文章:

redis 淘汰策略和持久化

文章目录 一、淘汰策略1.1 背景1.2 淘汰策略 二、持久化2.1 AOF日志2.1.1 AOF配置2.1.2 AOF策略2.1.3 AOF缺点2.1.4 AOF Rewrite2.1.5 AOF Rewrite配置2.1.6 AOF Rewrite缺点2.1.7 fork进程时的写时复制2.1.8 大key对持久化的影响 2.2 RDB快照2.2.1 RDB配置2.2.2 RDB缺点 2.3 混…...

Redis学习路线(6)—— Redis的分布式锁

一、分布式锁的模型 &#xff08;一&#xff09;悲观锁&#xff1a; 认为线程安全问题一定会发生&#xff0c;因此在操作数据之前先获取锁&#xff0c;确保线程串行执行。例如Synchronized、Lock都属于悲观锁。 优点&#xff1a; 简单粗暴缺点&#xff1a; 性能略低 &#x…...

一、创建自己的docker python容器环境;支持新增python包并更新容器;离线打包、加载image

1、创建自己的docker python容器环境 参考&#xff1a;https://blog.csdn.net/weixin_42357472/article/details/118991485 首先写Dockfile&#xff0c;注意不要有txt等后缀 Dockfile # 使用 Python 3.9 镜像作为基础 FROM python:3.9# 设置工作目录 WORKDIR /app# 复制当前…...

【Git】git企业开发命令整理,以及注意点

1.git企业开发过程 业务的分支大概有以下几个&#xff1a; master&#xff1a;代码随时可能上线 develop&#xff1a;代码最新 feature/xxx&#xff1a;实际业务开发分支 release/xxx&#xff1a;预发布分支 fix&#xff1a;修复bug分支 过程大概是这样的&#xff1a; 首…...

使用Django自带的后台管理系统进行数据库管理的实例

Django自带的后台管理系统主要用来对数据库进行操作和管理。它是Django框架的一个强大功能&#xff0c;可以让你快速创建一个管理界面&#xff0c;用于管理你的应用程序的数据模型。 使用Django后台管理系统&#xff0c;你可以轻松地进行以下操作&#xff1a; 数据库管理&…...

leetcode解题思路分析(一百四十五)1254 - 1266 题

统计封闭岛屿的数目 二维矩阵 grid 由 0 &#xff08;土地&#xff09;和 1 &#xff08;水&#xff09;组成。岛是由最大的4个方向连通的 0 组成的群&#xff0c;封闭岛是一个 完全 由1包围&#xff08;左、上、右、下&#xff09;的岛。请返回 封闭岛屿 的数目。 BFS或者DFS…...

使用 GORM 连接数据库并实现增删改查操作

步骤 1&#xff1a;安装 GORM 首先&#xff0c;我们需要安装 GORM 包。在终端中运行以下命令&#xff1a; shell go get -u gorm.io/gorm 步骤 2&#xff1a;导入所需的包 在 Go 代码的开头导入以下包&#xff1a; import ("gorm.io/driver/mysql" // 如果你使用…...

kafka集群搭建(Linux环境)

zookeeper搭建&#xff0c;可以搭建集群&#xff0c;也可以单机&#xff08;本地学习&#xff0c;没必要搭建zookeeper集群&#xff0c;单机完全够用了&#xff0c;主要学习的是kafka&#xff09; 1. 首先官网下载zookeeper&#xff1a;Apache ZooKeeper 2. 下载好之后上传到…...

树莓派本地快速搭建web服务器,并发布公网访问

文章目录 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 树莓派本地快速搭建web服务器&#xff0c;并发布公网访问 随着科技的发展&#xff0c;电子工业也在不断进步&#xff0c;我们身边的电子设备也在朝着小型化和多功能化演进&#xff0c;以往体积庞大的电脑也在…...

集合中的数据结构

栈 先进后出入口跟出口在同一侧 队列 先进先出入口跟出口在不同的一层 数组 查询快、增删慢查询快是因为数组的地址是连续的&#xff0c;我们通过数组的首地址就可以找到数组&#xff0c;之后通过数组的下标就可以访问数组的每一个元素。增删慢是因为数组的长度是固定的&…...

CentOS 8 错误: Error setting up base repository

配置ip、掩码、网关、DNS VMware网关可通过如下查看 打开网络连接 配置镜像的地址 vault.centos.org/8.5.2111/BaseOS/x86_64/os/...

java外观模式

在Java中&#xff0c;外观模式&#xff08;Facade Design Pattern&#xff09;用于为复杂的子系统提供一个简单的接口&#xff0c;以方便客户端的使用。外观模式是一种结构型设计模式&#xff0c;它隐藏了系统的复杂性&#xff0c;将多个类的复杂操作封装在一个外观类中&#x…...

3秒快速打开 jupyter notebook

利用 bat 脚本&#xff0c;实现一键打开 minconda 特点&#xff1a; 1、可指定 python 环境 2、可指定 jupyter 目录 一、配置环境 minconda 可以搭建不同的 python 环境&#xff0c;所以我们需要找到 minconda 安装目录&#xff0c;把对应目录添加到电脑环境 PATH 中&#…...

数据安全

数据的备份与恢复 1. 数据备份技术 任何数据在长期使用过程中&#xff0c;都存在一定的安全隐患。由于认为操作失误或系统故障&#xff0c;例如认为错误、程序出错、计算机失效、灾难和偷窃&#xff0c;经常造成数据丢失&#xff0c;给个人和企业造成灾难性的影响。在这种情况…...

华为nat64配置

1.前期环境准备 环境拓扑 拓扑分为两个区域,左边为trust区域,使用IPv4地址互访,右边为untrust区域,使用IPv6地址互访 2.接口地址配置 pc1地址配置 pc2地址配置 FW接口配置 (1)首先进入防火墙配置界面 注:防火墙初始账号密码为user:admin,pwd:Admin@123,进入之后…...

从分片传输到并行传输之大文件传输加速技术

随着大文件的传输需求越来越多&#xff0c;传输过程中也会遇到很多困难&#xff0c;比如传输速度慢、文件安全性低等。为了克服这些困难&#xff0c;探讨各种大文件传输加速技术。其中&#xff0c;分片传输和并行传输是两种比较常见的技术&#xff0c;下面将对它们进行详细说明…...

mybatisPlus入门篇

文章目录 初窥门径1.1 初识MybatisPlus1.2 MybatisPlus的特性1.3 MybatisPlus的架构模型 入门案例2.1 准备相关开发环境2.2 搭建springboot工程2.3 创建数据库2.4 引入相关依赖2.5 创建实体类2.6 集成MybatisPlus2.7 单元测试2.8 springboot日志优化 初窥门径 1.1 初识Mybatis…...

NineData支持最受欢迎数据库PostgreSQL

根据在 Stack Overflow 发布的 2023 开发者调研报告中显示&#xff0c;PostgreSQL 以 45% vs 41% 的受欢迎比率战胜 MySQL&#xff0c;成为新的最受欢迎的数据库。NineData 也在近期支持了 PostgreSQL&#xff0c;用户可以在 NineData 平台上进行创建数据库/Schema、管理用户与…...

Redis配置类

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

【前端知识】React 基础巩固(三十六)——RTK中的异步操作

React 基础巩固(三十六)——RTK中的异步操作 一、RTK中使用异步操作 引入RTK中的createAsyncThunk&#xff0c;在extraReducers中监听执行状态 import { createSlice, createAsyncThunk } from "reduxjs/toolkit"; import axios from "axios";export cons…...

33. 本地记事本

本地记事本 html部分 <button class"add"><i class"iconfont icon-jiahao"></i> </button>css部分 *{margin: 0;padding: 0; } body{background-color: #7bdaf3;display: flex;padding-top: 3rem;flex-wrap: wrap; } .add{pos…...

Android Glide预处理preload原始图片到成品resource 预加载RecyclerViewPreloader,Kotlin

Android Glide预处理preload原始图片到成品resource & 预加载RecyclerViewPreloader&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MED…...

亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用

亚马逊云科技近日在纽约峰会上宣布全面扩展其全托管基础模型服务Amazon Bedrock&#xff0c;包括新增Cohere作为基础模型供应商&#xff0c;加入Anthropic和Stability AI的最新基础模型&#xff0c;并发布变革性的新功能Amazon Bedrock Agents功能。客户无需管理任何基础设施&a…...

题解:ABC275 C-Counting Squares

题解&#xff1a;ABC275 C-Counting Squares 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;入门。 思维难度&#xff1a;普及。 调码难度&#xff1a;普及。 综合评价&#xff1a;简单。 算法 dfs数论。 思路 由数学方法可严谨…...

加载已训练好的目标检测YOLOv8,v5,v3,v6模型,对数据集中某张图片中的object打上方框、标出类别,并将图片保存到本地

参考的教程&#xff1a;Python - Ultralytics YOLOv8 Docs 在与ultralytics代码同一层级下新建 predict.py 里面写下面的内容。运行即可 from ultralytics import YOLO from PIL import Image import cv2# 加载计划使用的模型 model YOLO("yolov8n.pt") # load a…...

《零基础入门学习Python》第073讲:GUI的终极选择:Tkinter10

我们不难发现&#xff0c;几乎每一个应用程序都有一些相同的地方&#xff0c;比如说&#xff1a;标题栏、状态栏、边框、滚动条、工作区。还有的就是 菜单。 传统的菜单有大家熟悉的 File&#xff0c;Edit&#xff0c;Help等&#xff0c;点开之后&#xff0c;是下拉菜单&#…...

Shell脚本实现分库分表操作

目录 一&#xff0c;分库备份 二&#xff0c;分库操作 三&#xff0c;分库分表备份 四&#xff0c;备份还原 一&#xff0c;分库备份 #!/bin/bash mysql_cmd-uroot -pzly666666 bak_path/backup/db [ -d ${bak_path} ] || mkdir -p ${bak_path}mysql ${mysql_cmd} -e show…...

区块链实验室(12) - 网络拓扑对PBFT共识流量的影响

区块链实验室(10) - 实例说明PBFT的共识过程说明了1个简单又极端的网络&#xff0c;在这个网络中完成1个交易的共识&#xff0c;需要26次通信&#xff0c;见下图所示。 换1个网络&#xff0c;这个网络是强连通图&#xff0c;见下图。 在这个网络中完成1次交易&#xff0c;流量见…...

聊聊这几年的科技风口

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 数数这几年的科技风口&#xff1a;AR&#xff08;包括什么MR、VR&#xff09;、区块链(包括后来的什么web3)、元宇宙到现在的AI&#xff0c;下面逐一谈谈…...

【力扣每日一题】2023.7.30 环形链表2

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题属于是那种知道解法就很简单&#xff0c;不知道解法就很难独立想出来的那种&#xff0c;我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法&#xff0c;再解释为什么解法可以解出来。 那么我们都…...

做那个网站的小编比较好/域名查询系统

利用代码来记录当前时间值或求某步操作所用时间值&#xff0c;本例以执行图片像素改变为例&#xff01; 代码如下&#xff1a; import cv2 as cv #导入openc包 import numpy as np #科学计数的包def access_pixels(image): #获取图片像素的函数print(image.shap…...

wordpress不安装先写前端/南宁白帽seo技术

一个经常会被问到的问题&#xff1a; 为什么不在 created 里去发ajax&#xff1f;created 可是比 mounted 更早调用啊&#xff0c;更早调用意味着更早返回结果&#xff0c;那样性能不是更高&#xff1f; 首先&#xff0c;一个组件的 created 比 mounted 也早调用不了几微秒&a…...

顺德龙江网站建设/网络营销方案策划书

Java I/O流-总结(InputStream&#xff0c;OutputStream,Reader,Writer)2014-08-22一、 流的分类 按数据流动方向– 输入流&#xff1a;只能从中读取字节数据&#xff0c;而不能向其写出数据– 输出流&#xff1a;只能向其写入字节数据&#xff0c;而不能从中读取数据 按照…...

有没有做二手设备网站/奶茶软文案例300字

微服务是近年兴起的一个概念&#xff0c;是指将应用程序设计成一套可以单独部署的服务。Martin Fowler是ThoughtWorks的首席科学家。他与ThoughtWorks首席顾问James Lewis合作发表的《微服务》&#xff0c;可谓是了解微服务架构风格的入门必读。近日&#xff0c;Fowler又提出了…...

在wordpress主题后台安装了多说插件但网站上显示不出评论模块/注册google账号

图片的格式有非常多种&#xff0c;比如jpg、png、JPEG、icon等等&#xff0c;如果需要将png转jpg很多小伙伴们会使用ps来进行操作&#xff0c;如果没有安装ps那要怎么办呢&#xff1f;我们可以使用在线转换将图片格式进行转换&#xff0c;接下来我就来给大家介绍下具体的操作方…...

安徽做公司网站哪家好/关键词热度

RT&#xff0c;在Hive中&#xff0c;使用了Group By后&#xff0c;是无法再sort&#xff0c;再取Top K的&#xff0c;我们可以用UDF distributed by sort by 实现这个功能。Assume you have a table with three columns: user, category and value. For each user, you want …...