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

网站开发工具书网站建设注册

网站开发工具书,网站建设注册,营销公司有哪些,如何做网络推广人员引言 最近在项目里遇到一个棘手问题#xff1a;生产环境的Redis突然变“卡”了#xff01;查询延迟从几毫秒飙升到几百毫秒#xff0c;监控面板显示某个节点CPU使用率飙到90%。排查半天才发现#xff0c;原来是某个用户订单的Hash Key太大了——单Key存了100多万个订单字段…引言 最近在项目里遇到一个棘手问题生产环境的Redis突然变“卡”了查询延迟从几毫秒飙升到几百毫秒监控面板显示某个节点CPU使用率飙到90%。排查半天才发现原来是某个用户订单的Hash Key太大了——单Key存了100多万个订单字段直接把Redis主线程堵死了 这让我深刻意识到大Key是Redis的“隐形杀手”轻则导致接口超时重则拖垮整个集群。今天就来聊聊大Key的那些事儿以及如何高效拆分让你的Redis“轻装上阵”。 一、大Key到底有多坑 要解决问题得先搞懂问题。什么是大Key简单说单个Key的Value大小超过1MB官方建议阈值或者元素数量过多比如Hash的Field超10万、List/ZSet元素超10万都算大Key。 它为啥这么坑举个真实案例 网络阻塞客户端一次HGETALL要拉10MB数据网络带宽被占满其他请求全排队CPU爆炸Redis单线程处理大Key的序列化/反序列化CPU直接干到100%内存碎片大Key占用连续内存块删除后内存无法释放碎片率飙升主从同步卡主节点同步大Key到从节点时同步链路被阻塞主从延迟暴增。 之前我们线上就遇到过一个存储用户所有历史消息的List Key元素数量超50万执行LRANGE 0 -1直接把Redis实例“假死”了10秒监控告警狂响 二、如何快速定位大Key 定位大Key是拆分的第一步。别慌Redis自带工具一些小技巧就能搞定。 1. 官方命令redis-cli --bigkeys 最常用的方法一行命令扫描实例中的大Key redis-cli -h 127.0.0.1 -p 6379 --bigkeys输出会按类型string/hash/list等统计Top Key比如 # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed).[00.00%] Biggest string found so far user:1000:avatar with 1024000 bytes [00.01%] Biggest hash found so far order:1000 with 10485760 bytes⚠️ 注意生产环境扫描时加-i 0.1参数降低对Redis的压力每100次SCAN休眠0.1秒。 2. Redis Insight图形化工具 如果觉得命令行麻烦推荐用Redis官方的图形化管理工具Redis Insight。它有个“Memory Analyzer”功能能直观展示每个Key的内存占用和元素数量甚至能按数据库DB筛选新手友好度拉满 3. 自定义脚本SCAN 统计 如果需要更精细的控制比如只扫描某个DB可以用SCAN命令遍历所有Key结合TYPE、DEBUG OBJECT、HLEN等命令统计大小。举个Python脚本示例 import redisr redis.Redis(host127.0.0.1, port6379, db0) cursor 0 big_keys []while True:cursor, keys r.scan(cursorcursor, count100)for key in keys:key_type r.type(key).decode()if key_type string:size r.debug_object(key)[serializedlength]elif key_type hash:size sum(r.hlen(key) for _ in range(1)) # 实际需遍历所有field# 更准确的方式用memory usage命令Redis 4.0size r.memory_usage(key)# 类似处理list/set/zset...if size 1024 * 1024: # 超过1MBbig_keys.append((key, size))if cursor 0:breakprint(大Key列表, big_keys)三、拆分大Key的核心策略按业务逻辑“分家” 找到大Key后最关键的是如何拆分。拆分不是简单的“一刀切”得结合业务场景保证拆分后数据访问高效、一致。 1. String类型按字段或时间拆分 场景一个String存了用户的完整信息如JSON字符串体积10MB。 拆分思路 按业务字段拆把大JSON拆成多个小String比如user:1000:name、user:1000:age、user:1000:avatar_url。客户端查询时按需拉取单个字段减少网络传输。按时间拆如果String存的是历史数据如日志按时间范围拆比如log:user:1000:2024012024年1月日志、log:user:1000:2024022月日志。 注意如果必须整体读取比如需要原子性获取所有字段可以用压缩算法如Snappy先压缩Value再存储。Redis支持COMPRESS选项需客户端配合。 2. Hash类型按Field范围或哈希取模拆分 场景一个Hash存了用户的10万条订单order:1000Field是order_1、order_2…order_100000。 拆分思路 按时间范围拆把订单按月份分组比如order:1000:2024011月订单、order:1000:2024022月订单。客户端查询时先确定时间范围再访问对应Key。按哈希取模拆对Field名如order_1计算哈希值取模N比如N10拆分成order:1000:{hash%10}。这样可以将数据均匀分散到10个Key中避免新的热点。# 示例Fieldorder_123哈希取模10 field order_123 shard_id hash(field) % 10 # 结果0-9 new_key forder:1000:{shard_id}分层存储高频Field如最近3个月的订单放原Key低频Field如1年前的订单迁移到新Key如order:1000:archive。 3. List/ZSet/Set按业务属性或时间窗口拆分 场景一个List存了用户的50万条聊天消息chat:user:1000:msgsZSet存了10万用户的积分排名rank:global。 List拆分 按时间窗口拆消息按小时分组比如chat:user:1000:msgs:202406016月1日消息、chat:user:1000:msgs:202406026月2日消息。用Redis Stream替代如果是消息队列场景直接上Redis Stream它自动按消息ID分块存储支持消费者组并行消费天然避免大Key问题。 ZSet拆分 按分数范围拆比如积分排名前1万的放rank:global:0-100001-2万的放rank:global:10001-20000。查询时先确定分数区间再访问对应Key。按用户分组拆如果是全局排行榜拆成rank:game:1游戏1、rank:game:2游戏2如果是好友排行拆成rank:friend:user1000、rank:friend:user1001。 Set拆分 按成员前缀拆比如标签集合tag:fruit存了10万标签按首字母拆成tag:fruit:aa开头、tag:fruit:bb开头…元数据记录桶归属维护一个元Key如tag:bucket:map记录每个成员属于哪个桶如apple - tag:fruit:01客户端先查元Key再访问目标桶。 四、拆分落地从迁移到达效 拆分不是改个Key名就完事儿得一步步来避免数据丢失或业务中断。 1. 评估与准备 选低峰期操作避开业务高峰比如凌晨2点减少对用户的影响。通知相关方和前端、测试团队同步避免拆分期间客户端报错。 2. 数据迁移在线or离线 离线迁移适合数据量不大、业务允许短暂停机的场景。用redis-dump导出原Key数据再用脚本按策略写入新Key。# 导出大Key数据 redis-dump -h 127.0.0.1 -p 6379 -k order:1000 order_1000_dump.json # 导入到新Key按月份拆分 cat order_1000_dump.json | jq .data[] | .key | sub(order:1000; order:1000:\(.timestamp|strftime(%Y%m))) | redis-cli -h 127.0.0.1 -p 6379 --pipe在线迁移适合不能停机的场景。通过双写同步实现 客户端同时写入原Key和新Key比如写order:1000的同时按月份写order:1000:202401用Canal监听Redis Binlog同步增量数据到新Key观察一段时间比如1天确认数据一致后下线原Key。 3. 客户端适配 迁移完成后必须修改客户端代码让请求路由到新Key。举个Java示例 // 原代码直接访问大Key String oldKey order:1000; ListString orders redisTemplate.opsForHash().values(oldKey);// 拆分后按月份动态生成新Key LocalDateTime date ...; // 从订单中提取时间 String newKey order:1000: date.format(DateTimeFormatter.ofPattern(yyyyMMdd)); ListString orders redisTemplate.opsForHash().values(newKey);4. 验证与回滚 数据一致性用MD5校验原Key和新Key的哈希值比如redis-cli --bigkeys统计数量或用DBSIZE对比性能测试用redis-benchmark压测新Key确认QPS和延迟达标回滚方案保留原Key至少1周一旦出现问题能快速切回记得提前备份。 五、避坑指南这些坑我替你踩过了 避免过度拆分拆分后的Key数量不宜过多比如单个用户拆成100个Key否则客户端管理成本飙升还可能引发新的热点比如某个分片Key被频繁访问。监控新热点拆分后用Redis Insight或PrometheusGrafana监控新Key的QPS、内存使用防止某个分片突然变热比如按用户ID拆分后大V用户的Key被集中访问。慎用DEL删除大Key删除大Key时用UNLINK代替DELRedis 4.0支持UNLINK会异步回收内存避免阻塞主线程。 总结 大Key拆分的核心是按业务逻辑分散数据把“大而全”的Key拆成“小而精”的Key让Redis的资源内存、CPU、网络被更均衡地利用。记住拆分前先定位拆分时重兼容拆分后必验证。 下次再遇到Redis变慢的问题先想想是不是大Key在作怪按照这篇文章的方法分分钟搞定 如果本文对你有帮助欢迎点赞收藏也欢迎在评论区分享你的拆分经验
http://www.pierceye.com/news/980320/

相关文章:

  • 高端网站建设 杭州做效果图网站
  • 进贤县住房和城乡建设局网站短网址生成网站源码
  • 手机网站用二级目录做的弊端四川建设人员数据网站
  • 做网站什么类型好数据分析师培训需要多少钱
  • 建html5网站合作网站开发
  • 南通网站推广优化公司网站语言切换功能如何做
  • php网站开发案例论文临沂网站建设中企动力
  • 霸州做网站1766534168WordPress全局屏蔽谷歌
  • 织梦做的网站被黑了北京互联网排名
  • 专业seo整站优化专业建站教程
  • 网站建设合同注意点什么网站可以接设计方案
  • 青岛建设公司网站费用建网站的流程和费用
  • 徐州cms模板建站液压电机东莞网站建设
  • 阿里巴巴国际站运营工作内容北京软件开发公司排行榜最新
  • 电子商务网站的开发流程包括泉州seo建站
  • 微信h5商城网站开发米拓模板网站建设
  • 品牌网站设计案例wordpress 实例
  • 郑州大学科技园手机网站建设wordpress 新手指南
  • 国外免费建站网站搭建南阳网站排名优化报价
  • 中国排名高的购物网站免费软件下载网站有哪些
  • 云服务器做视频网站石家庄软件定制开发
  • 好的外贸网站的特征如何快速的制作h5页面
  • 徐州建站程序南京制作网页培训学校
  • 广州市服务好的网站制作排名北京网站建设公司哪个最好
  • 网站调用谷歌地图灌云网站制作
  • 做的网站能撤掉吗济南好的网站建设公司排名
  • 北京智能建站系统价格江西省住房建设厅统计网站
  • 中山建设网站官网郑州做网站排名公司
  • 怎么把自己做的网站放到百度上网页该如何推广
  • 军事网站大全军事网金蝶软件公司官网