深入理解Redis:数据类型、事务机制及其应用场景
在当今快速发展的技术领域中,Redis作为一种高性能的内存数据库,已经被广泛应用于各种场景,从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性,如事务处理、持久化选项、高可用性和分布式模型等。本文旨在深入探讨Redis的核心概念,包括它提供的多种数据类型、事务机制的工作原理,以及这些特性的典型使用场景。通过对这些内容的学习,读者可以更好地理解如何利用Redis来优化自己的应用程序,提高系统的响应速度和可靠性。无论是对于开发人员还是系统架构师而言,掌握Redis的高级用法都将是一项非常有价值的技术投资。让我们开始这段Redis的探索之旅吧。
1. redis的数据类型,以及每种数据类型的使用场景
Redis 提供了多种数据类型,每种数据类型都有其特定的使用场景。以下是 Redis 支持的主要数据类型及其适用场景:
1. 字符串(String)
- 描述:最基本的数据类型,可以存储字符串、整数或浮点数。
- 适用场景:
- 缓存简单的值,如用户会话信息。
- 计数器应用,比如网站访问次数。
- 分布式锁实现。
2. 哈希(Hash)
- 描述:哈希是一个键值对集合,适合用于存储对象。
- 适用场景:
- 存储用户资料、产品详情等结构化数据。
- 当需要更新对象的部分字段时非常有用,避免了整个对象的重写。
3. 列表(List)
- 描述:一个有序的字符串列表,可以从两端进行插入和删除操作。
- 适用场景:
- 实现队列系统,例如任务队列。
- 最近浏览记录、最新消息等时间序列数据。
- 简单的消息中间件。
4. 集合(Set)
- 描述:无序且不重复的字符串集合。
- 适用场景:
- 标签系统,为文章添加标签。
- 维护好友列表,确保每个用户只出现一次。
- 进行交集、并集、差集运算,适用于社交网络中的共同好友查找等功能。
5. 有序集合(Sorted Set)
- 描述:类似于集合,但每个元素关联了一个分数(score),通过分数排序。
- 适用场景:
- 排行榜系统,根据用户的积分来排名。
- 定时任务调度,根据任务执行的时间顺序排列。
- 按照优先级处理的任务队列。
6. Bitmaps
- 描述:实际上不是一种独立的数据类型,而是字符串类型的特殊形式,允许以位为单位进行操作。
- 适用场景:
- 用户在线状态跟踪,用一位表示一个用户是否在线。
- 统计活跃用户数量,例如每日登录用户数。
7. HyperLogLogs
- 描述:用于基数估计的算法,能够高效地估算集合中不同元素的数量。
- 适用场景:
- 统计唯一访客数量,而不需要精确计数。
- 大规模数据集中去重统计。
8. 地理空间索引(Geospatial Indexes)
- 描述:支持地理坐标的位置存储,并提供基于位置的服务功能。
- 适用场景:
- 附近地点搜索,如查找附近的餐馆或朋友。
- 路径规划,计算两点之间的距离。
选择合适的数据类型对于最大化 Redis 的性能和效率至关重要。理解各种数据类型的特性和适用场景可以帮助你更有效地设计和实现应用程序。
2.redis的过期策略以及内存淘汰机制
Redis 提供了灵活的过期策略和内存淘汰机制,帮助用户管理数据的有效性和内存使用情况。下面详细介绍这两种机制。
过期策略
Redis 允许为每个键设置一个生存时间(TTL, Time To Live),当达到设定的时间后,该键将自动失效并被删除。Redis 实现了两种主要的过期策略来处理这些带有过期时间的键:
-
惰性删除:
- 当访问某个键时,Redis 会检查这个键是否已经过期。如果过期,则返回不存在,并从数据库中删除该键。
- 这种方式的优点是节省 CPU 资源,因为只有在访问到特定键时才会进行检查;缺点是如果存在大量已过期但未被访问的键,则它们将继续占用内存直到被访问或通过其他方式清理。
-
定期删除:
- Redis 会周期性地随机检查一些设置了过期时间的键,并删除那些已经过期的键。
- 定期删除试图平衡惰性删除带来的延迟问题,通过主动检查来释放不再需要的内存空间。
内存淘汰机制
当 Redis 使用的内存超过了配置的最大限制 (maxmemory
) 时,它需要决定如何处理新来的写入请求。此时,Redis 可以根据预设的策略选择移除某些键以腾出空间。以下是几种常见的内存淘汰策略:
- noeviction:默认策略,当内存达到上限时,任何写操作都会返回错误,但读操作仍然可以继续。
- allkeys-lru:移除最近最少使用的键(LRU, Least Recently Used),适用于大多数缓存场景。
- volatile-lru:仅移除设置了过期时间的键中最少使用的键。
- allkeys-random 和 volatile-random:随机移除键,前者针对所有键,后者只针对设置了过期时间的键。
- allkeys-lfu 和 volatile-lfu:移除最不经常使用的键(LFU, Least Frequently Used),相比 LRU 更加考虑频率而非时间,需要 Redis 4.0 或更高版本支持。
选择哪种策略取决于你的应用需求。例如,如果你的应用对一致性要求较高,可能倾向于选择 volatile-lru
或 allkeys-lru
来确保频繁访问的数据不会轻易丢失;而在不太关心数据一致性的场合下,allkeys-random
或者 volatile-random
可能就足够了。
此外,合理设置 maxmemory
参数以及结合使用 RDB 或 AOF 持久化策略,可以帮助更好地管理和保护 Redis 中的数据。同时,利用 Redis 的持久化功能可以在重启后恢复数据,进一步增强了系统的可靠性和稳定性。
3.Redis 为什么是单线程的
Redis 选择单线程模型主要是基于简化设计、提高性能和避免并发问题的考虑。以下是几个关键原因解释了为什么 Redis 采用单线程架构:
1. 简化并发控制
- 避免锁竞争:在多线程环境中,为了保证数据的一致性和正确性,通常需要引入复杂的锁机制来管理并发访问。而单线程模型天然避免了这些问题,因为所有操作都是顺序执行的,不需要担心多个线程同时修改同一数据块导致的数据不一致或竞争条件。
2. 减少上下文切换开销
- 降低CPU切换成本:多线程程序中,操作系统需要频繁地在线程间切换以分配处理器时间,这会带来额外的上下文切换开销。单线程则完全避免了这种开销,使得更多的计算资源可以专注于处理实际的任务。
3. 高效利用内存
- 事件驱动I/O:Redis 使用非阻塞I/O模型,并通过事件驱动的方式(如 epoll/kqueue)高效地处理大量客户端连接请求。由于所有命令都是由一个线程按顺序执行,因此可以非常高效地管理和响应这些请求,最大限度地减少延迟。
4. 数据结构优化
- 针对高性能优化的数据结构:Redis 实现了多种高度优化的数据结构(例如字符串、哈希表、列表、集合等),并为这些结构提供了快速的操作方法。由于是单线程运行,这些操作可以在没有锁争用的情况下迅速完成,从而提高了整体性能。
5. 内存驻留数据
- 全内存操作:Redis 的核心功能是作为一个内存数据库运行,这意味着大部分操作都在内存中进行,速度极快。对于内存中的操作而言,单线程已经足够快,并且能够提供良好的可预测性和稳定性。
6. 扩展性与集群模式
- 分布式扩展能力:虽然 Redis 单实例是单线程的,但它支持横向扩展,即通过增加更多 Redis 实例或者使用 Redis Cluster 来分布负载。这种方式允许系统根据需求灵活扩展,而不受限于单个实例的性能瓶颈。
综上所述,尽管 Redis 是单线程的,但由于其专注于内存中的高速数据访问、高效的 I/O 处理机制以及简洁的设计,它仍然能够在许多场景下提供卓越的性能表现。此外,Redis 也提供了诸如持久化、发布/订阅、事务等多种高级特性,进一步增强了它的实用性和灵活性。对于那些需要更高吞吐量的应用,可以通过部署多个 Redis 实例或使用 Redis Cluster 来满足需求。
4. Redis 常见性能问题和解决方案?
Redis 是一种高性能的内存数据库,但在实际应用中如果不正确地配置或使用它,可能会遇到性能瓶颈。以下是 Redis 常见的性能问题及其解决方案:
1. 内存使用过高
- 原因:数据量过大、未设置合适的过期策略、未启用LRU(Least Recently Used)淘汰策略等。
- 解决方案:
- 优化数据结构的选择和存储方式。
- 合理设置
maxmemory
和maxmemory-policy
参数,以控制内存使用并根据需要选择适当的淘汰策略。 - 定期检查和清理不再使用的键。
2. 持久化操作影响性能
- 原因:RDB快照生成或者AOF重写过程中会占用大量I/O资源,可能导致短暂的服务不可用或响应变慢。
- 解决方案:
- 调整 RDB 快照频率,避免过于频繁的快照生成。
- 使用 AOF 持久化时,考虑关闭 fsync 操作或将 fsync 设置为每秒一次,减少对性能的影响。
- 对于高可用性要求较高的场景,可以考虑使用主从复制来减轻持久化对主节点的压力。
3. 网络延迟
- 原因:客户端与服务器之间的往返时间(RTT)较长,尤其是在跨数据中心部署的情况下。
- 解决方案:
- 使用 Pipeline 批量处理命令以减少网络往返次数。
- 在地理上分散的应用程序架构中,考虑在靠近用户的地方部署 Redis 实例或使用缓存代理。
4. 阻塞命令
- 原因:某些 Redis 命令如
KEYS
,SORT
,SMEMBERS
等,在处理大数据集时可能会导致长时间阻塞主线程。 - 解决方案:
- 尽量避免使用可能造成阻塞的命令;改用 SCAN 系列命令代替 KEYS 进行迭代查询。
- 如果必须执行这类命令,确保它们不会在高峰期运行,并尽量限制结果集大小。
5. 客户端连接数过多
- 原因:当客户端数量激增时,可能导致 Redis 的文件描述符耗尽,进而影响服务稳定性。
- 解决方案:
- 增加系统级别的最大文件描述符限制。
- 在 Redis 配置中调整
maxclients
参数以适应更高的并发需求。 - 实施连接池技术,复用现有的连接而不是每次都创建新连接。
6. 数据库加载
- 原因:当 Redis 启动并从磁盘加载数据库文件(RDB 或 AOF)时,这个过程可能会很慢,特别是在数据库文件很大时。
- 解决方案:
- 优化持久化文件大小,定期清理不必要的数据,升级硬件配置提高读取速度。
7. 缓存穿透、击穿、雪崩等问题
- 解决方案:
- 缓存穿透:使用布隆过滤器预先判断请求是否有效;对于不存在的数据也进行缓存。
- 缓存击穿:热点数据不过期,或采用互斥锁防止同时重建缓存。
- 缓存雪崩:通过随机化TTL、热点数据不过期等方式防止大量缓存同时失效。
8. 监控与预警
- 建议:建立有效的监控系统,实时跟踪 Redis 的性能指标,包括但不限于内存使用率、CPU使用率、命中率、连接数等,并设置预警机制以便及时采取行动。
通过识别这些问题并采取相应的措施,可以显著提高 Redis 的性能和可靠性。持续关注 Redis 的最新发展和最佳实践也是保持高效运营的关键。
5.为什么Redis的操作是原子性的,怎么保证原子性的?
Redis 的操作之所以被认为是原子性的,主要是因为它采用了单线程模型来处理所有客户端请求。这意味着 Redis 在任意时刻只会执行一个命令,并且这个命令会从开始到结束完整地执行完毕,不会被其他命令打断。这种设计确保了命令的原子性,即每个命令都是作为一个不可分割的操作来执行的。
原子性保证
-
单线程执行:
- Redis 采用单线程执行所有命令,因此不存在多个命令同时修改同一数据的情况。这就保证了即使是复杂的复合命令(如
INCR
、DECR
等),也能保证其原子性。
- Redis 采用单线程执行所有命令,因此不存在多个命令同时修改同一数据的情况。这就保证了即使是复杂的复合命令(如
-
内置原子操作:
- Redis 提供了一些专门设计为原子性的命令,比如计数器操作 (
INCR
,DECR
) 和列表操作 (LPUSH
,RPUSH
) 等,这些命令在实现上就保证了它们是原子性的。
- Redis 提供了一些专门设计为原子性的命令,比如计数器操作 (
-
事务支持:
- Redis 支持事务通过
MULTI
、EXEC
、DISCARD
和WATCH
等命令来实现。当使用MULTI
开始一个事务后,直到EXEC
被调用之前的所有命令会被放入队列中,然后由EXEC
指令一次性按顺序执行。这样可以确保一系列命令要么全部成功执行,要么都不执行,从而保持一致性。 - 注意:Redis 事务与传统数据库中的事务不同,它不支持回滚功能。
- Redis 支持事务通过
-
Lua 脚本:
- Redis 允许用户编写 Lua 脚本来执行复杂逻辑。由于 Lua 脚本是在 Redis 单线程环境中运行的,因此整个脚本的执行也是原子性的。这使得你可以将一系列相关操作封装在一个 Lua 脚本中,确保这些操作作为一个整体被执行。
-
乐观锁机制:
- 使用
WATCH
命令可以监视一个或多个键,在执行事务前如果这些键没有被其他客户端修改,则事务可以正常提交;否则,事务将会失败。这种方法被称为乐观锁,适用于需要检测并发修改的情况。
- 使用
总结
Redis 通过单线程模型和特定的设计来保证命令的原子性。对于简单的命令,单线程模型自然地提供了原子性保障;而对于更复杂的场景,可以通过事务、Lua 脚本或者乐观锁机制来实现原子性操作。这样的设计不仅简化了并发控制,还提高了系统的可靠性和性能。然而,需要注意的是,虽然 Redis 的事务不同于传统的关系型数据库事务,不具备回滚能力,但它仍然能很好地满足大多数应用场景下的需求。
6.了解Redis的事务吗?
Redis 提供了事务支持,尽管与传统关系型数据库中的事务概念有所不同。Redis 事务通过 MULTI
、EXEC
、DISCARD
和 WATCH
等命令来实现。以下是 Redis 事务的基本概念和工作原理:
基本概念
-
MULTI:标记一个事务块的开始。一旦调用了
MULTI
,客户端发送的所有后续命令将不会立即执行,而是被放入队列中等待后续的EXEC
命令来执行。 -
EXEC:执行所有在
MULTI
命令之后入队的命令,并一次性返回所有这些命令的结果。当EXEC
被调用时,Redis 会顺序执行事务队列中的每个命令。 -
DISCARD:取消事务,放弃执行事务队列中的所有命令,并清空事务队列。
-
WATCH:用于监视一个或多个键,在
EXEC
执行前如果这些键被其他客户端修改,则事务将不会被执行,EXEC
将返回一个错误指示事务失败。这是一种乐观锁机制,适用于需要检测并发修改的情况。
工作流程
- 使用
MULTI
开始一个新的事务。 - 发送希望在事务中执行的命令序列。这些命令不是立即执行,而是被放入队列中。
- 最后使用
EXEC
提交事务,此时 Redis 会按顺序执行之前排队的所有命令,并返回每条命令的执行结果。 - 如果在事务期间决定不执行这些命令,可以使用
DISCARD
来取消事务。
MULTI
INCR foo
INCR bar
EXEC
上述例子中,foo
和 bar
的增量操作会被原子地执行,要么全部成功,要么全部失败(除非遇到某些特殊的错误情况)。
注意事项
-
无回滚机制:不同于传统数据库的事务,Redis 不支持回滚。如果事务中的某个命令执行失败,其余命令仍然会被执行。因此,应用程序层面需要对可能的错误进行处理。
-
乐观锁(WATCH):为了防止在事务执行过程中数据被其他客户端修改而导致的数据一致性问题,可以使用
WATCH
命令。这允许你监控一个或多个键,如果在EXEC
执行前这些键被其他客户端修改过,那么整个事务将会失败。
WATCH mykey
MULTI
INCR mykey
EXEC
在这个例子中,如果 mykey
在 WATCH
后到 EXEC
执行前被其他客户端修改了,EXEC
将返回 (nil)
表示事务未被执行。
总结
Redis 事务提供了一种方法来批量执行命令,确保这些命令作为一个整体被处理。虽然它缺乏传统数据库事务的完整功能集(如回滚),但对于许多应用场景来说,这种简单的事务模型已经足够,并且由于其简单性,通常能提供更好的性能表现。理解并正确使用 Redis 的事务特性可以帮助开发者构建更可靠的应用程序。
7.Redis 的数据类型及使用场景
Redis 支持多种数据类型,每种数据类型都有其特定的使用场景。以下是 Redis 的主要数据类型及其适用场景:
1. 字符串(String)
- 描述:最基本的数据结构,可以存储字符串、整数或浮点数。
- 适用场景:
- 缓存简单的值,如用户会话信息、配置设置等。
- 计数器应用,例如网站点击计数。
- 分布式锁实现。
2. 哈希(Hash)
- 描述:键值对的集合,适合用于存储对象。
- 适用场景:
- 存储用户资料、产品详情等结构化数据。
- 当需要更新对象的部分字段时非常有用,避免了整个对象的重写。
3. 列表(List)
- 描述:一个有序的字符串列表,可以从两端进行插入和删除操作。
- 适用场景:
- 实现队列系统,例如任务队列。
- 最近浏览记录、最新消息等时间序列数据。
- 简单的消息中间件。
4. 集合(Set)
- 描述:无序且不重复的字符串集合。
- 适用场景:
- 标签系统,为文章添加标签。
- 维护好友列表,确保每个用户只出现一次。
- 进行交集、并集、差集运算,适用于社交网络中的共同好友查找等功能。
5. 有序集合(Sorted Set)
- 描述:类似于集合,但每个元素关联了一个分数(score),通过分数排序。
- 适用场景:
- 排行榜系统,根据用户的积分来排名。
- 定时任务调度,根据任务执行的时间顺序排列。
- 按照优先级处理的任务队列。
6. Bitmaps
- 描述:实际上不是一种独立的数据类型,而是字符串类型的特殊形式,允许以位为单位进行操作。
- 适用场景:
- 用户在线状态跟踪,用一位表示一个用户是否在线。
- 统计活跃用户数量,例如每日登录用户数。
7. HyperLogLogs
- 描述:用于基数估计的算法,能够高效地估算集合中不同元素的数量。
- 适用场景:
- 统计唯一访客数量,而不需要精确计数。
- 大规模数据集中去重统计。
8. 地理空间索引(Geospatial Indexes)
- 描述:支持地理坐标的位置存储,并提供基于位置的服务功能。
- 适用场景:
- 附近地点搜索,如查找附近的餐馆或朋友。
- 路径规划,计算两点之间的距离。
总结
选择合适的数据类型对于最大化 Redis 的性能和效率至关重要。理解各种数据类型的特性和适用场景可以帮助你更有效地设计和实现应用程序。例如,当你需要快速查询最近的N条记录时,可以考虑使用列表;当需要处理具有唯一性要求的数据集合时,可以使用集合;而当你需要对数据项按照某种评分进行排序时,有序集合将是理想的选择。合理利用这些数据类型可以使你的 Redis 应用更加高效和灵活。
相关文章:
深入理解Redis:数据类型、事务机制及其应用场景
在当今快速发展的技术领域中,Redis作为一种高性能的内存数据库,已经被广泛应用于各种场景,从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性,如事务处理、持久化选项、高…...
RGMII(Reduced Gigabit Media Independent Interface)详解
一、RGMII的定义与作用 RGMII(精简版千兆介质无关接口)是一种用于千兆以太网(1Gbps)的高效接口标准,旨在减少传统GMII接口的引脚数量,同时保持相同的传输速率。其核心作用包括: 减少引脚数量&a…...
学习Flask:Day 1:基础搭建
学习目标:完成第一个Flask应用 # app.py from flask import Flask app Flask(__name__)app.route(/) def home():return <h1>Hello Flask!</h1>app.route(/api/greet/<name>) def greet(name):return {message: fHello {name}!}if __name__ __…...

XTOM工业级蓝光三维扫描仪在笔记本电脑背板模具全尺寸检测中的高效精准应用
——某3C精密制造企业模具优化与质量管控案例 镁合金具有密度小、强度高、耐腐蚀性好等优点,成为笔记本电脑外壳主流材料。冲压模具作为批量生产笔记本电脑镁合金背板的核心工具,其精度直接决定了产品的尺寸一致性、结构可靠性与外观品质。微米级模具误…...

网络安全 机器学习算法 计算机网络安全机制
(一)网络操作系统 安全 网络操作系统安全是整个网络系统安全的基础。操作系统安全机制主要包括访问控制和隔离控制。 访问控制系统一般包括主体、客体和安全访问政策 访问控制类型: 自主访问控制强制访问控制 访问控制措施: 入…...
分享些常用的工具类
一、照片 1、Unsplash:https://unsplash.com/ 2、pixabay:https://pixabay.com/zh/ 二、壁纸 1、Wallpaper Engine 2、wallhaven:https://wallhaven.cc/ 3、极简壁纸:https://bz.zzzmh.cn/ 三、AI语音 1、微软Azure项目&…...

VUE四:Vue-cli
什么是Vue-cli vue-cli是官方提供的一个脚手架,用于快速生成一个vue的项目模板; 预先定义好的目录结构及基础代码,就好比咱们在创建 Maven项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速; 什么是web pack 本质上&#…...
以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:
以下是针对 Vite TypeScript 项目的完整路径别名配置流程: 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...

LangGraph系列教程:基于状态构建上下文感知的AI系统
本文深入探讨LangGraph中的“状态”概念及其在AI工作流中的核心作用。通过基础状态(如计数器)和复杂状态(含消息历史)的定义,结合代码示例,演示如何通过函数式编程实现状态的不可变修改。然后进一步解析了如…...
图像处理、数据挖掘、数据呈现
目录 图像处理方法 阈值分割 图像处理方法 图像平滑 图像锐化 图像增强 阈值分割 边缘检测 阈值分割 特征提取 提取边界 区域提取 主成分压缩 POI 多源数据 数据挖掘 多源数据提取 关联度提取 位置集群, 新闻事件, 权限 个人喜好 历史…...

利用python和gpt写一个conda环境可视化管理工具
最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮…...
sort_values、sort 和 sorted 的区别与用法详解
sort_values、sort 和 sorted 是 Python 中用于排序的工具,但它们的适用场景和行为有所不同。以下是它们的区别和用法详解: 1. sort_values 适用对象 Pandas 的 Series 或 DataFrame。 功能 对 Pandas 数据结构中的值进行排序。 特点 专为 Pandas 设…...
银行系统功能架构设计元模型
1. 元模型核心目标 规范性:定义功能模块的标准化描述方式,便于跨团队协作。可复用性:抽象通用组件,减少重复开发。可扩展性:支持未来业务创新和技术升级(如开放银行API集成)。2. 元模型层级结构 采用分层架构模式,分为以下核心层级: **(1) 业务功能层** …...
rabbitmq 延时队列
要使用 RabbitMQ Delayed Message Plugin 实现延时队列,首先需要确保插件已安装并启用。以下是实现延时队列的步骤和代码示例。 1. 安装 RabbitMQ Delayed Message Plugin 首先,确保你的 RabbitMQ 安装了 rabbitmq-delayed-message-exchange 插件。你可…...

idea + Docker + 阿里镜像服务打包部署
一、下载docker desktop软件 官网下载docker desktop,需要结合wsl使用 启动成功的画面(如果不是这个画面例如一直处理start或者是stop需要重新启动,不行就重启电脑) 打包成功的镜像在这里,如果频繁打包会导致磁盘空间被占满,需…...
Vue 3 零基础入门:从计数器应用开始你的工程化之旅 - 深入理解 Vue 3 响应式系统
引言 欢迎来到 Vue 3 + 现代前端工程化 系列技术博客! 本系列博客旨在通过每日构建一个小项目,帮助您深入学习 Vue 3 的各项核心特性,并掌握现代前端工程化的实践技能。 在接下来的系列文章中,我们将从零开始,由浅入深,逐步构建一系列实用的小型应用。 今天,作为本系列…...

批量将手机照片修改为一寸白底证件照的方法
生活中经常需要用到一寸白底证件照,但每次去照相馆拍摄既费时又麻烦。其实,利用手机拍照和批量证件照生成工具,就能轻松批量修改手机照片为一寸白底证件照。 首先,在电脑浏览器中打开【报名电子照助手】,找到“批量证件…...

【Docker基础】理解 Docker:本质、性质、架构与核心组件
文章目录 Docker 本质Docker 的引擎迭代Docker 和虚拟机的区别Docker 为什么比虚拟机资源利用率高,速度快?Docker 和 JVM 虚拟化的区别Docker 版本1. LXC (Linux Containers)2. libcontainer3. Moby4. docker-ce5. docker-ee总结: Docker 架构…...
LeetCodehot 力扣热题100 全排列
这段代码的目的是计算给定整数数组的所有全排列(permutations),并返回一个包含所有排列的二维数组。 思路解析 在这段代码中,采用了 深度优先搜索(DFS) 和 回溯 的方法来生成所有的排列。 关键步骤…...
SQL笔记#数据更新
一、数据的插入(INSERT语句的使用方法) 1、什么是INSERT 首先通过CREATE TABLE语句创建表,但创建的表中没有数据;再通过INSERT语句向表中插入数据。 --创建表ProductIns CREATE TABLE ProductIns (product_id CHAR(4) NOT NULL,product_name VARCHAR(1…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...