一、常见命令
1.1 过期时间意外丢失
原因:
SET命令如果不设置过期时间,那么Redis会自动【擦除】这个key的过期时间
1.2 DEL命令阻塞redis
- key是String类型时,DEL时间复杂度是O(1)
- key是List/Hash/Set/ZSet类型,DEL时间复杂度是O(M),M为元素数量
1.3 RANDOMKEY阻塞redis
RANDOMKEY命令会从redis中随机取出一个key,首先会检查这个key是否过期,如果已经过期,那么Redis会删除它,这个过程就是懒惰清理;
清理完之后,redis还要找出一个【不过期】的key,返回给客户端。
整个流程就是这样的:【在master执行RANDOMKEY】
-
master 随机取出一个 key,判断是否已过期
-
如果 key 已过期,删除它,继续随机取 key
-
以此循环往复,直到找到一个不过期的 key,返回
如果有大量key已经过期,还没来得及清理,这个循环就卡住了,耗时都花费在了清理过期key+寻找不过期key上。
【slave执行RANDOMKEY】
slave是不会主动清理过期key的,当一个key要过期时,master会先清理删除它,然后向slave发送一个DEL命令,告知slave也需要删除这个key,以此达到主从库的数据一致性。
1.4 SETBIT导致redis OOM
在使用setbit时,需要注意offset的大小,操作过大的offset也会引发redis的卡顿
1.5 MONITOR导致redis OOM
当执行monitor命令时,redis会把每条命令写到客户端的【输出缓冲区】中,然后客户端从这个缓冲区读取