【发布时间】:2011-10-14 16:19:04
【问题描述】:
我想删除所有键。我希望一切都消失,并给我一个空白数据库。
有没有办法在Redis 客户端中做到这一点?
【问题讨论】:
-
我想知道为什么
del *不起作用。它返回 0。 -
@Chloe
del *删除名为“*”的键。 (只有一些命令接受 glob 模式,因为针对具有许多键的数据库中的所有键检查模式非常慢。)
标签: redis
我想删除所有键。我希望一切都消失,并给我一个空白数据库。
有没有办法在Redis 客户端中做到这一点?
【问题讨论】:
del * 不起作用。它返回 0。
del * 删除名为“*”的键。 (只有一些命令接受 glob 模式,因为针对具有许多键的数据库中的所有键检查模式非常慢。)
标签: redis
【讨论】:
(error) LOADING Redis is loading the dataset in memory。你能具体说明原因吗?
(new Process { StartInfo = new ProcessStartInfo { FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true }}).start();
-h标志指定redis服务器位置
请注意FLUSHALL 可能有点矫枉过正。 FLUSHDB 仅用于刷新数据库。 FLUSHALL 将清除整个服务器。就像服务器上的每个数据库一样。由于问题是关于刷新数据库,我认为这是一个足够重要的区别,值得单独回答。
【讨论】:
如果您使用的是 redis-rb gem,那么您可以简单地调用:
your_redis_client.flushdb
【讨论】:
【讨论】:
【讨论】:
您可以使用 FLUSHALL 从您的每个数据库中删除所有键。 FLUSHDB 将从我们当前的数据库中删除所有键。
【讨论】:
我这边还有一个选择:
在我们的生产和预生产数据库中,有数千个密钥。有时我们需要删除一些键(通过一些掩码),根据一些标准进行修改等。当然,没有办法从 CLI 手动完成,尤其是有分片(每个物理中有 512 个逻辑数据库)。
为此,我编写了完成所有这些工作的 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 分钟。
【讨论】:
此方法对我有用 - 删除 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());
}
}
}
【讨论】:
FLUSHALL 删除所有现有数据库的所有键。 对于 Redis 版本 > 4.0 ,支持 FLUSHALL ASYNC,它在后台线程中运行而不会阻塞服务器 https://redis.io/commands/flushall
FLUSHDB - 删除选定数据库中的所有键。 https://redis.io/commands/flushdb
执行操作的时间复杂度将是 O(N),其中 N 是数据库中键的数量。
redis 的响应将是一个简单的字符串“OK”
【讨论】:
如果使用(Redis 4.0.0 或更高版本)则使用FLUSHALL ASYNC,否则使用FLUSHALL。
https://redis.io/commands/flushall
注意:执行FLUSHALL ASYNC 之前的所有内容都将被驱逐。在执行FLUSHALL ASYNC 期间所做的更改将不受影响。
【讨论】:
我想有时会停止redis-server并删除rdb,aof文件。 确保没有数据可以重新加载。 然后启动 redis-server,现在它是新的和空的。
【讨论】:
【讨论】:
redis-cli -h <host> -p <port> flushall
它将从连接的客户端(带有主机和端口)中删除所有数据
【讨论】:
使用service redis-server start --port 8000 或redis-server 启动Redis 服务器后。
使用redis-cli -p 8000作为客户端在不同的终端连接到服务器。
你可以使用任何一个
查看文档以了解两者的 ASYNC 选项。
如果您通过其 python 接口使用 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')
【讨论】:
打开 redis-cli 并输入:
FLUSHALL
【讨论】:
您的问题似乎是关于删除数据库中的整个键。在这种情况下,您应该尝试:
redis-cli(如果在端口 6379 上运行),否则您还必须指定端口号。select {Index})flushdb
如果你想刷新所有数据库中的键,那么你应该尝试flushall。
【讨论】:
如果您可以拥有 RDM(Redis 桌面管理器),那就更好了。 您可以通过在 RDM 中创建新连接来连接到您的 redis 服务器。
连接后,您可以查看实时数据,也可以使用任何 redis 命令。
在 RDM 中打开一个 cli。
1) 右键单击连接,您将看到一个控制台选项,只需单击它,RDM 底部将打开一个新的控制台窗口。
回到你的问题 FLUSHALL 是命令,你可以简单地在 redis cli 中输入 FLUSHALL。
此外,如果您想了解任何 redis 命令及其正确用法,请转到下面的链接。 https://redis.io/commands.
【讨论】:
有不同的方法。如果您想从远程执行此操作,请通过命令行工具 redis-cli 或任何工具(例如 telnet,一种编程语言 SDK)向该实例发出 flushall。或者只是登录该服务器,终止进程,删除其 dump.rdb 文件和 appendonly.aof(删除前备份它们)。
【讨论】:
您可以使用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
【讨论】:
如果您使用的是 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
【讨论】:
您可以在 python 中使用以下方法
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
【讨论】:
这对我有用:redis-cli KEYS \* | xargs --max-procs=16 -L 100 redis-cli DEL
它列出 redis 中的所有 Key,然后使用 xargs 传递给 redis-cli DEL,每个命令最多使用 100 个 Key,但一次运行 16 个命令,由于安全原因,在没有 FLUSHDB 或 FLUSHALL 时非常快速且有用,例如,在 Docker 或 Kubernetes 中使用来自 Bitnami 的 Redis。此外,它不需要任何额外的编程语言,只需一行代码。
【讨论】:
@dangerous(参见COMMAND INFO KEYS)。
您可以在终端中使用 flushall
redis-cli> flushall
【讨论】:
如果要清除windows中的redis: 在
中找到redis-cliC:\Program Files\Redis 并运行 FLUSHALL 命令。
【讨论】:
对于想知道如何在 C# 中执行此操作的任何人,对于同一问题,它与 answer provided for Python 相同。
我正在将 StackExchange.Redis v2.2.88 用于 dot net (core) 5 项目。我只需要清除我的密钥以进行集成测试,而我并没有在生产中这样做的目的。
我检查了 intellisense 中可用的内容,但我没有看到使用现有 API 执行此操作的常用方法。我想这是故意和设计的。幸运的是,API 确实公开了一个 Execute 方法。
我通过执行以下操作对此进行了测试:
打开一个命令窗口。我用的是docker,所以我是通过docker来的。
输入redis-cli 启动CLI
输入KEYS *,它会显示我的所有密钥,以便我可以在执行以下代码之前和之后验证它们是否存在:
//不要滥用这个,谨慎使用 var cache = ConnectionMultiplexer.Connect( 新的配置选项 { 端点 = {“本地主机:6379”} });
var db = _cache.GetDatabase();
db.Execute("flushdb");
再次输入KEYS * 并查看它是空的。
希望这对寻找它的人有所帮助。
【讨论】: