Redis cli удалить несколько ключей

Я установил Redis в Centos, и у меня есть несколько таких ключей Redis,

Product:<id>:<url>

Как я могу удалить все Product:*:* с помощью CLI?

Версия Redis: 3.2.4 [Последняя, ​​я думаю]

Спасибо!


person John FG    schedule 18.11.2016    source источник
comment
Возможный дубликат Как атомарно удалить ключи, соответствующие шаблону, используя Редис   -  person Jess Bowers    schedule 06.07.2019


Ответы (6)


Используя инструмент redis-cli, вы можете сделать следующее:

redis-cli --scan --pattern 'Product:*:*' | xargs redis-cli DEL
person Itamar Haber    schedule 18.11.2016
comment
Не совсем понимаю, почему это не помогло мне, но переключился на это, и это сработало: redis-cli keys '*' | grep Product | xargs -i redis-cli del {} - person kakoma; 15.10.2018
comment
@kakoma не удалось как? - person Itamar Haber; 16.10.2018
comment
Мой плохой @Итамар. Только что понял, что набрал не тот шаблон лицо ладонь Все хорошо. Спасибо за совет! Проголосовал за - person kakoma; 16.10.2018
comment
Нет проблем, мне пришлось сделать косметическую операцию, чтобы убрать отпечаток ладони с лица ‹- столько лет этим занимаюсь :) - person Itamar Haber; 17.10.2018
comment
это звучит хорошо, но если у вас есть более одной базы данных или тысячи или миллионы ключей, я опубликовал результат своего поиска ниже в качестве ответа. - person mahdi yousefi; 11.07.2019
comment
Вы также можете выбрать сервер с параметром -u и базу данных с параметром -n, например redis-cli -u redis://redisserver:6379 -n 1 --scan --pattern 'Product:*:*''. - person OzzyCzech; 11.05.2020
comment
Я получаю (error) CROSSSLOT Keys in request don't hash to the same slot Я использую следующее для удаления шаблона hi* кластера формы redis-cli -u redis://localhost:6379 --scan --pattern 'hi*' | xargs redis-cli -u redis://localhost:6379 DEL - person roottraveller; 27.05.2020

Для этого нет встроенной команды. Вы должны использовать команду SCAN, чтобы получить все ключи, соответствующие шаблону, а затем использовать команду DEL, чтобы удалить эти ключи.

// scan from cursor 0 to get the next cursor and keys
SCAN 0 match Product:*:*
// next_cursor, Product:x1:y1, Product:x2:y2, ...
DEL Product:x1:y1 Product:x2:y2 ...
// scan from the next cursor until it return 0
SCAN next_cursor match Product:*:*

Другим решением является использование HASH для сохранения ключей этого шаблона:

// set key value
HSET Products Product:<id>:<url> value
// remove a single key
HDEL Products Product:<id>:<url>
// remove all keys
DEL Products
person for_stack    schedule 18.11.2016
comment
Можете ли вы дать мне пример сканирования, а затем удалить? - person John FG; 18.11.2016
comment
@JohnFG Я обновляю ответ. Дополнительные сведения о SCAN см. в документации. - person for_stack; 18.11.2016

-n <db>            Database number

оболочка: redis-cli -n 1 --scan --pattern prefix:* | xargs redis-cli -n 1 del

person zxf曾爷    schedule 29.05.2019

Начиная с Redis 2.6.0, вы можете использовать скрипты LUA.

Вы должны использовать этот вариант поверх SCAN | XARGS вариант, потому что он намного быстрее.

Следующий скрипт работает и для большого количества ключей.

  1. откройте свой redis-cli
redis-cli -p somePort -a somePassword
  1. Замените somePattern своим шаблоном, например. *cars* (помните, что это не регулярное выражение)
EVAL "for _,k in ipairs(redis.call('keys','somePattern')) do redis.call('del',k) end" 0
person Robin F.    schedule 23.12.2020

поместите все ключи, которые вы хотите удалить, в файл keylist.txt, затем:

cat keylist.txt | while read rediskey; do echo "Deleting $rediskey" && redis-cli -c -h 'hostname' -p XXXX -a 'XXXXXX' UNLINK $rediskey; done
person Ghassan Zein    schedule 29.01.2021

Есть несколько способов сделать это.

  1. https://gist.github.com/ddre54/0a4751676272e0da8186 Не рекомендуется использовать на рабочем сервере, поскольку он использует ключевое слово KEYS
  2. Использование ioredis (https://github.com/luin/ioredis#streamify-scanning ), который поддерживает Redis >= 2.6.12 и (Node.js >= 6)

Если вы хотите следовать второму примеру, просто выполните следующие шаги:

  1. Установить узел JS> = 6
  2. Создайте папку и внутри нее установите ioredis, выполнив следующую команду:

    npm установить ioredis

  3. Внутри этой папки создайте файл redis.js со следующим содержимым

    module.exports.redisDel = function(key) {
    console.log("del started for key: ", key);
    var Redis = require("ioredis");
    
    var redis = new Redis({
        port: 6379, // Redis port
        host: "192.168.93.27", // Redis host
        family: 4, // 4 (IPv4) or 6 (IPv6)
        password: "SetCorrectPassword"
    });
    
    return new Promise((resolve, reject) => {
    
        var stream = redis.scanStream({
            // only returns keys following the pattern of "key"
            match: key,
            // returns approximately 100 elements per call
            count: 100
        });
    
        stream.on('data', function (resultKeys) {
            if (resultKeys.length) {
                console.log(resultKeys)
                redis.del(resultKeys); //from version 4 use unlink instead of del
            }
            else {
                console.log("nothing found");
            }
        });
        stream.on('end', function (resultKeys) {
            console.log("end");
            resolve()
        })
    })
    

    }

  4. Запустите скрипт, передав нужный ключ (в нашем случае yourKey*)

node -e 'require(\"./redis\").redisDel(\"yourKey*\")'

person Dawid Dragan    schedule 03.09.2019