> Java > java지도 시간 > Redis에서 데이터를 삭제하는 방법은 무엇입니까?

Redis에서 데이터를 삭제하는 방법은 무엇입니까?

藏色散人
풀어 주다: 2020-09-19 11:56:06
원래의
16065명이 탐색했습니다.

요구 사항 변경으로 인해 이전 프로젝트에서는 Redis에 저장된 데이터 형식을 수정해야 했습니다. 새 패키지가 출시된 후 이전 데이터가 새 데이터에 삽입되는 것을 방지합니다. 따라서 게시하기 전에 오래된 데이터를 모두 삭제해야 합니다. 현재 redis는 여러 비즈니스가 포함된 공개 클러스터입니다. 그러면 다른 기업의 사용에 영향을 주지 않고 어떻게 대량의 오래된 데이터(라이브러리의 총 키 수는 현재 1,200만 개)를 삭제할 수 있는지에 대한 의문이 생깁니다.

Redis에서 데이터를 삭제하는 방법은 무엇입니까?

###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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿