요구 사항 변경으로 인해 이전 프로젝트에서는 Redis에 저장된 데이터 형식을 수정해야 했습니다. 새 패키지가 출시된 후 이전 데이터가 새 데이터에 삽입되는 것을 방지합니다. 따라서 게시하기 전에 오래된 데이터를 모두 삭제해야 합니다. 현재 redis는 여러 비즈니스가 포함된 공개 클러스터입니다. 그러면 다른 기업의 사용에 영향을 주지 않고 어떻게 대량의 오래된 데이터(라이브러리의 총 키 수는 현재 1,200만 개)를 삭제할 수 있는지에 대한 의문이 생깁니다.
###redis 데이터를 일괄 삭제하는 일반적인 방법:
삭제할 데이터의 키를 알고 있는 경우 redis-cli /usr/local/redis/의 del 명령을 사용할 수 있습니다. bin/redis-cli del 키를 사용하거나 다른 고급 언어에 해당하는 redis 패키지 또는 라이브러리를 사용할 수도 있습니다. 예를 들어 java의 jedis, python
java: jdeis.del(key) python: redis.delete(key)
의 redis 라이브러리 삭제하려는 데이터의 키를 알 수 없는 경우 특정 패턴을 만족하는 키만 알 수 있습니다. 이 경우 특정 패턴에 맞는 키를 찾으려면 redis의 키 명령을 사용해야 합니다
접두사에 맞는 키를 모두 찾으려면 video
/usr/local/redis/bin/redis-cli keys video_*
Linux의 xargs를 사용하여 배치를 완료하면 됩니다. 삭제 /usr/local/redis/bin/ redis-cli 키 video* | xargs /usr/local/redis/bin/redis-cli del 3. 삭제할 데이터가 라이브러리의 모든 데이터인 경우 다음을 사용할 수 있습니다. 전체 라이브러리를 지우려면 flashdb /usr/local/redis/bin/ redis-cli flashdb
###여러 방법에 대한 설명
첫 번째 방법은 특정 키에 대한 명확한 지식이 필요합니다
key 명령을 사용하세요. 라이브러리의 데이터 양이 너무 크면 키 명령이 다른 모든 Redis 요청을 차단합니다. 의심할 여지 없이 이 접근 방식은 공용 Redis 클러스터에는 권장되지 않습니다. 물론 구체적인 비즈니스 요구 사항도 고려해야 합니다. 그래도 문제가 해결되지 않으면 비즈니스 트래픽이 상대적으로 적을 때 삭제 스크립트를 실행할 수도 있습니다.
flushdb를 사용하면 전체 라이브러리의 데이터가 정리됩니다.
###내 솔루션 온라인 Redis 클러스터는 matser-slave 구조를 사용합니다. 따라서 요청을 차단하는 키 명령을 슬레이브 노드에서 실행하여 특정 접두사를 충족하는 모든 키를 찾을 수 있습니다. 그런 다음 셸 스크립트나 고급 언어를 사용하여 마스터 노드의 데이터를 삭제합니다.
#접두사가 video, album, actor인 모든 키를 가져와서 /data/keys.txt
#!/bin/bash
keys=('video' 'album' 'actor'); host='localhost'; port='6378'; for key in ${keys[@]}; do cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} keys gal.video.${key}* >> /data/keys.txt"; echo ${cmd}; eval ${cmd}; done; # 根据前面生成的key,删除数据 #!/bin/bash host='localhost'; port='6378'; file="/data/keys.txt"; i=0; cat ${file} | while read key; do let i=i+1; cmd="/usr/local/redis/bin/redis-cli -h ${host} -p ${port} del ${key}"; echo "line:"${i}",cmd:"${cmd}; eval ${cmd}; done;
Script 2는 del 명령을 하나씩 보냅니다. 실행 효율성이 상당히 낮습니다. 테스트에서는 1시간 동안 약 120만 개의 데이터가 삭제됐다. 10시간 안에 1,200만 개의 항목을 삭제해야 합니다! ! ! 각 요청을 보내는 데 걸리는 시간을 고려하여 Redis 파이프라인을 사용하여 일괄 제출을 구현하는 것을 생각했습니다.
__author__ = 'litao' from redis import Redis host="127.0.0.1" port=6379 db=0 r =Redis(host,port,db) pl=r.pipeline() per_pipe_size=10000 count=0 file = open("/data/keys.txt") print "start del all keys in "+file.name while 1: lines = file.readlines(10000) if not lines: break for key in lines: key=key.strip('\n') pl.delete(key) count=count+1 if(count==per_pipe_size): count=0 pl.execute() pl.execute() file.close() print 'finish del all keys'
개선된 스크립트 2는 온라인 실행에 약 2분밖에 걸리지 않습니다! !
위 내용은 Redis에서 데이터를 삭제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!