>  기사  >  데이터 베이스  >  Redis bigkeys 명령 차단 문제를 해결하는 방법

Redis bigkeys 명령 차단 문제를 해결하는 방법

WBOY
WBOY앞으로
2023-05-28 13:22:061562검색

1. SF Express의 수석 개발 엔지니어가 온라인에서 위험한 Redis 명령을 실행하여 회사에 400만 달러의 손실을 입혔습니다.

Redis bigkeys 명령 차단 문제를 해결하는 방법

한 명령으로 인해 수백만 달러의 손실이 발생했습니다.

코드가 표준화되어 있지 않아서 동료들이 눈물을 흘렸습니다. 코딩할 때 주의하세요!

궁금해서 테스트해 보겠습니다. 무엇이 문제인가요?

2. 천만 데이터 성능 테스트

1. 천만 데이터 쓰기

스크립트 파일을 작성합니다.

for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;

작성 성공 여부는 /tmp/test1.txt를 통해 확인하세요. /tmp/test1.txt查看一下是否写入成功。

Redis bigkeys 명령 차단 문제를 해결하는 방법

2、写入Redis1000万数据

cat /tmp/test1.txt | redis-cli -a 111111 --pipe

Redis bigkeys 명령 차단 문제를 해결하는 방법

3、通过keys * 查看1000万数据

Redis bigkeys 명령 차단 문제를 해결하는 방법

4、通过配置文件禁止keys *的使用

在redis.conf文件中配置security:

  rename- command keys ""
  rename- command flushdb ""
  rename- command flushall ""

三、使用scan替代keys *

Redis Scan 命令用于迭代数据库中的数据库键。

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。

scan语法:

SCAN cursor [MATCH pattern] [COUNT count]

Redis bigkeys 명령 차단 문제를 해결하는 방법

四、拒绝bigkey

1、阿里云Redis开发规范

阿里云Redis开发规范中明确规定“拒绝bigkey(防止网卡流量、慢查询)”

String类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

2、出现bigkey时如何删除?

  1. String类型的用del删除。

  2. 其它类型使用hscan、sscan、zscan方式渐进式删除,同时要避免bigkey过期时间自动删除问题,因为它会造成主线程阻塞。

Hash 删除: hscan+hdel

public void delBigHash(String host, int port, String password, String bigHashKey) {
    Jedis jedis = new Jedis(host, port);
    if (password != null && !"".equals(password)) {
        jedis.auth(password);
    }
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
        List<Entry<String, String>> entryList = scanResult.getResult();
        if (entryList != null && !entryList.isEmpty()) {
            for (Entry<String, String> entry : entryList) {
                jedis.hdel(bigHashKey, entry.getKey());
            }
        }
        cursor = scanResult.getStringCursor();
    } while (!"0".equals(cursor));
    
    //删除 bigkey
    jedis.del(bigHashKey);
}

3、bigkey会造成哪些问题?

  1. 内存不均,集群迁移困难;

  2. 超时删除,阻塞线程;

  3. 网络流量阻塞;

4、如何发现bigkey?

(1)通过redis-cli --bigkeys

Redis bigkeys 명령이 차단하는 문제를 해결하는 방법

Redis bigkeys 명령 차단 문제를 해결하는 방법 2. Redis에 입력 1천만 데이터 쓰기

rrreee

이 문제를 해결하는 방법 Redis bigkeys 명령이 차단됩니다.

3. 키를 통해 1,000만 개의 데이터 보기 * Redis bigkeys 명령 차단 문제를 해결하는 방법

Redis bigkeys 명령이 문제 해결 방법을 차단합니다.🎜🎜4. 구성 파일을 통해 키* 사용을 금지합니다.🎜🎜redis.conf 파일에서 보안을 구성합니다.🎜rrreee🎜3. keys*🎜🎜Redis Scan 명령은 데이터베이스 데이터베이스 키의 키를 반복하는 데 사용됩니다. 🎜🎜SCAN 명령은 호출될 때마다 새 커서가 사용자에게 반환됩니다. 사용자는 다음 반복에서 이 새 커서를 SCAN 명령의 커서 매개 변수로 사용해야 합니다. 이전 반복 프로세스. 🎜🎜SCAN은 두 요소를 포함하는 배열을 반환합니다. 첫 번째 요소는 다음 반복을 위한 새 커서이고 두 번째 요소는 반복되는 모든 요소를 ​​포함하는 배열입니다. 새 커서가 0을 반환하면 반복이 종료되었음을 나타냅니다. 🎜🎜스캔 구문: 🎜rrreee🎜Redis bigkeys 명령 차단 문제를 해결하는 방법 🎜🎜4. Bigkey 거부🎜🎜1. Alibaba Cloud Redis 개발 사양🎜🎜Alibaba Cloud Redis 개발 사양에는 "Reject bigkey(네트워크 카드 트래픽 방지 및 쿼리 속도 저하를 위해)"가 명확하게 규정되어 있습니다. 🎜🎜문자열 유형은 10KB 이내로 제어되며, 해시, 리스트, 세트, ​​zset 요소의 개수는 5,000개를 초과할 수 없습니다. 🎜🎜2. 빅키가 나타나면 어떻게 삭제하나요? 🎜
  1. 🎜del을 사용하면 문자열 유형이 삭제됩니다. 🎜
  2. 🎜다른 유형은 점진적 삭제를 위해 hscan, sscan 및 zscan 방법을 사용합니다. 동시에 bigkey 만료 시간의 자동 삭제 문제는 메인 스레드를 차단하므로 피해야 합니다. . 🎜
🎜해시 삭제: hscan+hdel🎜rrreee🎜3. 빅키는 어떤 문제를 일으킬까요? 🎜
  1. 🎜불균일한 메모리, 어려운 클러스터 마이그레이션 🎜
  2. 🎜시간 초과 삭제, 스레드 차단 🎜
  3. 🎜네트워크 트래픽; 🎜
🎜 4. 빅키를 찾는 방법은 무엇인가요? 🎜🎜(1) redis-cli --bigkeys를 통해 검색하세요. 🎜🎜🎜🎜🎜(2) 각 키 값의 바이트 수를 계산하고 메모리 사용량 키를 통해 알아냅니다.🎜🎜🎜🎜

위 내용은 Redis bigkeys 명령 차단 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제