深入理解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作为一种高性能的内存数据库,已经被广泛应用于各种场景,从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性,如事务处理、持久化选项、高…...
JVM生产环境问题定位与解决实战(三):揭秘Java飞行记录器(JFR)的强大功能
提到飞行记录器,或许你的脑海中并未立刻浮现出清晰的画面,但一说起“黑匣子”,想必大多数人都能恍然大悟,知晓其重要性及用途。在航空领域,黑匣子作为不可或缺的设备,默默记录着飞行过程中的每一项关键数据…...
MongoDB私人学习笔记
俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是ZooKeeper3.4.9版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。 一、基础知识…...
Ant Design按钮样式深度适配:实现<Button>与<a>标签颜色完美同步
Ant Design按钮样式深度适配:实现与标签颜色完美同步 问题现象诊断 组件结构原型 <Button type"link" disabled{disabled}><a href"...">下载</a> </Button>样式冲突表现 状态按钮颜色链接颜色视觉问题启用态Ant蓝…...
linux下软件安装、查找、卸载
目录 常见安装方式有三种: 1.源码安装。 2.rpm安装方式。 3.yum/apt工具级别安装。 对于前两种安装方式,因为软件可能有依赖关系(安装的软件依赖于某些库,而这些库又依赖于某些库,这些都需要手动安装)…...
鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar)
鸿蒙开发深入浅出01(基本环境搭建、页面模板与TabBar) 1、效果展示2、下载 DevEco Studio3、创建项目4、新建页面模板5、更改应用信息6、新建以下页面7、Index.ets8、真机运行9、图片资源文件 1、效果展示 2、下载 DevEco Studio 访问官网根据自己的版本…...
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片
【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片 根据您的需求,目前需要了解以下几个关键点及分步解决方案: --- 一、现状分析 1. Ollama 的限制: - 目前Ollama主要面向文本大模型,原生不支持直接上传/处理图片 …...
微信小程序源码逆向 MacOS
前言 日常工作中经常会遇到对小程序的渗透测试,微信小程序的源码是保存在用户客户端本地,在渗透的过程中我们需要提取小程序的源码进行问题分析,本篇介绍如何在苹果电脑 MacOS 系统上提取微信小程序的源码。 0x01 微信小程序提取 在苹果电…...
2025年2月科技热点深度解析:AI竞赛、量子突破与开源革命
引言 2025年的科技领域持续呈现爆发式增长,AI大模型竞争白热化、量子计算商业化加速、开源工具生态繁荣成为本月最受关注的议题。本文结合最新行业动态,从技术突破、商业布局到开发者生态,全面解析当前科技热点,为读者提供深度洞…...
Wireshark简单教程
1.打开Wireshark,点击最上面栏目里面的“捕获”中的“选项” 2.进入网卡选择界面,选择需要捕获的选择,这里我选择WLAN 3.双击捕获选择出现下面界面 4.点击如下图红方框即可停止捕获 5.点击下图放大镜可以进行放大 6.你也可以查询tcp报文如下图...
stm32单片机个人学习笔记16(SPI通信协议)
前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...
面试题——简述Vue 3的服务器端渲染(SSR)是如何工作的?
面试题——简述Vue3的服务器端渲染(SSR)是如何工作的? 服务器端渲染(SSR)已经成为了一个热门话题。Vue 3,作为一款流行的前端框架,也提供了强大的SSR支持。那么,Vue 3的SSR究竟是如何…...
Ubuntu 22.04安装K8S集群
以下是Ubuntu 22.04安装Kubernetes集群的步骤概要 一、设置主机名与hosts解析 # Master节点执行 sudo hostnamectl set-hostname "k8smaster" # Worker节点执行 sudo hostnamectl set-hostname "k8sworker1"# 所有节点的/etc/hosts中添加: ca…...
Ubuntu搭建esp32环境 配置打开AT指令集 websocket功能
1,搭建前提 环境搭建参考乐鑫官网给的本地编译 ESP-AT 工程方法 因为公司电脑和网络的特殊性,不能正确解析域名(仅在浏览器上可以访问) ,所以这边访问的时候改成了ssh 未了避免使用外网困难的问题,这里用…...
java八股文-消息队列
一、MQ基础篇 1. 什么是消息队列? 消息队列(MQ)是分布式系统中实现异步通信的中间件,解耦生产者和消费者。 2. 使用场景有哪些? 异步处理(如注册后发送邮件)系统解耦(不同服务通过…...
[晕事]今天做了件晕事65,gcc,cmake, pragam
文章目录 晕事cmake,unity,对gcc pragma指令有没有影响pragma指令的影响pragma指令的使用规范使用注意事项:晕事 最近在某些不能有优化的函数前加了指令 #pragma GCC optimize ("O0")我记得是这个指令只影响当前编译单元。 但是被人找上来了, 因为这个文件所牵…...
SAP-ABAP:使用ST05(SQL Trace)追踪结构字段来源的步骤
ST05 是 SAP 提供的 SQL 跟踪工具,可以记录程序运行期间所有数据库操作(如 SELECT、UPDATE、INSERT)。通过分析跟踪结果,可以精准定位程序中结构字段对应的数据库表。 步骤1:激活ST05跟踪 事务码 ST05 → 点击 Activa…...
STM32--SPI通信讲解
前言 嘿,小伙伴们!今天咱们来聊聊STM32的SPI通信。SPI(Serial Peripheral Interface)是一种超常用的串行通信协议,特别适合微控制器和各种外设(比如传感器、存储器、显示屏)之间的通信。如果你…...
cpu、mem监控
deepseek 1、安装依赖2、psutil库3、streamlit库4、实战4.1 单机CPU和内存使用率监控4.2 多机CPU和内存使用率监控 1、安装依赖 /usr/bin/python3 -m pip install psutil streamlit2、psutil库 psutil是一个跨平台的Python库,用于获取系统使用情况的信息…...
工程实践中常见的几种设计模式解析及 C++ 实现
工程实践中常见的几种设计模式解析及 C 实现 在软件工程中,设计模式是一种通用的解决方案,用于解决常见问题和优化代码结构。它们通过提供一种规范化的编程思想,帮助开发者写出更高效、可维护和可扩展的代码。本文将介绍几种在工程实践中常见…...
ollama在linux上进行部署——离线安装说明
1. 官网下载ollama压缩包 https://ollama.com/download/ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz #解压安装 2. 添加systemctl服务启动文件 添加服务文件:/etc/systemd/system/ollama.service [Unit] DescriptionOllama …...
(一)趣学设计模式 之 单例模式!
目录 一、啥是单例模式?二、为什么要用单例模式?三、单例模式怎么实现?1. 饿汉式:先下手为强! 😈2. 懒汉式:用的时候再创建! 😴3. 枚举:最简单最安全的单例&a…...
基于无人机遥感的烟株提取和计数研究
一.研究的背景、目的和意义 1.研究背景及意义 烟草作为我国重要的经济作物之一,其种植面积和产量的准确统计对于烟草产业的发展和管理至关重要。传统的人工烟株计数方法存在效率低、误差大、难以覆盖大面积烟田等问题,已无法满足现代烟草种植管理的需求…...
在windows下安装windows+Ubuntu16.04双系统(上)
这篇文章的内容主要来源于这篇文章,给文章很详细的介绍了如何从windows下安装windowsubuntu16.04双系统。我刚开始装双系统都是参照这个方法,该作者前后更新了两个版本,在这里对其稍微进行整理一下。 一、准备:(这里推…...
TensorFlow 是一个由 Google 开发的开源机器学习库
TensorFlow 是一个由 Google 开发的开源机器学习库,被广泛应用于深度学习和人工智能领域。它的基本概念包括以下几点: 张量(Tensors):在 TensorFlow 中,数据的基本单位是张量,它类似于多维数组或…...
C++ day4 练习
一、练习1 找到第一天mystring练习,实现以下功能: mystring str "hello"; mystring ptr "world"; str str ptr; str ptr; str[0] H; 【代码】: #include <iostream> #include <cstring> #include &l…...
利用机器学习实现实时交易欺诈检测
以下是一个基于Python的银行反欺诈AI应用示例代码,演示如何利用机器学习实现实时交易欺诈检测。该示例使用LightGBM算法训练模型,并通过Flask框架构建实时检测API: python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preproc…...
基于Hadoop的汽车大数据分析系统设计与实现【爬虫、数据预处理、MapReduce、echarts、Flask】
文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍爬虫数据概览HIve表设计Cars Database Tables 1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distri…...
安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?
一、AugmentOS:AI可穿戴的“操作系统革命” 2025年2月3日,Vuzix与AI人机交互团队Mentra联合推出的AugmentOS,被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统,通过三大突破重新定义了AI可穿戴…...
蓝桥杯之日期题
文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛,涵盖多个赛道,常见的有软件类(如 C/C 程序设计、Java 软件开发、Python 程序设计)和电子类(…...
sklearn中的决策树-分类树:实例-分类树在合成数据集上的表现
分类树实例:分类树在合成数据集上的表现 代码分解 在不同结构的据集上测试一下决策树的效果(二分型,月亮形,环形) 导入 import numpy as np from matplotlib import pyplot as plt from matplotlib.colors import Li…...
es-head(es库-谷歌浏览器插件)
1.下载es-head插件压缩包,并解压缩 2.谷歌浏览器添加插件 3.使用...
AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自动收发消息)
1.本地部署 1.1 ollama Ollama软件通过其高度优化的推理引擎和先进的内存管理机制,显著提升了大型语言模型在本地设备上的运行效率。其核心采用了量化技术(Quantization)以降低模型的计算复杂度和存储需求,同时结合张量并行计算&…...
kotlin 知识点 七 泛型的高级特性
对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的,因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化,就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前,Java 是没有泛型功能的,…...
正则表达式–断言
原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…...
OceanBase数据库实战:Windows Docker部署与DBeaver无缝对接
一、前言 OceanBase 是一款高性能、高可扩展的分布式数据库,适用于大规模数据处理和企业级应用。 随着大数据和云计算的普及,OceanBase 在企业数字化转型中扮演着重要角色。学习 OceanBase 可以帮助开发者掌握先进的分布式数据库技术,提升数…...
C++:开胃菜练习项目---定长内存池的实现以及测试
项目介绍 简介 作为学习tcmalloc高并发内存池项目前的一个铺垫。 作为程序员(C/C)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能…...
【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)
【LLM】本地部署LLM大语言模型可视化交互聊天,附常见本地部署硬件要求(以OllamaOpenWebUI部署DeepSeekR1为例) 文章目录 1、本地部署LLM(以Ollama为例)2、本地LLM交互界面(以OpenWebUI为例)3、本…...
JVM相关面试题
1. 类加载与双亲委派机制 聊一下你对类加载器的理解。 类加载器是JVM用来加载类文件到内存的组件。它负责将字节码文件解析为java.lang.Class实例,并存储到运行时数据区的方法区中。类加载器分为Bootstrap ClassLoader、Extension ClassLoader和Application ClassLo…...
WordPress Course Booking System SQL注入漏洞复现 (CVE-2025-22785)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
二:前端发送POST请求,后端获取数据
接着一:可以通过端口访问公网IP之后 二需要实现:点击飞书多维表格中的按钮,向服务器发送HTTP请求,并执行脚本程序 向服务器发送HTTP请求: 发送请求需要明确一下几个点 请求方法: 由于是向服务器端发送值…...
Go语言中的信号量:原理与实践指南
Go语言中的信号量:原理与实践指南 引言 在并发编程中,控制对共享资源的访问是一个经典问题。Go语言提供了丰富的并发原语(如sync.Mutex),但当我们需要灵活限制并发数量时,信号量(Semaphore&am…...
cpp中的继承
一、继承概念 在cpp中,封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类(也就是基类)的基础上创建新类(派生类或者子类),从而实现代码的复用。 如上图所示,Person是基类&…...
3DGS(三维高斯散射)与SLAM技术结合的应用
3DGS(三维高斯散射)与SLAM(即时定位与地图构建)技术的结合,为动态环境感知、高效场景建模与实时渲染提供了新的可能性。以下从技术融合原理、应用场景、优势挑战及典型案例展开分析: 一、核心融合原理 1. …...
DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级
在近两年由AI引发的生产力革命的背后,一场关乎数字世界秩序的攻防战正在上演:AI生成的深度伪造视频导致企业品牌声誉损失日均超千万,批量生成的侵权内容使版权纠纷量与日俱增,黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…...
mybatis 细节(${ ..}和#{..},resultType 和 resultMap的区别,别名的使用,Mapper 代理模式)
${..}和#{..} 占位符 #{..} #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。 <!-- 根据id查询用户信息 --> <select id"findUserById" parameterType"int" resultType"user"&g…...
电子科技大学考研复习经验分享
电子科技大学考研复习经验分享 本人情况:本科就读于电科软院,24年2月开始了解考研,24年3月开始数学,9月决定考本院(开始全天候图书馆学习)并开始专业课学习,11月底开始政治学习,最后…...
【python】提取word\pdf格式内容到txt文件
一、使用pdfminer提取 import os import re from pdfminer.high_level import extract_text import docx2txt import jiebadef read_pdf(file_path):"""读取 PDF 文件内容:param file_path: PDF 文件路径:return: 文件内容文本"""try:text ext…...
Selenium 与 Coze 集成
涵盖两者的基本概念、集成步骤、代码示例以及相关注意事项。 基本概念 Selenium:是一个用于自动化浏览器操作的工具集,支持多种浏览器(如 Chrome、Firefox 等),能够模拟用户在浏览器中的各种操作,如点击、输入文本、选择下拉框等,常用于 Web 应用的自动化测试。Coze:它…...
SQL注入(order by,limit),seacms的报错注入以及系统库的绕过
1:如果information_schema被过滤了,该怎么绕过 1.1:介绍一下information_schema这个库 information_schema 是一个非常重要的系统数据库,它在SQL标准中定义,并且被许多关系型数据库管理系统(RDBMS&#x…...