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问题,可能导致以下后果:

  1. 线上事故频发:由于Redis本身是单线程模型,大Key的操作会阻塞主线程,影响所有客户端请求。
  2. 业务中断:高延迟甚至不可用的情况会对业务造成直接损失。
  3. 运维复杂度增加:需要额外的监控和排查,增加了运维负担。

2. Redis大Key引发的线上事故场景

2.1 常见事故场景描述
  1. 操作大Key导致Redis阻塞

    • Redis是单线程执行命令的,在操作大Key(如读取、更新或删除)时,单次命令可能需要较长时间完成,阻塞其他客户端请求。
    • 例如:使用DEL删除一个包含数百万元素的List或Set时,操作可能耗时几秒甚至更久,导致其他请求无法响应。
  2. 大Key迁移时的性能问题

    • 在Redis进行主从同步或数据迁移时,大Key的传输会占用大量带宽和时间。
    • 如果迁移操作与正常业务请求同时进行,可能导致Redis服务性能大幅下降,甚至引发业务中断。
  3. 慢查询和超时的影响

    • 对大Key执行复杂操作(如LRANGEHGETALLZRANGEBYSCORE)时,操作时间会随着数据量的增长线性甚至指数级增加,可能触发慢查询或请求超时。
    • 例如:一次性从一个包含百万条数据的List中获取范围数据,容易导致应用程序响应缓慢。
2.2 事故表现及影响
  1. 业务卡顿

    • 用户请求无法及时得到响应,表现为接口延迟增加甚至超时。
    • 对于高并发场景,这种情况会进一步放大,导致更多请求堆积。
  2. 系统不可用

    • 阻塞问题可能让整个Redis实例无法响应请求,导致相关业务完全瘫痪。
    • 如果Redis作为缓存使用,缓存不可用会给后端数据库带来极大压力,可能进一步引发数据库瓶颈。
  3. 难以快速恢复

    • 在线上恢复过程中,删除或迁移大Key会进一步延长恢复时间。
    • 大Key也会导致Redis内存碎片增加,可能需要触发MEMORY FRAGMENTATION的手动优化,进一步增加停机时间。

3. 如何发现Redis大Key

在排查Redis性能问题时,发现和定位大Key是解决问题的关键步骤。以下是一些常用的方法和工具,可以帮助识别和诊断Redis中的大Key。

1. 使用Redis命令行工具
  1. MEMORY USAGE

    • 作用:返回指定Key的内存占用大小(以字节为单位)。
    • 示例:
      MEMORY USAGE mykey
      
    • 输出结果会显示该Key的大小,通过与其他Key对比,可以发现异常占用内存的大Key。
  2. RANDOMKEY

    • 作用:随机返回一个Key,用于抽样分析。
    • 示例:
      RANDOMKEY
      
    • 配合MEMORY USAGEDEBUG OBJECT命令,可以抽样检查Key的大小和属性。
  3. DEBUG OBJECT

    • 作用:提供关于Key的详细调试信息,包括编码方式和元素个数。
    • 示例:
      DEBUG OBJECT mykey
      
    • 输出信息中的serializedlength字段可作为判断Key大小的重要依据。
  4. SCAN命令

    • 作用:增量遍历Redis中的Key,适合在大数据量环境下使用。
    • 示例:
      SCAN 0 MATCH * COUNT 100
      
    • 遍历过程中结合MEMORY USAGE或其他分析工具,可以识别出大Key。
2. 使用监控工具
  1. Redis自带的慢查询日志

    • 配置SLOWLOG参数,记录执行时间较长的命令。
    • 示例:
      SLOWLOG GET 10
      
    • 通过分析慢查询日志,可以定位哪些操作耗时过长,并进一步确认是否因大Key导致。
  2. 第三方监控平台

    • Prometheus + Grafana:通过Redis Exporter收集监控数据,设置内存占用、命令执行时间等指标的报警规则。
    • Datadog:可视化展示Redis实例的性能数据,包括每个Key的内存占用。
    • 阿里云、腾讯云等云监控工具:对Redis实例进行实时分析,快速定位异常Key。
  3. 专用大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进行分片。
  • 使用哈希表优化存储

    • 替代长列表或大字符串:
      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-lruallkeys-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的单线程处理能力。
解决方案
  1. 使用异步删除:

    UNLINK user:1234:history
    

    异步删除将Key的删除过程交给后台线程,避免主线程阻塞。

  2. 分批删除大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的数据量大,传输时间过长。
  • 同步过程中,主从状态不一致,影响了服务稳定性。
解决方案
  1. 分片存储大Key

    • 将Set拆分为多个小Key进行存储:
      set:0, set:1, set:2 ...
      
  2. 手动迁移分片数据

    • 在迁移数据时,通过脚本分批同步分片Key,避免一次性传输数据过多。
  3. RDB文件优化

    • 使用开源工具如redis-rdb-tools对RDB文件进行拆分处理,分批加载数据,减小单次迁移压力。
案例3:慢查询导致的服务性能下降
问题描述

某实时分析系统使用Redis存储用户行为数据,一个Key包含用户当天的所有事件(List类型)。在分析中,执行以下查询时,耗时超过5秒:

LRANGE user:events 0 1000000
问题分析
  • LRANGE操作的时间复杂度为O(n),随着List长度的增加,查询时间大幅度延长。
  • 单线程Redis无法同时处理其他请求,导致全局性能下降。
解决方案
  1. 限制查询范围

    • 改为分页读取数据,每次只获取100条数据:
      LRANGE user:events 0 99
      
  2. 分片存储

    • 按时间段拆分List,将用户行为数据按小时或天分片存储:
      user:events:20241224, user:events:20241225 ...
      
  3. 外部存储结合分析

    • 对于历史数据,将其从Redis迁移到如Elasticsearch或Hadoop进行分析,Redis仅保留实时数据。
案例4:大Key监控引发内存膨胀
问题描述

某团队定期使用MEMORY USAGE命令扫描大Key,并将扫描结果存储在Redis中。由于记录了大量数据,最终导致Redis内存溢出。

问题分析
  • 使用Redis存储监控结果时,没有对Key大小和数量进行限制。
  • 监控本身引发了内存膨胀和性能下降。
解决方案
  1. 优化监控方式

    • 使用外部存储(如MySQL或文件系统)记录监控结果。
    • 控制扫描频率,避免对Redis产生额外压力。
  2. 结果压缩和过期处理

    • 仅记录大Key的统计摘要而非全量数据。
    • 对监控结果设置TTL,确保数据自动清理。
  3. 定期巡检和告警

    • 使用自动化脚本在离线环境定期扫描大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

    • 不建议直接执行如DELLRANGEHGETALL等操作在大Key上。
    • 替代方案:分批操作、异步操作(如UNLINK)。
  • 操作命令选择

    • 优先使用时间复杂度低的命令。例如,尽量避免使用SMEMBERS读取完整集合,可以使用SRANDMEMBER随机读取。
  • 预估命令执行时间

    • 对高频和复杂的查询操作提前预估时间复杂度,避免高耗时操作影响Redis性能。
4. 工具和脚本的高效利用
  • 使用开源工具

    • 利用redis-rdb-tools分析RDB文件,快速发现大Key。
    • 使用redis-cli配合脚本定期扫描、记录大Key。
  • 自定义监控脚本

    • 定制化脚本结合SCANMEMORY USAGE等命令,自动化识别大Key并记录异常。
  • 基于Lua脚本的操作优化

    • 使用Lua脚本实现复杂操作,降低网络延迟,优化性能。例如:
      local items = redis.call('LRANGE', KEYS[1], 0, 99)
      redis.call('LTRIM', KEYS[1], 100, -1)
      return items
      
5. 团队协作和优化文化
  • 开发和运维协作

    • 开发团队在数据设计阶段需关注Redis的性能特点,避免不合理的数据模型。
    • 运维团队需定期巡检Redis实例,评估存储结构是否符合业务需求。
  • 性能优化文化

    • 提倡提前预估数据量和操作复杂度,将Redis的性能问题作为系统设计的重要考量。
    • 将Redis大Key优化纳入系统性能优化的日常工作。

7. 附录

在本文中提到的解决方案和工具中,很多都需要具体的脚本或命令支持。本附录提供了常用的Redis大Key排查和优化相关脚本示例,以及一些推荐的学习资料和工具链接。

7.1 常用Redis大Key排查脚本示例
  1. 批量扫描大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)
    
  2. 分步删除大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")
    
  3. 监控大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性能优化的相关参考资料
  1. Redis官方文档

    • Redis Commands: 详细介绍了所有Redis命令的用法和性能注意事项。
    • Redis Memory Optimization: 内存优化相关建议。
  2. 开源工具

    • redis-rdb-tools: RDB文件分析工具,用于快速排查大Key和数据结构问题。
    • redis-cli: Redis自带的命令行工具,可用于排查问题和调试。
  3. 社区文章和博客

    • Redis大Key问题的排查与解决: 深入解析Redis大Key问题的技术博客。
    • 如何优化Redis性能: Redis性能优化的实战案例分享。
7.3 Lua脚本示例
  1. 批量删除大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
    
  2. 大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 学习和实践建议
  1. 实验环境搭建

    • 使用Docker快速搭建Redis测试环境:
      docker run --name redis-test -d -p 6379:6379 redis
      
    • 模拟生产环境中的大Key问题,测试优化方案的效果。
  2. 团队内部分享

    • 定期开展Redis技术分享会,总结大Key排查和优化经验。
    • 编写团队内部Redis使用规范文档,避免常见问题。
  3. 持续学习

    • 跟踪Redis的最新版本更新,了解新特性(如UNLINKMEMORY USAGE)。
    • 参与Redis社区讨论,获取更多实战经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易语言 OCR 文字识别

一.引言 文字识别,也称为光学字符识别(Optical Character Recognition, OCR),是一种将不同形式的文档(如扫描的纸质文档、PDF文件或数字相机拍摄的图片)中的文字转换成可编辑和可搜索的数据的技术。随着技…

基于SpringBoot的蜗牛兼职网的设计与实现

一、项目背景 随着社会的快速发展,计算机的影响是全面且深入的。人们生活水平的不断提高,日常生活中人们对蜗牛兼职网方面的要求也在不断提高,需要兼职工作的人数更是不断增加,使得蜗牛兼职网的开发成为必需而且紧迫的事情。蜗牛…

shardingsphere分库分表项目实践5-自己用java写一个sql解析器+完整项目源码

前1节我们介绍了 shardingsphere 分表分库的sql解析与重写: shardingsphere分库分表项目实践4-sql解析&重写-CSDN博客 那么shardingsphere sql 解析底层究竟是怎么实现的呢,其实它直接用了著名的开源软件 antlr . antlr 介绍: ANTLR&a…

光谱相机与普通相机的区别

一、成像目的 普通相机:主要目的是记录物体的外观形态,生成人眼可见的、直观的二维图像,重点在于还原物体的形状、颜色和纹理等视觉特征,以供人们进行观赏、记录场景或人物等用途。例如,拍摄旅游风景照片、人物肖像等…

TiDB 的MPP架构概述

MPP架构介绍: 如图,TiDB Server 作为协调者,首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换,让表连接在一个TiFlash上。另外 TiFlash会作为计算节点,每个TiFlash都负责数据交换,表连接…

渗透Vulnhub-Solidstate靶机

本篇文章旨在为网络安全渗透测试行业靶机教学。通过阅读本文,读者将能够对渗透Vulnhub系列Solidstate靶机有定的了解 一、信息收集阶段 靶机官网:https://www.vulnhub.com/entry/solidstate-1%2C261/ 因为靶机为本地部署虚拟机网段,查看dhcp…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation?基本结构after 参数的作用问题背景:传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

两分钟掌握 TDengine 全部写入方式

1. 背景 TDengine 写入过程会涉及很多概念,这些概念目前你是不是还一团乱,参数绑定写入、无模式写入、websocket 写入、RESTFUL 写入 、各种连接器写入等等一堆的写入,都是做什么的,不明白,这里花两分钟时间给你彻底整…

快速理解24种设计模式

简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…

数据可视化echarts学习笔记

目录,介绍 知识储备 一端操作,多端联动的效果(开启了多个网页,操作一端,多个网页的效果会跟着改变) cmd命令控制面板返回上一级或上上级 在当前目录打开文件: cd 文件名 在Windows命令提示符&am…

OpenCV相机标定与3D重建(30)过滤二值图像中的小斑点函数filterSpeckles()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在视差图中过滤掉小的噪声斑点(speckles)。 cv::filterSpeckles 是 OpenCV 库中的一个函数,用于过滤图像或视…

C语言期末复习笔记(中)

目录 五、选择控制结构 1.算法中的概念及描述方法 2.关系运算符和逻辑表达式 3.条件运算符和条件表达式 4.两种多分支if 5.switch语句 6.逻辑运算符和逻辑表达式 六、循环控制结构 1.控制循环的方式 2.控制非法输入 3.选择三种循环的一般原则 4.猜数游戏 5.嵌套循环…

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…

MySQL和HBase的对比

Mysql :关系型数据库,主要面向 OLTP ,支持事务,支持二级索引,支持 sql ,支持主从、 Group Replication 架构模型(此处以 Innodb 为例,不涉及别的存储引擎)。 HBase &am…

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…

【软件工程】十万字知识点梳理 | 期末复习专用

原创文章,禁止转载。 文章目录 图CRC卡片用例图类图状态图活动图泳道图软件质量因素自顶向下集成自底向上集成人员与工作量之间的关系时序图关键路径软件结构基本路径测试判定表数据流图(DFD)体系结构设计问题数据字典挣值分析等价划分程序流程图PAD | N-S燃尽图甘特图对象模…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册,可以看到我们只要完成下面函数的实现,就可以完成移植。我们这里只移植前5个函数,获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

Redis - Token JWT 概念解析及双token实现分布式session存储实战

Token 定义:令牌,访问资源接口(API)时所需要的资源凭证 一、Access Token 定义:访问资源接口(API)时所需要的资源凭证,存储在客户端 组成 组成部分说明uid用户唯一的身份标识time…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注,这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究,取得了一系列成果。 本文汇…

imgproxy图像处理的高效与安全

摘要 imgproxy作为一个高效且安全的独立服务器,为图像处理提供了全新的解决方案。它不仅简化了图像调整和转换的过程,还极大地提升了处理速度,确保了整个流程的安全性。通过集成imgproxy,用户可以轻松优化网页上的图像,提高加载速度,改善用户体验。本文将深入探讨imgpro…