业务场景: redis数据切换到Oracle,取消持久化,redis只做缓存
具体需求: 从redis从库里获得了400w个无过期时间的hashkey,需要在主库中将其删除
矛盾点: 1.如果直接批量删除会导致redis拥塞,影响正常业务 2.如果每删除一个key,sleep50ms,不会影响业务,但是根据经验要跑两天
最终问题: 在不影响性能的情况下,怎么快速批量删除redis数据?
人生最曼妙的风景,竟是内心的淡定与从容!
Redis는 키를 매우 빠르게 삭제하므로 400만 개의 키도 문제가 되지 않습니다. 병목 현상이 실제로 네트워크에 있는 것으로 의심됩니다.
키를 하나씩 삭제하면 명령을 보낼 때마다 클라이언트가 redis의 응답을 기다리게 되어 네트워크 대역폭이 많이 낭비됩니다.
파이프라인/트랜잭션을 사용해 볼 수 있습니다. Redis 측의 네트워크 대역폭을 포화시키지 않고 최대 속도로 명령을 전송한 후 즉시 실행합니다.
이 방법이 작동하지 않으면 Lua 스크립트를 작성하여 쓸모 없는 키를 식별 및 삭제하고 이를 redis로 보낸 후 eval로 실행할 수 있습니다. 이로 인해 네트워크가 차단되어서는 안 됩니다.
그래도 비즈니스에 영향을 미치는 경우. . 궁극적인 해결책은 마스터/슬레이브를 생성하고, 슬레이브에서 키를 삭제하고, 마스터를 사용하여 요청을 처리하는 것입니다. 키를 삭제한 후 슬레이브를 마스터로 승격한 후 요청을 전송합니다.
redis의 eval 명령을 사용해 보세요.
예를 들어 old-fashioned로 시작하는 모든 키를 삭제합니다.
한 번의 삭제로 많은 성능이 소모된다면 일괄 삭제를 고려해 볼 수 있습니다.
제 생각엔 심야 2시에 삭제해도 될 것 같아요. 24시가 아닌 이상 이 시간에 사용하는 사람이 많지 않을 것 같아요. Baidu Taobao와 같은 시간당 트래픽 웹사이트! 감사할 필요는 없습니다. 제 이름은 레이펑입니다
으아악
Redis 3.4부터 시작:
Redis는 키를 매우 빠르게 삭제하므로 400만 개의 키도 문제가 되지 않습니다. 병목 현상이 실제로 네트워크에 있는 것으로 의심됩니다.
키를 하나씩 삭제하면 명령을 보낼 때마다 클라이언트가 redis의 응답을 기다리게 되어 네트워크 대역폭이 많이 낭비됩니다.
파이프라인/트랜잭션을 사용해 볼 수 있습니다. Redis 측의 네트워크 대역폭을 포화시키지 않고 최대 속도로 명령을 전송한 후 즉시 실행합니다.
이 방법이 작동하지 않으면 Lua 스크립트를 작성하여 쓸모 없는 키를 식별 및 삭제하고 이를 redis로 보낸 후 eval로 실행할 수 있습니다. 이로 인해 네트워크가 차단되어서는 안 됩니다.
그래도 비즈니스에 영향을 미치는 경우. . 궁극적인 해결책은 마스터/슬레이브를 생성하고, 슬레이브에서 키를 삭제하고, 마스터를 사용하여 요청을 처리하는 것입니다. 키를 삭제한 후 슬레이브를 마스터로 승격한 후 요청을 전송합니다.
redis의 eval 명령을 사용해 보세요.
예를 들어 old-fashioned로 시작하는 모든 키를 삭제합니다.
으아아아한 번의 삭제로 많은 성능이 소모된다면 일괄 삭제를 고려해 볼 수 있습니다.
제 생각엔 심야 2시에 삭제해도 될 것 같아요. 24시가 아닌 이상 이 시간에 사용하는 사람이 많지 않을 것 같아요. Baidu Taobao와 같은 시간당 트래픽 웹사이트! 감사할 필요는 없습니다. 제 이름은 레이펑입니다
으아악
Redis 3.4부터 시작:
으아악