Redis技术文章
-
Redis7.0的String类型未新增任何操作指令,所有内存优化均源于SDS编码策略的自动演进,如按长度动态选用sdshdr8/sdshdr16及预分配冗余空间,无需用户干预。260 收藏 -
空值缓存过期时间设太长会导致Redis内存耗尽。因空值key不被访问,LRU无法淘汰,且每个约占100–200字节,数量多时迅速撑满内存;安全TTL应为1–5秒,需匹配业务数据可见延迟,并配合布隆过滤器、前缀命名、LFU策略及监控告警综合防控。260 收藏 -
开启lazyfree-lazy-evictionyes且Redis≥6.0后,淘汰策略触发的内存释放由后台线程异步执行,主线程不再被同步释放大Key卡住。258 收藏 -
根本原因是客户端将从节点视为独立服务端并为每个从节点创建独立连接池。开启读写分离后,Jedis/Lettuce会主动发现并连接所有从节点,导致连接数激增、从库负载过高;解决关键是禁用客户端拓扑发现,改用代理层统一入口或手动控制连接复用。254 收藏 -
Redis7.0的io-threads仅加速socketread/write/RESP解析,不执行命令;盲目开启或多设线程数反致延迟上升、吞吐下降,需先确认瓶颈确在IO层而非主线程或内存带宽。251 收藏 -
SPOP是真正随机的,底层用Fisher-Yates变种算法对当前存在元素随机抽取;但因哈希表桶分布和短时随机种子偏差,可能感觉“不均匀”,非bug。250 收藏 -
min-slaves-to-write是主从切换丢数据时首要排查项,它控制主节点在合格从节点不足时拒绝写入,但需配合min-slaves-max-lag和真实复制状态(state=online、lag≤阈值)才生效。249 收藏 -
根本原因是sentineldown-after-milliseconds阈值过短,而主库执行耗时Lua脚本导致PING响应超时,哨兵误判为主观下线;典型表现为INFOreplication正常但日志频繁出现+sdown又快速恢复。247 收藏 -
Redis6.0+才正式支持volatile-lfu和allkeys-lfu,低版本会静默降级为LRU;需通过CONFIGGET/SET确认并热生效策略,商品Key须按粒度命名(如prod:sku:10086)并用INCR+EXPIRE维护热度,OBJECTFREQ返回0–255近似值仅适用于相对排序,不反映真实访问次数。245 收藏 -
Lettuce管道中flushCommands()仅发送命令不返回结果,正确做法是先保留各操作返回的RedisFuture,再调用get()或thenApply()获取响应。245 收藏 -
DEL命令清空List最快,时间复杂度O(1),原子且单次往返;LTRIM仅在小List中可用,O(N)且保留key;禁用LPOP循环,避免阻塞与残留;清空前需TYPE校验类型。244 收藏 -
LATENCYDOCTOR无法诊断atop导致的毛刺,因其只监控Redis内部延迟(如事件循环、命令执行、AOF写入),而atop-R读取/proc/pid/smaps触发的内核页表锁争用发生在内核态,Redis用户态线程无法感知。243 收藏 -
命中率低于75%(即keyspace_hits:keyspace_misses<3:1)时应调整淘汰策略,因缓存已无法有效分担数据库压力;需结合evicted_keys增速与keyspace_misses增速同步上升来确认问题根源。242 收藏 -
可行但仅适用于轻量场景;必须用EVAL执行Lua脚本原子完成“取+删”或“取+标记”,避免LPOP+DEL竞态导致重复消费或消息丢失。241 收藏 -
Redis发布订阅卡顿主因是客户端消费能力不足或连接资源耗尽,而非Redis服务端性能瓶颈;需隔离连接池、改用异步驱动+批处理+超时熔断,并在需可靠性时迁移到Stream。239 收藏