顾乔芝士网

持续更新的前后端开发技术栈

腾讯技术面:一条Redis命令是如何执行的?直接挂了…

“Redis又崩了?

凌晨三点,群里一句哀嚎,比闹钟还提神。

别急着骂运维,八成是架构没选对。

单机当生产用,主从没配哨兵,集群却拿来做缓存——踩坑姿势年年翻新,Redis背锅侠永远在线。

先拆个最痛的:为什么同一条set命令,本地毫秒级,线上能卡到秒?

答案藏在事件循环里。

Redis表面单线程,其实6.0之后偷偷开了I/O线程,读和写外包出去,主线程只负责“算账”。

如果客户端一次性灌几千条大key,I/O线程瞬间塞满,主线程排队等解析,延迟直接起飞。

解决也简单:

- 把大key砍成小key,别让单条value超过1 MB;

- 客户端加pipeline,一次打包百条命令,减少往返;

-监控里把“instantaneous_input_kbps”拉出来,飙红就报警,比事后翻slowlog痛快。

再说高可用。

很多团队把哨兵当摆设,三个哨兵节点全扔同一台宿主机,宿主机一挂,哨兵集体失联,主从切换失败,业务雪崩。

真想救命,哨兵至少跨机架,最好跨可用区。

云厂商给的托管版Redis直接做多活,跨城延迟也能压到5ms以内,省得自己折腾。

持久化二选一?

成年人全都要。

RDB恢复快,但丢数据;AOF不丢,但文件膨胀。4.0之后的混合持久化,先RDB打底,再追加增量AOF,重启时先加载RDB,再重放AOF尾巴,既快又稳。

唯一注意:AOF重写别放在高峰期,IO打满照样卡哭。

内存碎片常被人忽略。

jemalloc确实比glibc省,但长连接+频繁update,碎片率还是能飙到30%。

线上实测:把maxmemory-policy从volatile-lru改成allkeys-lfu,碎片率直接掉一半,命中率还涨了3%。

原因?

LFU把冷数据踢得更干净,内存池更平整。

模块玩法现在越来越野。

-RedisJSON一把梭,直接把MongoDB的活抢了,嵌套文档查询延迟压到亚毫秒;

-RediSearch做商品搜索,倒排索引放内存,分词+过滤+排序一条龙,秒杀MySQLlike '%关键词%'的噩梦。

唯一门槛:模块版本必须和Redis主版本对齐,升级前先在测试环境跑两周压测,别线上直接梭哈。

云原生时代,Operator成了新玩具。

K8s里一条yaml就能拉起三主三从的集群,节点挂了自动重建,PV跟着走,数据不丢。

但别高兴太早,Operator默认的resource limit只有100 mCPU+128Mi,压测一上QPS直接被打回POD重启。

经验值:给每个Redis节点至少2核4G,limits和requests写一样,避免节点被kubelet OOM kill。

最后留一个私货:

如果业务只是简单缓存,且QPS<1万,真没必要上集群。

一台8核32 G的虚拟机,主从+哨兵,配好监控和告警,足够扛90%场景。

省下的预算,拿去请团队喝奶茶,比折腾分布式快乐多了。

Redis不复杂,复杂的是人总想用它解决所有问题。

选对模式,盯紧指标,少点炫技,多点敬畏,凌晨三点的群才会安静。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言