如何删除 Redis 中的所有内容?
Posted
技术标签:
【中文标题】如何删除 Redis 中的所有内容?【英文标题】:How do I delete everything in Redis? 【发布时间】:2011-10-14 16:19:04 【问题描述】:我想删除所有键。我希望一切都消失,并给我一个空白数据库。
有没有办法在Redis 客户端中做到这一点?
【问题讨论】:
我想知道为什么del *
不起作用。它返回 0。
@Chloe del *
删除名为“*”的键。 (只有一些命令接受 glob 模式,因为针对具有许多键的数据库中的所有键检查模式非常慢。)
【参考方案1】:
使用 redis-cli:
FLUSHDB – 从连接的当前数据库中删除所有键。 FLUSHALL – 从所有数据库中删除所有键。例如,在你的 shell 中:
redis-cli flushall
【讨论】:
当我尝试上述操作时,我收到以下错误(error) LOADING Redis is loading the dataset in memory
。你能具体说明原因吗?
@Ramswaroop - 您重新启动了 Redis,它目前正在从持久存储中加载数据。虽然此过程(加载)处于活动状态,但您无法操作数据库。要么等待它完成,要么配置不带持久性的 Redis 并重新启动它(它将开始为空,因此一旦启动就不需要执行 FLUSHALL)。
@ItamarHaber 感谢您的帮助,我也想通了。
@Neo 如果您在 C# 中没有 redis 客户端库,您可以简单地运行该命令,如下所示:(new Process StartInfo = new ProcessStartInfo FileName = "redis-cli", Arguments = "flushall", CreateNoWindow = true ).start();
使用-h
标志指定redis服务器位置【参考方案2】:
请注意FLUSHALL
可能有点矫枉过正。 FLUSHDB
仅用于刷新数据库。 FLUSHALL
将清除整个服务器。就像服务器上的每个数据库一样。由于问题是关于刷新数据库,我认为这是一个足够重要的区别,值得单独回答。
【讨论】:
+1 来自我,我认为这实际上是更好的答案。诚然,OP 的问题说“清除所有内容”,但随后是“给我一个空白数据库”——不管他的实际意思是什么,我认为你所做的区分至少可以说是有用的。【参考方案3】:如果您使用的是 redis-rb gem,那么您可以简单地调用:
your_redis_client.flushdb
【讨论】:
【参考方案4】:到目前为止的答案是绝对正确的;他们删除所有键。
但是,如果您还想从 Redis 实例中删除所有 Lua 脚本,则应遵循以下步骤:
SCRIPT FLUSH
OP 提出了两个问题;这样就完成了第二个问题(所有内容都已擦除)。
【讨论】:
如果你自己运行服务器,最快的擦除所有内容的方法是杀死服务器并重新启动它(意外发现)【参考方案5】:FLUSHALL 从所有数据库中删除所有键
FLUSHDB 从当前数据库中删除所有键
SCRIPT FLUSH 从脚本缓存中删除所有脚本。
【讨论】:
【参考方案6】:您可以使用 FLUSHALL 从您的每个数据库中删除所有键。 FLUSHDB 将从我们当前的数据库中删除所有键。
【讨论】:
【参考方案7】:我这边还有一个选择:
在我们的生产和预生产数据库中,有数千个密钥。有时我们需要删除一些键(通过一些掩码),根据一些标准进行修改等。当然,没有办法从 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 分钟。
【讨论】:
【参考方案8】:此方法对我有用 - 删除 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());
【讨论】:
【参考方案9】:FLUSHALL 删除所有现有数据库的所有键。 对于 Redis 版本 > 4.0 ,支持 FLUSHALL ASYNC,它在后台线程中运行而不会阻塞服务器 https://redis.io/commands/flushall
FLUSHDB - 删除选定数据库中的所有键。 https://redis.io/commands/flushdb
执行操作的时间复杂度将是 O(N),其中 N 是数据库中键的数量。
redis 的响应将是一个简单的字符串“OK”
【讨论】:
【参考方案10】:如果使用(Redis 4.0.0 或更高版本)则使用FLUSHALL ASYNC
,否则使用FLUSHALL
。
https://redis.io/commands/flushall
注意:执行FLUSHALL ASYNC
之前的所有内容都将被驱逐。在执行FLUSHALL ASYNC
期间所做的更改将不受影响。
【讨论】:
【参考方案11】:我想有时会停止redis-server并删除rdb,aof文件。 确保没有数据可以重新加载。 然后启动 redis-server,现在它是新的和空的。
【讨论】:
【参考方案12】:-
停止 Redis 实例。
删除 RDB 文件。
启动 Redis 实例。
【讨论】:
根据我的经验,如果你有持久性,你确实应该遵循这个程序+删除任何.aof文件+发出redis-cli flushall,真正删除所有内容。【参考方案13】:redis-cli -h <host> -p <port> flushall
它将从连接的客户端(带有主机和端口)中删除所有数据
【讨论】:
【参考方案14】:使用service redis-server start --port 8000
或redis-server
启动Redis 服务器后。
使用redis-cli -p 8000
作为客户端在不同的终端连接到服务器。
你可以使用任何一个
-
FLUSHDB - 删除当前选定数据库的所有键。这个命令永远不会失败。此操作的时间复杂度为 O(N),N 是数据库中键的数量。
FLUSHALL - 删除所有现有数据库的所有键,而不仅仅是当前选择的一个。这个命令永远不会失败。此操作的时间复杂度为 O(N),N 是所有现有数据库中的键数。
查看文档以了解两者的 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')
【讨论】:
【参考方案15】:打开 redis-cli 并输入:
FLUSHALL
【讨论】:
虽然您的帖子可能会回答这个问题,但它缺少一些文档。请编辑您的答案并提供这些答案。【参考方案16】:您的问题似乎是关于删除数据库中的整个键。在这种情况下,您应该尝试:
-
连接到redis。您可以使用命令
redis-cli
(如果在端口 6379 上运行),否则您还必须指定端口号。
选择您的数据库(命令select Index
)
执行命令flushdb
如果你想刷新所有数据库中的键,那么你应该尝试flushall
。
【讨论】:
【参考方案17】:如果您可以拥有 RDM(Redis 桌面管理器),那就更好了。 您可以通过在 RDM 中创建新连接来连接到您的 redis 服务器。
连接后,您可以查看实时数据,也可以使用任何 redis 命令。
在 RDM 中打开一个 cli。
1) 右键单击连接,您将看到一个控制台选项,只需单击它,RDM 底部将打开一个新的控制台窗口。
回到你的问题 FLUSHALL 是命令,你可以简单地在 redis cli 中输入 FLUSHALL。
此外,如果您想了解任何 redis 命令及其正确用法,请转到下面的链接。 https://redis.io/commands.
【讨论】:
【参考方案18】:有不同的方法。如果您想从远程执行此操作,请通过命令行工具 redis-cli 或任何工具(例如 telnet,一种编程语言 SDK)向该实例发出 flushall。或者只是登录该服务器,终止进程,删除其 dump.rdb 文件和 appendonly.aof(删除前备份它们)。
【讨论】:
【参考方案19】:您可以使用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 服务器上运行此命令【参考方案20】:如果您使用的是 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
【讨论】:
【参考方案21】:您可以在 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
【讨论】:
【参考方案22】:这对我有用: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。此外,它不需要任何额外的编程语言,只需一行代码。
【讨论】:
KEYS 在大型数据库中是一个危险的命令。首先,它可能非常缓慢。其次,密钥列表可能是要传输给客户端的大量数据。 @ViktorSöderqvist 慢:是的。一些 MB 转移给客户:是的。危险的?我不这么认为。这是Redis没有完全访问权限时的解决方案 好吧,KEYS 会影响您的应用程序的性能,但如果您要删除所有密钥,这不是问题。它被标记为@dangerous
(参见COMMAND INFO KEYS
)。【参考方案23】:
您可以在终端中使用 flushall
redis-cli> flushall
【讨论】:
【参考方案24】:如果要清除windows中的redis: 在
中找到redis-cliC:\Program Files\Redis 并运行 FLUSHALL 命令。
【讨论】:
【参考方案25】:对于想知道如何在 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 *
并查看它是空的。
希望这对寻找它的人有所帮助。
【讨论】:
以上是关于如何删除 Redis 中的所有内容?的主要内容,如果未能解决你的问题,请参考以下文章
如何从redis-cli repl中删除Redis匹配模式中的所有键?