Redis命令
第一章 Redis 命令:Key(键)
```html type 返回 key 所储存的值的类型 exists 检查给定 key 是否存在,若 key 存在,返回 1 ,否则返回 0 del 删除给定的一个或多个 key,返回被删除 key 的数量。不存在的 key 会被忽略 sort 返回或保存给定列表、集合、有序集合 key 中经过排序的元素 keys 查找所有符合给定模式 pattern 的 key object 允许从内部察看给定 key 的 redis 对象 randomkey 从当前数据库中随机返回(不删除)一个 key expire 为key设置生存时间,以秒为单位 pexpire 为key设置生存时间,以毫秒为单位 expireat 为key设置生存时间,接受的时间参数是以 秒 为单位的unix 时间戳 pexpireat 为key设置生存时间,接受的时间参数是以 毫秒 为单位的unix时间戳 persist 移除给定 key 的生存时间 ttl 以秒为单位返回 key 的剩余生存时间 pttl 以毫秒为单位返回 key 的剩余生存时间 dump 序列化给定 key ,并返回被序列化的值 restore 反序列化给定的序列化值,并将它和给定的 key 关联 migrate 将 key 原子性地从当前实例传送到目标实例的指定数据库上 move 将当前数据库的 key 移动到给定的数据库 db 当中。 rename 重命名,名字相同或不存在返回错误,新名字已经存在将被覆盖旧值 renamenx 当且仅当 newkey 不存在时,将 key 改名为 newkey scan 增量地迭代一集元素,用于迭代当前数据库中的数据库键 sscan 增量地迭代一集元素,命令用于迭代集合键中的元素。 hscan 增量地迭代一集元素,命令用于迭代哈希键中的键值对。 zscan 增量地迭代一集元素,命令用于迭代有序集合中的元素(包括元素成员和元素分值)。 ``` ## TYPE 返回key所储存的值的类型 - 语法:TYPE key - 时间复杂度:O(1) - 返回值: none (key不存在) string (字符串) list (列表) set (集合) zset (有序集) hash (哈希表) ## EXISTS 检查给定key是否存在 - 语法:EXISTS key - 时间复杂度:O(1) - 返回值:若 key 存在,返回 1 ,否则返回 0 ## DEL 删除给定的一个或多个 key - 语法:DEL key [key ...] - 时间复杂度: O(N), N 为被删除的 key 的数量。 删除单个字符串类型的 key ,时间复杂度为O(1)。 删除单个列表、集合、有序集合或哈希表类型的 key ,时间复杂度为O(M), M 为以上数据结构内的元素数量。 - 返回值:被删除 key 的数量。不存在的 key 会被忽略 ## SORT 排序 - 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。 - 语法:SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination] - 时间复杂度: O(N+M*log(M)), N 为要排序的列表或集合内的元素数量, M 为要返回的元素数量。 如果只是使用 SORT 命令的 GET 选项获取数据而没有进行排序,时间复杂度 O(N)。 - 返回值: 没有使用 STORE 参数,返回列表形式的排序结果。 使用 STORE 参数,返回排序结果的元素数量。 - 用法: SORT key 返回键值从小到大排序的结果。 SORT key DESC 返回键值从大到小排序的结果。 SORT key ALPHA 对字符串进行排序 SORT key LIMIT offset count 使用 LIMIT 修饰符限制返回结果 ```shell SORT rank DESC SORT rank LIMIT 0 5 SORT rank LIMIT 0 5 DESC ``` - 使用外部 key 进行排序 ```shell SORT uid #默认按 uid 中的值排序 SORT uid BY user_level_* #通过使用 BY 选项,可以让 uid 按其他键的元素来排序 SORT uid GET user_name_* #使用 GET 选项, 可以根据排序的结果来取出相应的键值 SORT uid BY user_level_* #GET user_name_* 组合使用 BY 和 GET SORT uid GET user_level_* #GET user_name_* 获取多个外部键 SORT uid BY not-exists-key #获取外部键,但不进行排序 ``` - 保存排序结果 ```shell SORT numbers STORE sorted-numbers ``` 通过给 STORE 选项指定一个 key 参数,可以将排序结果保存到给定的键上。 如果被指定的 key 已存在,那么原有的值将被排序结果覆盖。 可以通过将 SORT 命令的执行结果保存,并用 EXPIRE 为结果设置生存时间,以此来产生一个 SORT 操作的结果缓存。 这样就可以避免对 SORT 操作的频繁调用:只有当结果集过期时,才需要再调用一次 SORT 操作。 另外,为了正确实现这一用法,你可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行 SORT 操作,并保存为结果集),具体参见 SETNX 命令。 ## KEYS 查找所有符合给定模式 pattern 的 key - 语法:KEYS pattern - 时间复杂度:O(N), N 为数据库中 key 的数量。 - 返回值:符合给定模式的 key 列表 - **KEYS * :**匹配数据库中所有 key 。 - **KEYS h?llo :**匹配 hello , hallo 和 hxllo 等。 - KEYS h*llo :匹配 hllo 和 heeeeello 等。 - **KEYS h[ae]llo :**匹配 hello 和 hallo ,但不匹配 hillo 。 - 特殊符号用 \ 隔开 KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 key ,你最好还是用 Redis 的集合结构(set)来代替。 ## OBJECT 内部察看给定 key 的 Redis 对象 它通常用在debug或者了解为了节省空间而对 key 使用特殊编码的情况 - 语法:OBJECT subcommand [arguments [arguments]] - 时间复杂度:O(1) - 返回值:REFCOUNT 和 IDLETIME 返回数字。ENCODING 返回相应的编码类型。 - 子命令: **OBJECT REFCOUNT <key> **返回给定 key 引用所储存的值的次数。此命令主要用于除错。 **OBJECT ENCODING <key>** 返回给定 key 锁储存的值所使用的内部表示(representation)。 **OBJECT IDLETIME <key>** 返回给定 key 自储存以来的空转时间(idle, 没有被读取也没有被写入),以秒为单位。 - 编码方式: **字符串**:可以被编码为 raw (一般字符串)或 int (用字符串表示64位数字是为了节约空间)。 **列表**:可以被编码为 ziplist 或 linkedlist 。 ziplist 是为节约大小较小的列表空间而作的特殊表示。 **集合**:可以被编码为 intset 或者 hashtable 。 intset 是只储存数字的小集合的特殊表示。 **哈希表**:可以编码为 zipmap 或者 hashtable 。 zipmap 是小哈希表的特殊表示。 **有序集合**:可以被编码为 ziplist 或者 skiplist 格式。 ziplist 用于表示小的有序集合,而 skiplist 则用于表示任何大小的有序集合。 ## RANDOMKEY 从当前数据库中随机返回(不删除)一个 key - 时间复杂度:O(1) - 返回值:当数据库不为空时,返回一个 key 。当数据库为空时,返回 nil ## EXPIRE 为key 设置生存时间 - 语法:EXPIRE key seconds - 时间复杂度:O(1) - 返回值:设置成功返回 1 。当 key 不存在或者不能为 key 设置生存时间时,返回 0 。 ## EXPIREAT 为 key 设置生存时间 - 语法:EXPIREAT key timestamp - 时间复杂度:O(1) - 返回值:如果生存时间设置成功,返回 1 。当 key 不存在或没办法设置生存时间,返回 0 。 ## PEXPIRE - 语法:PEXPIRE key milliseconds - 时间复杂度:O(1) - 返回值:设置成功,返回 1key 不存在或设置失败,返回 0 ## PEXPIREAT - 语法:PEXPIREAT key milliseconds-timestamp - 时间复杂度:O(1) - 返回值:如果生存时间设置成功,返回 1 。当 key 不存在或没办法设置生存时间时,返回 0 。 ## PERSIST 移除key 的生存时间 - 语法:PERSIST key - 时间复杂度:O(1) - 返回值:当生存时间移除成功时,返回 1 .如果 key 不存在或 key 没有设置生存时间,返回 0 。 ## TTL 以秒为单位,返回 key 的剩余生存时间( - 语法:TTL key - 时间复杂度:O(1) - 返回值: 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。 ## PTTL 以毫秒为单位返回 key 的剩余生存时间 - 语法:PTTL key - 时间复杂度:O(1) - 返回值: 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。 ## DUMP 序列化给定 key - 序列化生成的值有以下几个特点: 它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和。 值的编码格式和 RDB 文件保持一致。 RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。 - 语法:DUMP key - 返回值:如果 key 不存在,那么返回 nil 。否则,返回序列化之后的值。 ## RESTORE 反序列化给定的序列化值,并将它和给定的 key 关联 - 语法:RESTORE key ttl serialized-value - 参数 ttl :以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间 - 时间复杂度: 查找给定键的复杂度为 O(1) ,对键进行反序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。 有序集合(sorted set)的反序列化复杂度为 O(N*M*log(N)) ,因为有序集合每次插入的复杂度为 O(log(N)) 。 如果反序列化的对象是比较小的字符串,那么复杂度为 O(1) 。 - 返回值:如果反序列化成功那么返回 OK ,否则返回一个错误 ## MIGRATE 从当前实例传送到目标实例的指定数据库 - 语法:MIGRATE host port key destination-db timeout [COPY] [REPLACE] - 可选项: COPY :不移除源实例上的 key 。 REPLACE :替换目标实例上已存在的 key。 - 时间复杂度: O(N) 。 - 返回值:迁移成功时返回 OK ,否则返回相应的错误。 这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。 ## MOVE 将当前数据库的 key 移动到给定的数据库 db 当中 - 语法:MOVE key db - 时间复杂度:O(1) - 返回值:移动成功返回 1 ,失败则返回 0 。 ## RENAME 重命名 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。 当 newkey 已经存在时, RENAME 命令将覆盖旧值。 - 语法:RENAME key newkey - 时间复杂度:O(1) - 返回值:改名成功时提示 OK ,失败时候返回一个错误。 ## RENAMENX 重命名 当且仅当 newkey 不存在时,将 key 改名为 newkey 。 当 key 不存在时,返回一个错误。 - 语法:RENAMENX key newkey - 时间复杂度:O(1) - 返回值:修改成功时,返回 1 。如果 newkey 已经存在,返回 0 。 ## SCAN 增量式迭代 - **SCAN**:用于迭代当前数据库中的数据库键。 - **SSCAN**:用于迭代集合键中的元素。 - **HSCAN**:用于迭代哈希键中的键值对。 - **ZSCAN**:用于迭代有序集合中的元素(包括元素成员和元素分值) 以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。 不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN 这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 。 - SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。 - 而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。 - 时间复杂度:增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量。 - 返回值:返回一个包含两个元素的 multi-bulk 回复: 第一个元素是字符串表示的无符号 64 位整数(游标),第二个元素包含了本次被迭代的元素。 SCAN 命令返回的每个元素都是一个数据库键。 SSCAN 命令返回的每个元素都是一个集合成员。 HSCAN 命令返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成。 ZSCAN 命令返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。 #### SCAN 命令的基本用法 SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。 当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。 SCAN 命令的回复是一个包含两个元素的数组, 第一个数组元素是用于进行下一次迭代的新游标, 而第二个数组元素则是一个数组, 这个数组中包含了所有被迭代的元素。 以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历(full iteration)。 #### SCAN 命令的保证 SCAN 命令, 以及其他增量式迭代命令, 在进行完整遍历的情况下可以为用户带来以下保证: 从完整遍历开始直到完整遍历结束期间, 一直存在于数据集内的所有元素都会被完整遍历返回; 这意味着, 如果有一个元素, 它从遍历开始直到遍历结束期间都存在于被遍历的数据集当中, 那么 SCAN 命令总会在某次迭代中将这个元素返回给用户。 然而因为增量式命令仅仅使用游标来记录迭代状态, 所以这些命令带有以下缺点: - 同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上。 - 如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会, 这是未定义的(undefined)。 #### SCAN 命令每次执行返回的元素数量 增量式迭代命令并不保证每次执行都返回某个给定数量的元素。 增量式命令甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将迭代视作结束。 不过命令返回的元素数量总是符合一定规则的, 在实际中: - 对于一个大数据集来说, 增量式迭代命令每次最多可能会返回数十个元素; - 而对于一个足够小的数据集来说, 如果这个数据集的底层表示为编码数据结构(encoded data structure,适用于是小集合键、小哈希键和小有序集合键), 那么增量迭代命令将在一次调用中返回数据集中的所有元素。 最后, 用户可以通过增量式迭代命令提供的 COUNT 选项来指定每次迭代返回元素的最大值。 #### COUNT 选项 虽然增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。 基本上, COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。 虽然 COUNT 选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。 - COUNT 参数的默认值为 10 。 - 在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。 - 在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。 - 并非每次迭代都要使用相同的 COUNT 值。用户可以在每次迭代中按自己的需要随意改变 COUNT 值, 只要记得将上次迭代返回的游标用到下次迭代里面就可以了。 #### MATCH 选项 和 KEYS 命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern> 参数来实现。 需要注意的是, 对元素的模式匹配工作是在命令从数据集中取出元素之后, 向客户端返回元素之前的这段时间内进行的, 所以如果被迭代的数据集中只有少量元素和模式相匹配, 那么迭代命令或许会在多次执行中都不返回任何元素。 #### 并发执行多个迭代 在同一时间, 可以有任意多个客户端对同一数据集进行迭代, 客户端每次执行迭代都需要传入一个游标, 并在迭代执行之后获得一个新的游标, 而这个游标就包含了迭代的所有状态, 因此, 服务器无须为迭代记录任何状态。 #### 中途停止迭代 因为迭代的所有状态都保存在游标里面, 而服务器无须为迭代保存任何状态, 所以客户端可以在中途停止一个迭代, 而无须对服务器进行任何通知。 即使有任意数量的迭代在中途停止, 也不会产生任何问题。 #### 使用错误的游标进行增量式迭代 使用间断的(broken)、负数、超出范围或者其他非正常的游标来执行增量式迭代并不会造成服务器崩溃, 但可能会让命令产生未定义的行为。 未定义行为指的是, 增量式命令对返回值所做的保证可能会不再为真。 只有两种游标是合法的: - 在开始一个新的迭代时, 游标必须为 0 。 - 增量式迭代命令在执行之后返回的, 用于延续(continue)迭代过程的游标。 #### 迭代终结的保证 增量式迭代命令所使用的算法只保证在数据集的大小有界(bounded)的情况下, 迭代才会停止, 换句话说, 如果被迭代数据集的大小不断地增长的话, 增量式迭代命令可能永远也无法完成一次完整迭代。 从直觉上可以看出, 当一个数据集不断地变大时, 想要访问这个数据集中的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。
顶部
收展
底部
[TOC]
目录
第一章 Redis 命令:Key(键)
第二章 Redis 命令:String(字符串)
第三章 Redis 命令:Hash(哈希表)
第四章 Redis 命令:List(列表)
第五章 Redis 命令:Set(集合)
第六章 Redis 命令:SortedSet(有序集合)
第七章 Redis 命令:Pub/Sub(发布/订阅)
第八章 Redis 命令:Transaction(事务)
第九章 Redis 命令:Lua(脚本)
第十章 Redis 命令:Connection(连接)
第十一章 Redis 命令:Server(服务器)
第十二章 Redis 命令:GEO(地理位置)
相关推荐
Redis教程
Redis进阶
Redis面试题总结
PHP 操作Redis