redis - 当您在特定数据库上运行 `KEYS` 命令时,Redis 会锁定所有可用数据库吗?

标签 redis locking database nosql

当您在 Redis 数据库中运行 KEYS * 命令时,Redis 将锁定数据库,直到 key 返回所有 key 。

我想在 Redis 中创建 2 个单独的数据库并在每个数据库中创建一些 key ,然后选择其中一个并在该数据库上运行 keys 命令。

Redis 会锁定所有可用的数据库直到回答准备好还是只锁定选定的数据库?

最佳答案

TL;DR:是的。

Redis 不会锁定 - 它会阻塞(几乎1)所有命令,因为它是单线程的。当服务器执行命令时,无论是简单的 GET 还是邪恶的 KEYS,它都会忙于提供服务而不会做任何其他事情。命令完成所需的时间越长,服务器被阻塞的时间就越长。

KEYS是一个长时间运行的命令,因为它总是遍历整个键空间(不管模式如何),更不用说它做出的潜在巨大回复。

同样的单线程执行也处理编号的,也就是共享的数据库。您对其中一个数据库执行的任何操作都会阻塞整个服务器,包括所有数据库。更多信息请访问:https://redislabs.com/blog/benchmark-shared-vs-dedicated-redis-instances/

1 BGSAVE ,例如,是少数不会阻塞的命令之一。从 v4 开始,还有 UNLINK并计划添加更多内容。

关于redis - 当您在特定数据库上运行 `KEYS` 命令时,Redis 会锁定所有可用数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42387536/

相关文章:

azure - 如何连接到 Azure Redis 缓存的从属实例

r - R 中的文件锁

javascript - 可搜索的加密方法(对于傻瓜来说!)

mysql - 正确使用 REST 设计 - 类别和子类别

python - SQLAlchemy:从特定用户的favorite_series中检索所有剧集

django - 将本地缓存服务器添加到 heroku dyno 实例

session - 使用哈希与键在 Redis 中存储对象

所有应用程序的 Redis 实例?有哪些约定?

mysql - 我如何锁定 MySQL 或 phpmyadmin 中的表?

c++ - 带有重复参数的 Scoped_lock