ฉันจะลบทุกสิ่งใน Redis ได้อย่างไร


710

ฉันต้องการลบกุญแจทั้งหมด ฉันต้องการให้ทุกอย่างถูกล้างออกและให้ฐานข้อมูลเปล่าแก่ฉัน

มีวิธีทำเช่นนี้ในลูกค้าRedisหรือไม่?


3
ฉันสงสัยว่าทำไมdel *ไม่ทำงาน มันส่งคืน 0.
Chloe

1
รีสตาร์ทเซิร์ฟเวอร์ Redis จะล้างข้อมูลทั้งหมดในนั้นหรือไม่? @Timex
AATHITH RAJENDRAN

คำตอบ:


1177

ด้วย Redis-cli:

  • FLUSHDB - ลบคีย์ทั้งหมดจากฐานข้อมูลปัจจุบันของการเชื่อมต่อ
  • FLUSHALL - ลบคีย์ทั้งหมดจากฐานข้อมูลทั้งหมด

ตัวอย่างเช่นในเปลือกของคุณ:

redis-cli flushall

1
(error) LOADING Redis is loading the dataset in memoryเมื่อฉันพยายามดังกล่าวข้างต้นที่ฉันได้รับข้อผิดพลาดดังต่อไปนี้ คุณช่วยระบุได้ไหม
Ram Patra

4
@Ramswaroop - คุณรีสตาร์ท Redis และขณะนี้กำลังโหลดข้อมูลจากที่จัดเก็บข้อมูลถาวร ในขณะที่กระบวนการนี้ (โหลด) ใช้งานอยู่คุณไม่สามารถจัดการฐานข้อมูลได้ รอให้เสร็จหรือตั้งค่า Redis อีกครั้งโดยไม่มีการคงอยู่และเริ่มต้นใหม่ (มันจะเริ่มต้นว่างเปล่าดังนั้นคุณไม่จำเป็นต้องทำ FLUSHALL ทันทีที่มันหมด)
Itamar Haber

@ ItamarHaber ขอบคุณสำหรับความช่วยเหลือฉันก็คิดออกเหมือนกัน
Ram Patra

1
@ ไม่เช่นนั้นหากคุณไม่มีไลบรารี่ของลูกค้า redis ใน C # คุณสามารถเรียกใช้คำสั่งนั้นได้เช่น: (new Process { StartInfo = new ProcessStartInfo { FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true }}).start();
Christian

2
ใช้การ-hตั้งค่าสถานะเพื่อระบุตำแหน่งเซิร์ฟเวอร์ redis
Adam F

194

หัวขึ้นที่FLUSHALLอาจ overkill FLUSHDBเป็นหนึ่งในการล้างฐานข้อมูลเท่านั้น FLUSHALLจะล้างเซิร์ฟเวอร์ทั้งหมด เช่นเดียวกับในทุกฐานข้อมูลบนเซิร์ฟเวอร์ เนื่องจากคำถามเกี่ยวกับการล้างฐานข้อมูลฉันคิดว่านี่เป็นความแตกต่างที่สำคัญพอที่จะได้คำตอบแยกต่างหาก


4
+1 จากฉันฉันคิดว่านี่เป็นคำตอบที่ดีกว่าจริง ๆ ได้รับคำถามของ OP บอกว่า "ลบทุกอย่างออก" แต่ตามมาด้วย "ให้ฐานข้อมูลเปล่า" - ไม่ว่าเขาหมายถึงอะไรจริง ๆ ฉันคิดว่าความแตกต่างที่คุณทำมีประโยชน์มาก
doug

28

คำตอบจนถึงถูกต้องอย่างแน่นอน; พวกเขาลบกุญแจทั้งหมด

อย่างไรก็ตามหากคุณต้องการลบสคริปต์Luaทั้งหมดออกจากอินสแตนซ์ Redis คุณควรปฏิบัติตาม:

แปรงล้างหน้า

OP ถามสองคำถาม; สิ่งนี้จะเสร็จสิ้นคำถามที่สอง ( ทุกอย่างถูกลบทิ้ง)


4
ไม่เขาถามคำถามหนึ่งข้อและในช่วงสองปีที่ผ่านมาขอบเขตใน Redis เพิ่มขึ้น คำถามของ OP เกี่ยวกับการลบคีย์โดยเฉพาะ คุณกำลังตอบคำถามที่แตกต่างจากคำถามนี้
ตั๋วเงินจริง

15
@TheRealBill คุณต้องคิดเกี่ยวกับสิ่งที่มีประโยชน์สำหรับผู้อ่าน SO ปัจจุบันและอนาคต คำตอบที่นี่ไม่ได้อยู่ OP ของI want everything wiped out and give me a blank database.คำถามอีกต่อไป ดังนั้นอิมโฮการเพิ่มของฉันเป็นสิ่งที่ดีซึ่งช่วยคนไม่กี่คน รู้สึกอิสระที่จะไม่เห็นด้วยกับหลักสูตรนั่นเป็นสิ่งที่เป็นเรื่องเกี่ยวกับ
Tw Bert

2
บริบทคือทุกสิ่งและประโยคแรกสร้างขึ้น: "ฉันต้องการลบคีย์ทั้งหมด" การเขียนคำถามใหม่เพื่อให้คำตอบที่แตกต่างไม่ใช่สิ่งที่ฉันบอกดังนั้นเป็นเรื่องเกี่ยวกับ มันเกี่ยวกับการถามคำถามที่ได้รับ - ดังนั้นการตั้งค่าสถานะการกลั่นกรองที่ระบุคำตอบภายใต้การตรวจสอบจึงเป็นการตอบคำถามที่แตกต่าง แต่ความคิดเห็นที่แตกต่าง
ตั๋วเงินจริง

หากคุณใช้เซิร์ฟเวอร์ด้วยตนเองวิธีที่เร็วที่สุดในการล้างข้อมูลทุกอย่างคือการฆ่าเซิร์ฟเวอร์และเริ่มต้นใหม่ (พบสิ่งนี้โดยบังเอิญ)
acutesoftware

18

FLUSHALL ลบคีย์ทั้งหมดออกจากฐานข้อมูลทั้งหมด

FLUSHDB ลบคีย์ทั้งหมดออกจากฐานข้อมูลปัจจุบัน

SCRIPT FLUSH ลบสคริปต์ทั้งหมดออกจากแคชสคริปต์



11

วิธีนี้ใช้ได้ผลกับฉัน - ลบทุกอย่างของฐานข้อมูลที่เชื่อมต่อปัจจุบันในคลัสเตอร์ Jedis ของคุณ

public static void resetRedis() {
    jedisCluster = RedisManager.getJedis(); // your JedisCluster instance

    for (JedisPool pool : jedisCluster.getClusterNodes().values()) {

        try (Jedis jedis = pool.getResource()) {
            jedis.flushAll();
        }
        catch (Exception ex){
            System.out.println(ex.getMessage());
        }
    }

}

7

อีกหนึ่งตัวเลือกจากด้านข้างของฉัน:

ในฐานข้อมูลการผลิตและการผลิตล่วงหน้าของเรามีกุญแจนับพัน บางครั้งเราจำเป็นต้องลบคีย์บางตัว (โดยมาสก์บางตัว) ปรับเปลี่ยนตามเกณฑ์บางอย่าง ฯลฯ แน่นอนว่าไม่มีวิธีที่จะทำมันด้วยตนเองจาก CLI โดยเฉพาะอย่างยิ่งการมีเศษ (512 dbs เชิงตรรกะในแต่ละกายภาพ)

เพื่อจุดประสงค์นี้ฉันเขียนเครื่องมือไคลเอนต์ java ที่ทำงานทั้งหมดนี้ ในกรณีที่มีการลบคีย์ยูทิลิตี้อาจง่ายมากมีเพียงคลาสเดียว:

public class DataCleaner {

    public static void main(String args[]) {
        String keyPattern = args[0];
        String host = args[1];
        int port = Integer.valueOf(args[2]);
        int dbIndex = Integer.valueOf(args[3]);

        Jedis jedis = new Jedis(host, port);

        int deletedKeysNumber = 0;
        if(dbIndex >= 0){
            deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, dbIndex);
        } else {
            int dbSize = Integer.valueOf(jedis.configGet("databases").get(1));
            for(int i = 0; i < dbSize; i++){
                deletedKeysNumber += deleteDataFromDB(jedis, keyPattern, i);
            }
        }

        if(deletedKeysNumber == 0) {
            System.out.println("There is no keys with key pattern: " + keyPattern + " was found in database with host: " + host);
        }
    }

    private static int deleteDataFromDB(Jedis jedis, String keyPattern, int dbIndex) {
        jedis.select(dbIndex);
        Set<String> keys = jedis.keys(keyPattern);
        for(String key : keys){
            jedis.del(key);
            System.out.println("The key: " + key + " has been deleted from database index: " + dbIndex);
        }

        return keys.size();
    }

}

การเขียนเครื่องมือประเภทนี้ฉันพบว่าง่ายมากและใช้เวลาไม่เกิน 5-10 นาที


5

FLUSHALL ลบคีย์ทั้งหมดของฐานข้อมูลที่มีอยู่ทั้งหมด FOr Redis version> 4.0 รองรับ FLUSHALL ASYNC ซึ่งทำงานในเธรดพื้นหลังโดยปิดกั้นเซิร์ฟเวอร์ https://redis.io/commands/flushall

FLUSHDB - ลบคีย์ทั้งหมดในฐานข้อมูลที่เลือก https://redis.io/commands/flushdb

ความซับซ้อนของเวลาในการดำเนินการจะเป็น O (N) โดยที่ N เป็นจำนวนของคีย์ในฐานข้อมูล

การตอบสนองจาก Redis จะเป็นสตริงง่าย ๆ "ตกลง"


4

คุณสามารถใช้ FLUSHALL ซึ่งจะลบคีย์ทั้งหมดออกจากฐานข้อมูลของคุณ โดยที่ FLUSHDB จะลบคีย์ทั้งหมดออกจากฐานข้อมูลปัจจุบันของเรา


4

ใช้FLUSHALL ASYNCถ้าใช้ (Redis 4.0.0 หรือสูงกว่า) FLUSHALLอื่น

https://redis.io/commands/flushall

หมายเหตุ : ทุกอย่างก่อนที่จะดำเนินการFLUSHALL ASYNCจะถูกขับไล่ การเปลี่ยนแปลงที่เกิดขึ้นระหว่างการดำเนินการFLUSHALL ASYNCจะยังคงไม่ได้รับผลกระทบ



3

เปิด redis-cli และประเภท:

FLUSHALL

1
แม้ว่าโพสต์ของคุณอาจตอบคำถามได้ แต่ก็ขาดเอกสารบางอย่าง โปรดแก้ไขคำตอบของคุณและให้คำตอบเหล่านั้น
สวัสดี

2

ฉันคิดว่าบางครั้งหยุดเซิร์ฟเวอร์ Redis และลบไฟล์ rdb เพื่อตรวจสอบให้แน่ใจว่าไม่มีข้อมูลที่สามารถโหลดซ้ำได้ จากนั้นเริ่มเซิร์ฟเวอร์ Redis ตอนนี้มันใหม่และว่างเปล่า



2

หลังจากที่คุณเริ่มต้น Redis เซิร์ฟเวอร์โดยใช้: หรือservice redis-server start --port 8000redis-server

ใช้redis-cli -p 8000เพื่อเชื่อมต่อกับเซิร์ฟเวอร์เป็นไคลเอนต์ในเทอร์มินัลอื่น

คุณสามารถใช้อย่างใดอย่างหนึ่ง

  1. FLUSHDB - ลบคีย์ทั้งหมดของฐานข้อมูลที่เลือกในปัจจุบัน คำสั่งนี้ไม่เคยล้มเหลว ความซับซ้อนของเวลาสำหรับการดำเนินการนี้คือ O (N), N คือจำนวนของคีย์ในฐานข้อมูล
  2. ฟลัชฮอลล์ - ลบคีย์ทั้งหมดของฐานข้อมูลที่มีอยู่ทั้งหมดไม่ใช่เฉพาะที่เลือกไว้ในปัจจุบัน คำสั่งนี้ไม่เคยล้มเหลว ความซับซ้อนของเวลาสำหรับการดำเนินการนี้คือ O (N), N คือจำนวนของคีย์ในฐานข้อมูลที่มีอยู่ทั้งหมด

ตรวจสอบเอกสารประกอบสำหรับตัวเลือกASYNCสำหรับทั้งคู่

หากคุณกำลังใช้ Redis ผ่านทางอินเทอร์เฟซของหลามให้ใช้ทั้งสองฟังก์ชั่นสำหรับฟังก์ชั่นเดียวกัน:

def flushall(self):
    "Delete all keys in all databases on the current host"
    return self.execute_command('FLUSHALL')

และ

def flushdb(self):
    "Delete all keys in the current database"
    return self.execute_command('FLUSHDB')

1

ดูเหมือนว่าคำถามของคุณเกี่ยวกับการลบคีย์ทั้งหมดในฐานข้อมูล ในกรณีนี้คุณควรลอง:

  1. เชื่อมต่อกับ Redis คุณสามารถใช้คำสั่งredis-cli(หากทำงานบนพอร์ต 6379) มิฉะนั้นคุณจะต้องระบุหมายเลขพอร์ตด้วย
  2. เลือกฐานข้อมูลของคุณ (คำสั่งselect {Index})
  3. ดำเนินการคำสั่ง flushdb

flushallหากคุณต้องการปุ่มล้างในฐานข้อมูลทั้งหมดแล้วคุณควรลอง



1

คุณสามารถใช้ได้ FLUSHDB

เช่น

รายการฐานข้อมูล:

127.0.0.1:6379> info keyspace
# Keyspace

รายการคีย์

127.0.0.1:6379> keys *
(empty list or set)

เพิ่มหนึ่งค่าให้กับคีย์

127.0.0.1:6379> lpush key1 1
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=1,expires=0,avg_ttl=0

สร้างคีย์อื่นด้วยค่าสองค่า

127.0.0.1:6379> lpush key2 1
(integer) 1
127.0.0.1:6379> lpush key2 2
(integer) 2
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
127.0.0.1:6379> info keyspace
# Keyspace
db0:keys=2,expires=0,avg_ttl=0

แสดงรายการค่าทั้งหมดใน key2

127.0.0.1:6379> lrange key2 0 -1
1) "2"
2) "1"

ทำFLUSHDB

127.0.0.1:6379> flushdb
OK

แสดงรายการคีย์และฐานข้อมูล

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> info keyspace
# Keyspace

คำสั่ง keys * เป็นคำสั่งราคาแพง อย่าเรียกใช้คำสั่งนี้บนเซิร์ฟเวอร์ redis ที่ใช้งานจริง
emert117

1

คุณสามารถใช้วิธีการต่อไปนี้ในหลาม

def redis_clear_cache(self):

    try:
        redis_keys = self.redis_client.keys('*')
    except Exception as e:
        # print('redis_client.keys() raised exception => ' + str(e))
        return 1

    try:
        if len(redis_keys) != 0:
            self.redis_client.delete(*redis_keys)
    except Exception as e:
        # print('redis_client.delete() raised exception => ' + str(e))
        return 1

    # print("cleared cache")
    return 0

0

มันจะดีกว่าถ้าคุณมี RDM (Redis Desktop Manager) คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ redis ของคุณได้โดยสร้างการเชื่อมต่อใหม่ใน RDM

เมื่อเชื่อมต่อแล้วคุณสามารถตรวจสอบข้อมูลสดได้เช่นกันคุณสามารถเล่นด้วยคำสั่ง redis

เปิด cli ใน RDM

1) คลิกขวาที่การเชื่อมต่อที่คุณจะเห็นตัวเลือกคอนโซลเพียงคลิกที่มันหน้าต่างคอนโซลใหม่จะเปิดขึ้นที่ด้านล่างของ RDM

กลับมาที่คำถามของคุณ FLUSHALL เป็นคำสั่งคุณสามารถพิมพ์ FLUSHALL ใน redis cli

นอกจากนี้หากคุณต้องการทราบเกี่ยวกับคำสั่ง redis และการใช้งานที่เหมาะสมให้ไปที่ลิงก์ด้านล่าง https://redis.io/ คำสั่ง


0

มีวิธีการที่แตกต่างกัน หากคุณต้องการทำสิ่งนี้จากระยะไกลให้ล้างออกด้วยอินสแตนซ์นั้นผ่านเครื่องมือบรรทัดคำสั่ง redis-cli หรือเครื่องมืออื่น ๆ เช่น telnet, SDK ภาษาโปรแกรม หรือเพียงลงชื่อเข้าใช้เซิร์ฟเวอร์นั้นฆ่ากระบวนการลบไฟล์ dump.rdb และ appendonly.aof (สำรองข้อมูลก่อนการลบ)


0

หากคุณใช้Javaจากเอกสารคุณสามารถใช้หนึ่งในนั้นตามกรณีการใช้งานของคุณ

/**
 * Remove all keys from all databases.
 *
 * @return String simple-string-reply
 */
String flushall();

/**
 * Remove all keys asynchronously from all databases.
 *
 * @return String simple-string-reply
 */
String flushallAsync();

/**
 * Remove all keys from the current database.
 *
 * @return String simple-string-reply
 */
String flushdb();

/**
 * Remove all keys asynchronously from the current database.
 *
 * @return String simple-string-reply
 */
String flushdbAsync();

รหัส:

RedisAdvancedClusterCommands syncCommands = // get sync() or async() commands 
syncCommands.flushdb();

อ่านเพิ่มเติม: https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.