Redis大Key问题全解析
1. 引言
1.1 什么是Redis大Key?
Redis大Key是指单个Key对应的数据量过大,占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种:
- String类型:单个字符串的长度过大。
- List类型:包含大量元素的列表。
- Hash类型:存储大量字段的哈希表。
- Set或ZSet类型:存储大量成员的集合或有序集合。
大Key并不直接导致系统问题,但其潜在影响和风险非常显著,尤其在生产环境中。
1.2 Redis大Key的危害
- 性能瓶颈:对大Key的读写操作可能占用过多的CPU资源,导致其他操作延迟。
- 阻塞问题:一次性删除大Key或迁移大Key时,Redis可能出现阻塞,从而影响整个服务。
- 内存压力:大Key会占用大量内存,增加内存碎片化的风险,并可能触发Redis的内存淘汰机制。
- 恢复缓慢:当需要从快照(RDB)或日志(AOF)中加载数据时,大Key会显著延长恢复时间。
1.3 为什么需要关注大Key问题?
在生产环境中,Redis被广泛用作缓存和数据库,如果忽略大Key问题,可能导致以下后果:
- 线上事故频发:由于Redis本身是单线程模型,大Key的操作会阻塞主线程,影响所有客户端请求。
- 业务中断:高延迟甚至不可用的情况会对业务造成直接损失。
- 运维复杂度增加:需要额外的监控和排查,增加了运维负担。
2. Redis大Key引发的线上事故场景
2.1 常见事故场景描述
-
操作大Key导致Redis阻塞
- Redis是单线程执行命令的,在操作大Key(如读取、更新或删除)时,单次命令可能需要较长时间完成,阻塞其他客户端请求。
- 例如:使用
DEL
删除一个包含数百万元素的List或Set时,操作可能耗时几秒甚至更久,导致其他请求无法响应。
-
大Key迁移时的性能问题
- 在Redis进行主从同步或数据迁移时,大Key的传输会占用大量带宽和时间。
- 如果迁移操作与正常业务请求同时进行,可能导致Redis服务性能大幅下降,甚至引发业务中断。
-
慢查询和超时的影响
- 对大Key执行复杂操作(如
LRANGE
、HGETALL
、ZRANGEBYSCORE
)时,操作时间会随着数据量的增长线性甚至指数级增加,可能触发慢查询或请求超时。 - 例如:一次性从一个包含百万条数据的List中获取范围数据,容易导致应用程序响应缓慢。
- 对大Key执行复杂操作(如
2.2 事故表现及影响
-
业务卡顿
- 用户请求无法及时得到响应,表现为接口延迟增加甚至超时。
- 对于高并发场景,这种情况会进一步放大,导致更多请求堆积。
-
系统不可用
- 阻塞问题可能让整个Redis实例无法响应请求,导致相关业务完全瘫痪。
- 如果Redis作为缓存使用,缓存不可用会给后端数据库带来极大压力,可能进一步引发数据库瓶颈。
-
难以快速恢复
- 在线上恢复过程中,删除或迁移大Key会进一步延长恢复时间。
- 大Key也会导致Redis内存碎片增加,可能需要触发
MEMORY FRAGMENTATION
的手动优化,进一步增加停机时间。
3. 如何发现Redis大Key
在排查Redis性能问题时,发现和定位大Key是解决问题的关键步骤。以下是一些常用的方法和工具,可以帮助识别和诊断Redis中的大Key。
1. 使用Redis命令行工具
-
MEMORY USAGE
- 作用:返回指定Key的内存占用大小(以字节为单位)。
- 示例:
MEMORY USAGE mykey
- 输出结果会显示该Key的大小,通过与其他Key对比,可以发现异常占用内存的大Key。
-
RANDOMKEY
- 作用:随机返回一个Key,用于抽样分析。
- 示例:
RANDOMKEY
- 配合
MEMORY USAGE
或DEBUG OBJECT
命令,可以抽样检查Key的大小和属性。
-
DEBUG OBJECT
- 作用:提供关于Key的详细调试信息,包括编码方式和元素个数。
- 示例:
DEBUG OBJECT mykey
- 输出信息中的
serializedlength
字段可作为判断Key大小的重要依据。
-
SCAN
命令- 作用:增量遍历Redis中的Key,适合在大数据量环境下使用。
- 示例:
SCAN 0 MATCH * COUNT 100
- 遍历过程中结合
MEMORY USAGE
或其他分析工具,可以识别出大Key。
2. 使用监控工具
-
Redis自带的慢查询日志
- 配置
SLOWLOG
参数,记录执行时间较长的命令。 - 示例:
SLOWLOG GET 10
- 通过分析慢查询日志,可以定位哪些操作耗时过长,并进一步确认是否因大Key导致。
- 配置
-
第三方监控平台
- Prometheus + Grafana:通过Redis Exporter收集监控数据,设置内存占用、命令执行时间等指标的报警规则。
- Datadog:可视化展示Redis实例的性能数据,包括每个Key的内存占用。
- 阿里云、腾讯云等云监控工具:对Redis实例进行实时分析,快速定位异常Key。
-
专用大Key扫描工具
- 开源工具如
redis-rdb-tools
:通过分析RDB文件识别大Key。 - 在线扫描工具:通过API或脚本对Key逐个检查,生成大Key列表。
- 开源工具如
3. 自定义脚本扫描大Key
编写脚本遍历Redis中的Key,并分析每个Key的大小和类型。例如,以下Python脚本使用redis-py
库扫描大Key:
import redisdef scan_large_keys(redis_client, size_threshold):cursor = '0'while cursor != 0:cursor, keys = redis_client.scan(cursor=cursor, count=100)for key in keys:key_size = redis_client.memory_usage(key)if key_size and key_size > size_threshold:print(f"Large key found: {key.decode('utf-8')} - {key_size} bytes")# 连接Redis
r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)
scan_large_keys(r, size_threshold=1_000_000) # 设置阈值为1MB
4. 定期巡检和自动化告警
-
定期巡检脚本
- 定时运行扫描脚本,生成大Key报告。
- 将结果输出到日志或发送邮件告警。
-
设置监控阈值
- 配置Redis监控指标,如单个Key的最大内存占用。
- 通过自动化告警(如邮件、短信、钉钉机器人)及时通知异常。
4. Redis大Key的解决方案
在发现大Key后,关键在于采取有效措施避免其对Redis性能造成影响。以下是Redis大Key问题的常见解决方案,覆盖预防、优化和操作大Key的实际场景。
1. 预防大Key的产生
-
设计良好的数据结构
在系统设计阶段,避免单个Key存储过多数据:- 避免过长的字符串:拆分过大的String数据。
- 限制集合大小:通过业务逻辑控制List、Set、Hash等集合类型的元素数量。
- 分层存储:将复杂的数据拆分为多个层次或多个Key,降低单个Key的压力。
-
合理使用TTL(过期时间)
为临时性数据设置合理的TTL,防止长期积累造成大Key:EXPIRE mykey 3600 # 设置Key 1小时后过期
-
写入时检查数据量
在写入数据时,检查数据大小或元素数量,提前拦截大Key生成。
2. 分解大Key
-
分片存储(Sharding)
- 如果一个List或Set数据量过大,可以通过分片技术将其拆分成多个Key:
list:0, list:1, list:2 ...
- 示例:存储用户订单数据时,可以按照用户ID进行分片。
- 如果一个List或Set数据量过大,可以通过分片技术将其拆分成多个Key:
-
使用哈希表优化存储
- 替代长列表或大字符串:
HSET user:1234:name "John" user:1234:age "30"
- 替代长列表或大字符串:
-
限制分页查询范围
- 对于需要分页读取的数据,限制返回的范围,例如:
LRANGE mylist 0 99 # 每次只读取100条
- 对于需要分页读取的数据,限制返回的范围,例如:
3. 操作大Key的优化
-
分步删除大Key
一次性删除大Key可能导致Redis阻塞。可以分步删除大Key,例如使用SCAN
命令逐步清理集合:def delete_large_key(redis_client, key):while True:elements = redis_client.spop(key, 100)if not elements:break
-
异步删除大Key
如果Redis支持UNLINK
命令,可以异步删除大Key,避免阻塞主线程:UNLINK mykey
-
分段处理大Key
对于操作大Key的命令,进行分段执行。例如读取一个大列表时,分批获取数据:LRANGE mylist 0 99 LRANGE mylist 100 199
4. Redis配置优化
-
调整内存策略
- 配置内存淘汰策略,如
volatile-lru
或allkeys-lru
,以便优先清理过期或较少使用的数据。 - 示例:
maxmemory-policy allkeys-lru
- 配置内存淘汰策略,如
-
合理分配内存
- 确保Redis实例有足够内存避免OOM。
- 定期检查和优化内存碎片,通过
INFO MEMORY
分析内存使用情况。
-
启用慢查询日志
配置慢查询日志参数,定期监控和优化执行耗时的命令:CONFIG SET slowlog-log-slower-than 10000 # 设置慢查询阈值为10ms
5. 针对特定场景的优化
-
批量写入优化
对于需要批量写入大Key的场景,使用流水线(Pipeline)技术减少网络延迟:pipeline = redis_client.pipeline() for item in data:pipeline.rpush('mylist', item) pipeline.execute()
-
延迟加载策略
对大Key采用延迟加载,避免一次性加载到内存。结合Lua脚本可以更高效地处理数据。 -
使用外部存储
如果某些数据量极大的Key需要长时间保存,可考虑将其迁移到外部存储(如MySQL、Elasticsearch)。
6. 优化案例
-
删除大Key的案例
- 问题:
DEL
操作卡死Redis实例。 - 解决:使用
UNLINK
异步删除,或分批删除,避免阻塞。
- 问题:
-
分页查询的优化案例
- 问题:
LRANGE
操作超时。 - 解决:将请求分批分页,结合Redis流水线批量获取数据。
- 问题:
-
分片存储的案例
- 问题:一个Set类型Key中有数百万数据,导致慢查询。
- 解决:按照业务逻辑对数据进行分片,将其拆分为多个Key,并进行并行操作。
5. Redis大Key引发线上事故的实战解决
通过对大Key问题的场景化分析,我们总结了几种常见的线上事故案例,以及针对这些问题的实际解决方案。以下是具体的案例分享。
案例1:线上服务因大Key删除导致卡顿
问题描述
某电商系统使用Redis存储用户的浏览记录(List类型),每个用户Key可能包含数十万条数据。系统在清理过期用户数据时,直接执行了以下操作:
DEL user:1234:history
结果Redis实例阻塞超过2秒,导致大批请求超时。
问题分析
DEL
命令在删除大Key时,会立即释放所有内存。由于删除过程在主线程中执行,导致其他操作被阻塞。- 用户浏览记录数据量大,删除时间远超Redis的单线程处理能力。
解决方案
-
使用异步删除:
UNLINK user:1234:history
异步删除将Key的删除过程交给后台线程,避免主线程阻塞。
-
分批删除大Key:
将大列表分片处理,避免一次性操作占用过多资源。def delete_large_key(redis_client, key, batch_size=100):while True:redis_client.ltrim(key, batch_size, -1)if redis_client.llen(key) == 0:redis_client.delete(key)break
案例2:数据迁移中的大Key问题
问题描述
在进行Redis主从切换时,主节点同步了一个包含数百万条数据的Set类型大Key,导致同步过程持续十几分钟,引发业务延迟。
问题分析
- Redis在主从同步时需要将大Key的数据序列化并通过网络传输。大Key的数据量大,传输时间过长。
- 同步过程中,主从状态不一致,影响了服务稳定性。
解决方案
-
分片存储大Key:
- 将Set拆分为多个小Key进行存储:
set:0, set:1, set:2 ...
- 将Set拆分为多个小Key进行存储:
-
手动迁移分片数据:
- 在迁移数据时,通过脚本分批同步分片Key,避免一次性传输数据过多。
-
RDB文件优化:
- 使用开源工具如
redis-rdb-tools
对RDB文件进行拆分处理,分批加载数据,减小单次迁移压力。
- 使用开源工具如
案例3:慢查询导致的服务性能下降
问题描述
某实时分析系统使用Redis存储用户行为数据,一个Key包含用户当天的所有事件(List类型)。在分析中,执行以下查询时,耗时超过5秒:
LRANGE user:events 0 1000000
问题分析
LRANGE
操作的时间复杂度为O(n),随着List长度的增加,查询时间大幅度延长。- 单线程Redis无法同时处理其他请求,导致全局性能下降。
解决方案
-
限制查询范围:
- 改为分页读取数据,每次只获取100条数据:
LRANGE user:events 0 99
- 改为分页读取数据,每次只获取100条数据:
-
分片存储:
- 按时间段拆分List,将用户行为数据按小时或天分片存储:
user:events:20241224, user:events:20241225 ...
- 按时间段拆分List,将用户行为数据按小时或天分片存储:
-
外部存储结合分析:
- 对于历史数据,将其从Redis迁移到如Elasticsearch或Hadoop进行分析,Redis仅保留实时数据。
案例4:大Key监控引发内存膨胀
问题描述
某团队定期使用MEMORY USAGE
命令扫描大Key,并将扫描结果存储在Redis中。由于记录了大量数据,最终导致Redis内存溢出。
问题分析
- 使用Redis存储监控结果时,没有对Key大小和数量进行限制。
- 监控本身引发了内存膨胀和性能下降。
解决方案
-
优化监控方式:
- 使用外部存储(如MySQL或文件系统)记录监控结果。
- 控制扫描频率,避免对Redis产生额外压力。
-
结果压缩和过期处理:
- 仅记录大Key的统计摘要而非全量数据。
- 对监控结果设置TTL,确保数据自动清理。
-
定期巡检和告警:
- 使用自动化脚本在离线环境定期扫描大Key,并配置告警规则。
6. 经验总结和最佳实践
在实际生产环境中,合理应对Redis大Key问题需要结合预防、监控和优化的多种手段。以下是一些经验总结和最佳实践,帮助开发和运维团队更高效地管理Redis系统。
1. 日常监控和巡检
-
定期检查大Key
- 使用脚本或监控工具定期扫描Redis中的大Key,发现潜在风险。
- 例如,设置监控脚本对Key的内存占用、元素数量等指标进行检查。
-
监控慢查询
- 配置
SLOWLOG
并定期分析日志,定位因大Key操作导致的慢查询:CONFIG SET slowlog-log-slower-than 10000 # 设置慢查询阈值为10ms
- 配置
-
自动化告警
- 使用Prometheus、Datadog等工具设置内存占用和执行时间的告警阈值。
- 实时监控Redis实例的QPS、内存、阻塞次数等指标,及时发现异常。
2. 合理的容量规划
-
限制单个Key的数据量
- 在业务逻辑中明确限制每个Key的最大数据量。例如,限制List类型的最大长度或String类型的最大大小。
-
分片存储设计
- 提前规划分片方案,将可能产生大Key的数据存储为多个小Key。
- 例如,使用Key的前缀(如
user:1
,user:2
)进行分片管理。
-
TTL策略
- 为非永久性数据设置TTL,防止数据长时间堆积形成大Key。
3. Redis使用的常见陷阱及规避方法
-
避免一次性操作大Key
- 不建议直接执行如
DEL
、LRANGE
、HGETALL
等操作在大Key上。 - 替代方案:分批操作、异步操作(如
UNLINK
)。
- 不建议直接执行如
-
操作命令选择
- 优先使用时间复杂度低的命令。例如,尽量避免使用
SMEMBERS
读取完整集合,可以使用SRANDMEMBER
随机读取。
- 优先使用时间复杂度低的命令。例如,尽量避免使用
-
预估命令执行时间
- 对高频和复杂的查询操作提前预估时间复杂度,避免高耗时操作影响Redis性能。
4. 工具和脚本的高效利用
-
使用开源工具
- 利用
redis-rdb-tools
分析RDB文件,快速发现大Key。 - 使用
redis-cli
配合脚本定期扫描、记录大Key。
- 利用
-
自定义监控脚本
- 定制化脚本结合
SCAN
、MEMORY USAGE
等命令,自动化识别大Key并记录异常。
- 定制化脚本结合
-
基于Lua脚本的操作优化
- 使用Lua脚本实现复杂操作,降低网络延迟,优化性能。例如:
local items = redis.call('LRANGE', KEYS[1], 0, 99) redis.call('LTRIM', KEYS[1], 100, -1) return items
- 使用Lua脚本实现复杂操作,降低网络延迟,优化性能。例如:
5. 团队协作和优化文化
-
开发和运维协作
- 开发团队在数据设计阶段需关注Redis的性能特点,避免不合理的数据模型。
- 运维团队需定期巡检Redis实例,评估存储结构是否符合业务需求。
-
性能优化文化
- 提倡提前预估数据量和操作复杂度,将Redis的性能问题作为系统设计的重要考量。
- 将Redis大Key优化纳入系统性能优化的日常工作。
7. 附录
在本文中提到的解决方案和工具中,很多都需要具体的脚本或命令支持。本附录提供了常用的Redis大Key排查和优化相关脚本示例,以及一些推荐的学习资料和工具链接。
7.1 常用Redis大Key排查脚本示例
-
批量扫描大Key
- 通过
SCAN
命令和MEMORY USAGE
统计所有Key的内存占用,并输出超出指定阈值的大Key。
import redisdef find_large_keys(redis_client, size_threshold=1_000_000):cursor = 0while True:cursor, keys = redis_client.scan(cursor=cursor, count=100)for key in keys:size = redis_client.memory_usage(key)if size and size > size_threshold:print(f"Large key: {key.decode()} - {size} bytes")if cursor == 0:breakif __name__ == "__main__":r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)find_large_keys(r)
- 通过
-
分步删除大Key
- 删除大Key时避免阻塞,逐步清理List或Set的元素。
def delete_large_key(redis_client, key, batch_size=100):while True:redis_client.ltrim(key, batch_size, -1)if redis_client.llen(key) == 0:redis_client.delete(key)breakif __name__ == "__main__":r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)delete_large_key(r, "large_list_key")
-
监控大Key生成
- 定时检查Redis实例中的大Key并生成报告。
while true; doredis-cli --scan | while read key; dosize=$(redis-cli memory usage "$key")if [ "$size" -gt 1000000 ]; thenecho "Large key detected: $key - $size bytes" >> large_keys.logfidonesleep 60 done
7.2 Redis性能优化的相关参考资料
-
Redis官方文档
- Redis Commands: 详细介绍了所有Redis命令的用法和性能注意事项。
- Redis Memory Optimization: 内存优化相关建议。
-
开源工具
redis-rdb-tools
: RDB文件分析工具,用于快速排查大Key和数据结构问题。redis-cli
: Redis自带的命令行工具,可用于排查问题和调试。
-
社区文章和博客
- Redis大Key问题的排查与解决: 深入解析Redis大Key问题的技术博客。
- 如何优化Redis性能: Redis性能优化的实战案例分享。
7.3 Lua脚本示例
-
批量删除大Key
local key = KEYS[1] local count = tonumber(ARGV[1]) for i = 1, count doredis.call("LPOP", key) end if redis.call("LLEN", key) == 0 thenredis.call("DEL", key) end
-
大Key数据迁移
- 将数据从一个Key迁移到多个分片Key。
local source = KEYS[1] local destination = KEYS[2] local batch_size = tonumber(ARGV[1]) local items = redis.call("LRANGE", source, 0, batch_size - 1) for i, item in ipairs(items) doredis.call("RPUSH", destination, item) end redis.call("LTRIM", source, batch_size, -1)
7.4 学习和实践建议
-
实验环境搭建
- 使用Docker快速搭建Redis测试环境:
docker run --name redis-test -d -p 6379:6379 redis
- 模拟生产环境中的大Key问题,测试优化方案的效果。
- 使用Docker快速搭建Redis测试环境:
-
团队内部分享
- 定期开展Redis技术分享会,总结大Key排查和优化经验。
- 编写团队内部Redis使用规范文档,避免常见问题。
-
持续学习
- 跟踪Redis的最新版本更新,了解新特性(如
UNLINK
、MEMORY USAGE
)。 - 参与Redis社区讨论,获取更多实战经验。
- 跟踪Redis的最新版本更新,了解新特性(如
相关文章:
Redis大Key问题全解析
1. 引言 1.1 什么是Redis大Key? Redis大Key是指单个Key对应的数据量过大,占用过多的内存或导致操作耗时较长的现象。大Key可以是以下几种常见数据类型中的任意一种: String类型:单个字符串的长度过大。List类型:包含…...
一起学Git【第六节:查看版本差异】
git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...
USB Hub 检测设备
系列文章目录 xHCI 简单分析 USB Root Hub 分析 USB Hub 检测设备 文章目录 系列文章目录一、引言二、hub_eventshub_port_connect_changeusb_alloc_devusb_set_device_statehub_port_initusb_new_device 一、引言 USB Hub 检测设备 一文中讲到,当有 USB 插入时&…...
Python 正则表达式
正则在线实用工具:regex101 正则表达式(regular expression)是一种用于匹配字符串中字符组合模式的工具。它可以用来检查一个字符串是否匹配某个模式、提取字符串中的信息、替换字符串中的某些部分等。 Python 的 re 模块提供了对正则表达式…...
【Mac】终端改色-让用户名和主机名有颜色
效果图 配置zsh 1.打开终端,进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…...
React 前端框架入门
这里写目录标题 React 前端框架入门什么是 React?核心特性基本概念1. JSX2. 组件3. State 和 Props4. 生命周期5. React Hooks React 应用示例项目结构如何启动 React 项目参考资料 React 前端框架入门 什么是 React? React 是由 Facebook 开发并开源的…...
复习打卡大数据篇——Hadoop YARN
目录 1.什么是yarn 2.yarn的三大角色 3.任务(MR)提交到YARN运行流程 4. 调度器Scheduler 5.YARN HA 高可用 1.什么是yarn YARN(Yet Another Resource Negotiator)是一个资源管…...
03.HTTPS的实现原理-HTTPS的工作流程
03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…...
idea部署maven项目步骤(图+文)
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…...
Eclipse 添加书签
Eclipse 添加书签 Eclipse 是一款非常受欢迎的集成开发环境(IDE),广泛用于 Java、C、Python 等语言的开发。在处理大型项目时,开发者通常需要在不同文件和代码行之间频繁切换。为了提高工作效率,Eclipse 提供了书签功…...
ROSboard:为您的机器人提供强大的Web可视化工具
ROSboard:为您的机器人提供强大的Web可视化工具 rosboard ROS node that turns your robot into a web server to visualize ROS topics [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ro/rosboard 项目介绍 ROSboard 是一个专为机器人设计的 Web 服…...
InnoDB引擎的内存结构
InnoDB擅长处理事务,具有自动崩溃恢复的特性 架构图: 由4部分组成: 1.Buffer Pool:缓冲池,缓存表数据和索引数据,减少磁盘I/O操作,提升效率 2.change Buffer:写缓冲区,…...
使用RTP 协议 对 H264 封包和解包,h264的avpacket和NAL的关系
学习内容: 本章探讨如何将h264的 avpacket的视频 数据,通过RTP协议发送到 流媒体 服务器 或者 对端接受者。 前提 我们在将 YUV数据变成avframe后,通过h264 编码变成AVPacket,例如,在安防项目中,或者直播…...
面试经典问题 —— 最大/小前K个数问题(top - K)问题
目录 常见思路更优的解法(面试官喜欢的) 常见思路 要选出最小的前K个数首先我们会想到排排升序建大堆,排降序建小堆 一个直观的想法是使用(小根堆),起始将所有元素放入堆中,然后再从堆中取出k 个…...
HNUST-数据分析技术课堂实验
1.要求 1,从下列第一、二、三组实验中各至少选取一个算法进行实验,选修组实验不作强制要求;2,实验过程不限,目标在于锻炼算法实现过程,即可采用C、C、Java、Python(建议)等任意语言编…...
HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?
在 iPhone 拍摄照片时,默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点,但在某些设备或软件上可能存在兼容性问题。因此,将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂…...
Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践
在现代 Web 应用中,性能优化直接影响用户体验和业务转化。Next.js 14 提供了多种内置的性能优化特性,今天我们就来深入探讨如何充分利用这些特性,以及一些实用的优化技巧。 图片和字体优化 1. 图片优化 Next.js 的 Image 组件供了强大的图…...
T-SQL语言的软件开发工具
T-SQL:微软SQL Server的强大工具 引言 在现代软件开发中,数据的管理与操作是不可或缺的一部分,而T-SQL(Transact-SQL)作为微软SQL Server的重要组成部分,承担着数据查询、数据操作、数据插入和数据删除等…...
Ubuntu环境 nginx.conf详解(二)
1、nginx.conf 结构详解: http 块:用于配置 HTTP 服务器的相关设置,包括处理 HTTP 和 HTTPS。 stream 块:用于配置 TCP/UDP 代理服务器,适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …...
【Linux】centos7安装php7.4
环境说明 本文档在服务器不能连接互联网的情况下,进行安装php7.4及其扩展。 操作系统:centos7.6 架构:X86_64 一、安装依赖(可选) 说明:服务器能联网就可以通过 yum install 命令下载对应php需要的依赖。…...
OpenHarmony-6.IPC/RPC组件
IPC/RPC组件机制 1.基本概念 IPC:设备内的进程间通信(Inter-Process Communication)。 RPC:设备间的进程间通信(Remote Procedure Call)。 IPC/RPC用于实现跨进程通信,不同的是前者使用Binder驱…...
自然语言处理与知识图谱的融合与应用
目录 前言1. 知识图谱与自然语言处理的关系1.1 知识图谱的定义与特点1.2 自然语言处理的核心任务1.3 二者的互补性 2. NLP在知识图谱构建中的应用2.1 信息抽取2.1.1 实体识别2.1.2 关系抽取2.1.3 属性抽取 2.2 知识融合2.3 知识推理 3. NLP与知识图谱融合的实际应用3.1 智能问答…...
Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对…...
【Java基础面试题028】Java中的hashCode和equals方法,与==操作符有什么区别?
回答重点 hashcode、equals 和 都是Java中用于比较对象的三种方式,但是它们的用途和实现还是有挺大区别的。 hashcode用于散列存储结构中确定对象的存储位置。可用于快速比较两个对象是否不同,因为如果它们的哈希码不同,那么它们肯定不相等…...
[ThinkPHP]5.0.23-Rce 1
[ThinkPHP]5.0.23-Rce 1 根据题目知道这是一个5.0.23的PHP RCE,话不多说直接上扫描器 检测出Payload url地址: ?scaptcha&test-1 Post表单参数: _method__construct&filter[]phpinfo&methodget&server[REQUEST_METHOD]1HackBar构造p…...
ByConity BSP 解锁数据仓库新未来
文章目录 前言BSP 模式简介基于 TPC-DS 的 ELT 活动测试环境登录 ECS数据查询配置 执行 02.sqlsql解释:1. 第一步:创建 wscs 临时表2. 第二步:创建 wswscs 临时表3. 第三步:对比 2001 年和 2002 年的数据子查询 1:提取…...
应对 Google Play 政策违规:开发者账号被终止解除指南
目录 解封指南 申诉文案 谷歌问题 授权书 1、授权书标题及双方信息 2、游戏信息 3、授权内容 4、双方义务与责任 5、费用与支付 5、保密条款 6、争议解决 8、其他条款 9、签字盖章 10、日期 相关推荐 解封指南 由于开发人员的疏忽,移除了读写权限的动态申请,使…...
【ES6复习笔记】Map(14)
概念 Map 是 JavaScript 中的一种数据结构,它允许你存储键值对,并且可以通过键来访问对应的值。在本教程中,我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。…...
重温设计模式--8、命令模式
文章目录 命令模式的详细介绍C 代码示例C代码示例2 命令模式的详细介绍 定义与概念 命令模式属于行为型设计模式,它旨在将一个请求封装成一个对象,从而让你可以用不同的请求对客户端进行参数化,将请求的发送者和接收者解耦,并且能…...
人工智能ACA(七)——计算机视觉基础
一、自然语言处理基本介绍 1. 自然语言处理的定义 1-1 自然语言 人类使用的在社会生活中自然形成的语言 1-2 自然语言处理 目标是让计算机能够理解、解析、生成和处理人类的自然语言 包含自然语言理解和自然语言生成两部分组成 2. 自然语言处理的发展趋势 3.自然语言处理…...
RCE常见姿势
文章目录 常见漏洞执行函数:1.系统命令执行函数2.代码执行函数 命令拼接符读取文件命令绕过:空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外…...
CSS系列(36)-- Containment详解
前端技术探索系列:CSS Containment详解 ⚡ 致读者:探索性能优化的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Containment,这个强大的性能优化特性。 基础概念 🚀 包含类型 /* 布局包含 */ .layo…...
golang,多个proxy拉包的处理逻辑
在Go语言中,当你设置了多个代理(GOPROXY)时,Go工具链会按照你设置的顺序尝试每个代理。如果第一个代理失败,它会尝试下一个代理,直到成功获取到模块或者所有代理都尝试失败。最后,如果所有代理都…...
Vue使用Tinymce 编辑器
目录 一、下载并重新组织tinymce结构二、使用三、遇到的坑 一、下载并重新组织tinymce结构 下载 npm install tinymce^7 or yarn add tinymce^7重构目录 在node_moudles里找到tinymce文件夹,把里面文件拷贝一份放到public下,如下: -- pub…...
神经网络-AlexNet
AlexNet是在2012年的ImageNet竞赛后,整理发表的文章,也是对CNN网络的衍生。 网络结构 AlexNet网络结构如下图所示,网络分为了上下两部分,对应两个不同的GPU训练,可以更好的利用GPU算力。只有在特殊的网络层后&#x…...
《人工智能:洞察材料微观与宏观性能关系的神奇之眼》
在材料科学的广袤天地里,一个前沿且充满魅力的课题正吸引着全球科研人员的目光——如何借助人工智能的强大力量,精准模拟材料微观结构与宏观性能之间那错综复杂的关系。这不仅是解开材料性能之谜的关键钥匙,更是推动从航空航天到电子芯片等众…...
count(1)、count(_)与count(列名)的区别?
大家好,我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别?】面试题。希望对大家有帮助; count(1)、count(_)与count(列名)的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中,…...
Docker 镜像加速访问方案
在数字化时代,Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起,Docker Hub 的访问速度较慢或不稳定,这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…...
菜鸟带新鸟——基于EPlan2022的部件库制作(3D)
设备逻辑的概念: 可在布局空间 中和其它对象上放置对象。可将其它对象放置在 3D 对象上。已放置的对象分到组件的逻辑结构中。 将此属性的整体标识为设备逻辑。可使用不同的功能创建和编辑设备逻辑。 设备的逻辑定义 定义 / 旋转 / 移动 / 翻转:组…...
笔记工具--MD-Markdown的语法技巧
MD格式,全称为Markdown格式,是一种轻量级标记语言文件,主要用于创建格式化文本。以下是对MD格式的详细解释: 一、定义与特点 定义:MD文件是一种纯文本格式的文件,使用简单的符号或语法来标记标题、列表、…...
【ES6复习笔记】生成器(11)
什么是生成器函数 生成器函数是一种特殊的函数,它可以在执行过程中暂停并保存当前状态,然后在需要时恢复执行。生成器函数通过 yield 关键字来实现暂停和恢复执行的功能。 生成器函数的基本用法 定义生成器函数:使用 function* 关键字来定…...
【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘
学习爬虫时,遇到如下报错: 报错原因: 正则表达式的 search 或 finditer 方法没有找到任何匹配项,可能是换行符处理不当等。 解决方法如下: 在正则表达式末尾加上re.S即可,re.S是一个编译标志,…...
UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化
一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...
机器学习系列(一)——K-近邻算法
1. 算法定义 KNN 算法属于基于实例的机器学习方法。在对未知数据进行分类或回归之前,我们不需要对数据进行显式的训练或建立复杂的模型。它的核心思想是:对一个新的样本点,寻找在特征空间上与其最相似的 K 个已知数据点,采取“投…...
Android unitTest 单元测试用例编写(初始)
文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest,而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…...
uni-app 跨端开发精美开源UI框架推荐
🎀🎀🎀uni-app 跨端开发系列 🎀🎀🎀 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …...
【微服务】微服务之Feign 与 Ribbon
文章目录 强烈推荐引言优点Feign示例什么是Ribbon?Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件(application.yml)说明: Feign 与 Ribbon 结合使用的应用场景1. 动态服…...
【C语言】成绩等级制
将成绩分为A、B、C、D、E等级。具体的等级划分如下: A:90分及以上B:80分到89分C:70分到79分D:60分到69分E:60分以下 #include <stdio.h> int main() {float score 0;printf("请输入学生成绩&a…...
Flutter 插件开发入门
1、初识 Flutter Plugin Flutter 的插件类似于我们在 Android 中说的第三方库,通过使用插件,可以借助插件中的代码实现一些额外功能。 Flutter 的插件以 package 的形式存在,使用 package 的目的是为了达到模块化,可以让代码被共…...
2024.12.25在腾讯云服务器上使用docker部署flask
2024.12.25在腾讯云服务器上使用docker部署flask 操作系统:Ubuntu 根据腾讯云的说明文档安装 Docker 并配置镜像加速源,注意需要安装腾讯云的加速源,使用官网的加速源连接极其不稳定,容易导致运行失败。使用哪个公司的云服务器就…...