Redis 常用命令

Redis 基础

一、数据类型

字符串类型

概念

字符串类型(string)是 Redis 中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以用字符串类型存储用户的邮箱、JSON 序列化的对象甚至是一张图片。一个字符串类型键允许存储的数据的最大容量是 512 MB。字符串类型是其他 5 种数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。例如,列表类型是以列表的形式组织字符串,而集合类型是以集合的形式组织字符串。

命令

赋值取值

SET KEY VALUE

GET KEY

递增数字

INCR KEY 功能是使当前键值递增,并返回递增后的值。当要操作的键不存在时默认键值为 0,所以第一次递增后的结果是 1。当键值不是整数时,Redis 会提示错误

INCRBY KEY VALUE 通过 VALUE 参数指定单次递增的数值

INCRBYFLOAT KEY FLOAT INCRBYFLOAT 命令类似于 INCRBY 命令,差别是前者可以递增一个双精度浮点数

递减数字

DECR KEY

DECRBY KEY VALUE

向末尾追加值

APPEND KEY VALUE 作用是向键值的末尾追加 value。如果键不存在,则将该键的值设置为 value,即相当于 SET key value。返回值是追加后字符串的总长度

获取字符串长度

STRLEN KEY STRLEN 命令返回键值的长度,如果键不存在则返回 0

同时获取/设置多个键值

MGET KEY1 KEY2 ...

MSET KEY1 VALUE1 KEY2 VALUE2

位操作

GETBIT KEY OFFSET 获得一个字符串类型键指定位置的二进制位的值(0 或 1),索引从 0 开始

SETBIT KEY OFFSET BIT SETBIT 命令可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值。如果要设置的位置超过了键值的二进制位的长度,SETBIT 命令会自动将中间的二进制位设置为 0。同理,要设置一个不存在的键的指定二进制位的值,SETBIT 命令会自动将该位置前面的位赋值为 0

BITCOUNT KEY [START][END] BITCOUNT 命令可以获得字符串类型键中值是 1 的二进制位的个数。可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节(即"aa")BIZCOUNT FOO 0 1

BITOP OPERATETION DESTKEY KEY [KEY1 KEY2....] BITOP 命令可以对多个字符串类型键进行位运算,并将结果存储在 destkey 参数指定的键中。BITOP 命令支持的运算操作有 AND、OR、XOR 和 NOT

BITPOS KEY BIT [START][END] 可以获得指定键的第一个二进制位是 0 或者 1 的位置。BITPOS 命令的第二个和第三个参数分别可以用来指定要查询的起始字节(同样从 0 开始算起)和结束字节。注意这里的单位不再是二进制位,而是字节。这里的返回结果的偏移量是从头开始算起的,与起始字节无关。另外,要特别说明的一个有趣的现象是,如果不设置结束字节且键值的所有二进制位都是 1,则当要查询值为 0 的二进制位偏移量时,返回结果会是键值长度的下一个字位的偏移量。这是因为 Redis 会认为键值长度之后的二进制位都是 0。

哈希类型

概念

哈希类型(hash)的键值是一种字典结构,其存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他数据类型,换句话说,哈希类型不能嵌套其他数据类型。一个哈希类型键可以包含至多 2^32 −1 个字段。PS:除了哈希类型,Redis 的其他数据类型同样不支持数据类型嵌套。例如集合类型的每个元素都只能是字符串,不能是另一个集合或哈希表等。

命令

HSET KEY FILED VALUE HSET 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(insert)还是更新操作(update)。当执行的是插入操作时(即之前字段不存在),HSET 命令会返回 1,当执行的是更新操作时(即之前字段已经存在),HSET 命令会返回 0。更进一步,当键本身不存在时,HSET 命令还会自动建立它。

赋值与取值

HGET KEY FILED

HMSET KEY FILED VALUE FILED2 VALUE...

HMGET KEY FILED FILED2

HGETALL KEY

是否存在

HEXISTS KEY FILED

HSETNX KEY FILED VALUE 当字段不存在时赋值 HSETNX 命令是原子操作,不用担心竞态条件。

只获取字段名或字段值

HKEYS KEY 有时仅仅需要获取键中所有字段名而不需要获取字段值,那么可以使用 HKEYS 命令

HVALS KEY HVALS 命令用来获取键中所有字段值

获取字段数量

HLEN KEY

列表类型

概念

列表类型(list)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获取列表的某一个片段。列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为 O(1),获取的元素越接近两端速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的 10 条记录也是极快的(和从只有 20 个元素的列表中获取头部或尾部的 10 条记录的速度是一样的)。与哈希类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳 232−1 个元素。

命令

向列表两端增加元素

LPUSH KEY VALUE VALUE2 LPUSH 命令用来向列表左边增加元素,返回值表示增加元素后列表的长度。

RPUSH KEY VALUE VALUE2

从列表两端弹出元素

LPOP KEY LPOP 命令可以从列表左边弹出一个元素。LPOP 命令执行两步操作:第一步是将列表左边的元素从列表中移除,第二步是返回被移除的元素值

RPOP KEY

获取列表中元素的个数

LLEN KEY LLEN 命令的功能类似于 SQL 语句 SELECT COUNT(*) FROM table_name,但是 LLEN 的时间复杂度为 O(1),使用时 Redis 会直接读取现成的值,而不需要像部分关系数据库(如使用 InnoDB 存储引擎的 MySQL 表)那样需要遍历一次数据表来统计条目数量。

获取列表片段

LRANGE KEY START TOP LRANGE 命令是列表类型最常用的命令之一,它能够获取列表中的某一片段。LRANGE 命令将返回索引从 start 到 stop 之间的所有元素(包含两端的元素)。LRANGE 返回的值包含最右边的元素。显然,LRANGE numbers 0 -1 可以获取列表中的所有元素。一些特殊情况如下。(1)如果 start 的索引位置比 stop 的索引位置靠后,则会返回空列表。(2)如果 stop 超出实际的索引范围,则会返回到列表最右边的元素。

删除列表中指定的值

LREM KEY COUNT VALUE LREM 命令会删除列表中前 count 个值为 value 的元素,返回值是实际删除的元素个数。根据 count 值的不同,LREM 命令的执行方式会略有差异。(1)当 count > 0 时,LREM 命令会从列表左边开始删除前 count 个值为 value 的元素。(2)当 count < 0 时,LREM 命令会从列表右边开始删除前 |count| 个值为 value 的元素。(3)当 count = 0 时,LREM 命令会删除所有值为 value 的元素。

获取/设置指定索引的元素值

LINDEX KEY INDEX LINDEX 命令用来返回指定索引的元素,索引从 0 开始 如果 index 是负数,则表示从右边开始计算的索引

LSET KEY INDEX VALUE LSET 是另一个通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value

只保留列表指定片段

LTRIM KEY START END LTRIM 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和 LRANGE 命令相同

向列表中插入元素

LINSERT KEY BEFORE|AFTER PIVOT VALUE LINSERT 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE 还是 AFTER 来决定将 value 插入该元素的前面还是后面。

将元素从一个列表转到另一个列表

RPOPLPUSH SOURCE DESTINATION RPOPLPUSH 是很有意思的命令,从名字就可以看出它的功能:先执行 RPOP 命令再执行 LPUSH 命令。RPOPLPUSH 命令会先从 source 列表类型键的右边弹出一个元素,然后将其加入 destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的

集合类型

概念

集合中的每个元素都是不同的,且没有顺序。一个集合类型(set)键可以存储至多 2^32 −1 个(相信大家对这个数字已经很熟悉了)字符串。

命令

增加/删除元素

SADD KEY MEMBER1 MEMBER2 SADD 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。此命令的返回值是增加成功的元素个数(忽略的元素不计算在内)

SREM KEY MEMBER1 MEMBER2

获取集合中的所有元素

SMEMBERS KEY

判断元素是否在集合中

SISMEMBER KEY MEMBER 判断一个元素是否在集合中是一个时间复杂度为 O(1)的操作,无论集合中有多少个元素,SISMEMBER 命令始终可以极快地返回结果。当值存在时 SISMEMBER 命令返回 1,当值不存在或键不存在时返回 0

集合间运算

SDIFF KEY KEY1 KEY2 SDIFF 命令用来对多个集合执行差集运算。集合 A 与集合 B 的差集表示为 A−B,代表所有属于 A 且不属于 B 的元素构成的集合

SINTER KEY KEY1 KEY2 SINTER 命令用来对多个集合执行交运算。集合 A 与集合 B 的交集表示为 A ∩B,代表所有属于 A 且属于 B 的元素构成的集合

SUNION KEY KEY1 KEY2 SUNION 命令用来对多个集合执行并运算。集合 A 与集合 B 的并集表示为 A∪B,代表所有属于 A 或属于 B 的元素构成的集合

获取集合中的元素个数

SCARD KEY

进行集合运算存储结果

SDIFFSTORE DESTINATION KEY KEY1 KEY2

SINTERSTORE DESTINATION KEY KEY1 KEY2

SUNIONSTORE DESTINATION KEY KEY1 KEY2

SDIFFSTORE 命令和 SDIFF 命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在 destination 键中。SDIFFSTORE 命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。SINTERSTORE 和 SUNIONSTORE 命令与 SDIFFSTORE 命令类似,不再赘述。

随机获取集合中的元素

SRANDMEMBER KEY [COUNT] SRANDMEMBER 命令用来随机从集合中获取一个元素 (1)当 count>0 时,SRANDMEMBER 会随机从集合里获取 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的全部元素。(2)当 count<0 时,SRANDMEMBER 会随机从集合里获取 |count| 个元素,这些元素有可能相同

从集合中弹出一个元素

SPOP KEY 我们学习过 LPOP 命令,其作用是从列表左边弹出一个元素(即返回元素的值并删除它)。SPOP 命令的作用与之类似,但因为集合类型的元素是无序的,所以 SPOP 命令会从集合中随机选择一个元素弹出

有序集合类型

概念

在集合类型的基础上,有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型所支持的操作,还能够完成获取分数最高(或最低)的前 N 个元素、获取指定分数范围内的元素等与分数有关的操作。虽然集合中的每个元素都是不同的,但是它们的分数可以相同。有序集合类型在某些方面和列表类型有些相似。(1)二者都是有序的。(2)二者都可以获取某一范围的元素。但是二者有着很大的区别,这使得它们的应用场景也是不同的。(1)列表类型是通过链表实现的,获取靠近两端的数据时速度极快,而当元素数量增多后,访问中间部分数据的速度会较慢,所以它更适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。(2)有序集合类型是使用哈希表和跳表(skip list)实现的,所以即使读取位于中间部分的数据速度也很快,时间复杂度是 O(logN)。(3)在列表中不能简单地调整某个元素的位置,但是在有序集合中可以(通过更改这个元素的分数)。(4)有序集合比列表类型更耗费内存。

命令

增加元素

ZADD KEY SCORE MEMBER SCORE2 MEMBER ZADD 命令用来向有序集合中加入一个元素的分数和该元素,如果该元素已经存在则会用新的分数替换原有的分数。ZADD 命令的返回值是新加入集合中的元素个数(不包含之前已经存在的元素)。

获取元素的分数

ZSCORE KEY MEMBER

获取排名在某个范围内的元素列表

ZRANGE KEY START TOP [WITHSCORES] ZRANGE 命令会按照元素分数从小到大的顺序返回索引在 start~stop 范围内的所有元素(包含两端的元素)。ZRANGE 命令与 LRANGE 命令十分相似,例如索引都是从 0 开始,负数代表从后向前查找(−1 表示最后一个元素)。如果需要同时获取元素的分数的话,可以在 ZRANGE 命令的尾部加上 WITHSCORES 参数

ZREVRANGE KEY START TOP [WITHSCORES] ZREVRANGE 命令和 ZRANGE 的唯一不同在于 ZREVRANGE 命令是按照元素分数从大到小的顺序给出结果的。

获取指定分数范围内的元素

ZRANGEBYSCORE KEY MIN MAX [WITHSCORES] [LIMIT OFFSET COUNT]

ZREVRANGEBYSCORE KEY MIN MAX [WITHSCORES] [LIMIT OFFSET COUNT]

ZRANGEBYSCORE 命令参数虽然多,但是都很好理解。该命令按照元素分数从小到大的顺序返回分数在 min 和 max 之间(包含 min 和 max)的元素 如果希望分数范围不包含端点值,可以在分数前加上“(”。min 和 max 还支持无穷大,同 ZADD 命令一样,-inf 和 +inf 分别表示负无穷和正无穷。

ZREVRANGEBYSCORE 命令不仅是按照元素分数从大到小的顺序给出结果的,而且它的 min 和 max 参数的顺序和 ZRANGEBYSCORE 命令是相反的

增加某个元素的分数

ZINCRBY KEY INCREMENT MEMBER ZINCRBY 命令可以增加一个元素的分数,返回值是更改后的分数 increment 也可以是负数,表示减分。如果指定的元素不存在,Redis 在执行命令前会先建立它并将它的分数赋为 0 再执行操作。

获得集合中元素的数量

ZCARD KEY

获得指定分数范围内的元素个数

ZCOUNT KEY MIN MAX

删除一个或多个元素

ZREM KEY MEMBER1 MEMBER2

按照排名范围删除元素

ZREMRANGEBYRANK KEY START STOP ZREMRANGEBYRANK 命令按照元素分数从小到大的顺序(即索引 0 表示最小的值)删除处在指定排名范围内的所有元素,并返回删除的元素个数

按照分数范围删除元素

ZREMRANGEBYSCORE KEY MIN MAX ZREMRANGEBYSCORE 命令会删除指定分数范围内的所有元素,参数 min 和 max 的特性和 ZRANGEBYSCORE 命令中的一样。返回值是删除的元素个数

获得元素的排名

ZRANK KEY MEMBER

ZREVRANK KEY MEMBER

计算有序集合的交集

ZINTERSTORE DESTINATION NUMKEYS KEY KEY1 [WEIGHTS WEIGHT [WEIGHT]] [AGGREGATE SUM|MIN|MAX]

ZINTERSTORE 命令用来计算多个有序集合的交集并将结果存储在 destination 键中(同样以有序集合类型存储),其返回值为 destination 键中的元素个数。destination 键中元素的分数是由 AGGREGATE 参数决定的。(1)当 AGGREGATE 是 SUM 时(也就是默认值),destination 键中元素的分数是每个参与计算的集合中该元素分数的和。(2)当 AGGREGATE 是 MIN 时,destination 键中元素的分数是每个参与计算的集合中该元素分数的最小值。(3)当 AGGREGATE 是 MAX 时,destination 键中元素的分数是每个参与计算的集合中该元素分数的最大值。

流类型

概念

Redis 的流类型继承了这些特性。用我们之前学的列表类型来比较,流类型与列表类型的相同点是都可以在列表(或流)的末尾追加内容,而对应上面我们提到的两个特性,流类型与列表类型的不同点如下。(1)列表类型可以在头部和中间插入内容,而日志没有类似的需求,所以流类型也只支持在末尾追加内容[15]。不过流类型比列表类型强大的是,在插入一个新条目时可以自动为其生成一个在流中的唯一 ID(类似于日志的行号)。这个 ID 可以用来进行查询等操作,本书后面会详细介绍。(2)之前学习过,列表类型的每个条目只能是一个字符串。类似的还有哈希类型的字段值和有序集合类型的值,它们也都只能是字符串。而流类型的每个条目都可以是若干键值对,可以方便我们结构化地存储日志的详情。例如,对于 NGINX 的访问日志,我们可以用键值对分别存储 IP 地址、访问的网址等信息。此外,流类型的另一个重要用途是作为消息中间件使用。

命令

增加条目

XADD KEY [MAXLEN [=|~] THRESHOLD] *|ID FIELD VALUE [FIELD VALUE]

作为唯一一个用来向流中增加条目的命令,XADD 命令可以分成两部分:第一部分用来向流中插入新条目,第二部分(上述命令定义中 MAXLEN 所在的指令组)类似 LTRIM 命令,用来要求流最多只保持指定数量的条目。其中,第二部分是可选的。

返回值

了解了条目的 ID 后,下面来介绍命令中的“”。通过命令定义我们知道,第二个参数既可以是“”,也可以是 ID。这个参数的含义是新增加的条目的主键,在绝大多数时候,我们只需要 Redis 帮我们按照上面的规则自动生成一个就可以了,此时用“*”代替具体的 ID,然后根据返回值就可以知道自动生成的 ID 是什么了。

在一些很特殊的场景下,用户可能会需要指定 ID。这种需求的出现大多是因为系统中存在多个组件(如 Redis 和 MySQL),用户希望 Redis 和 MySQL 对于同样的条目的 ID 是相同的。不过需要注意的是,因为流类型只支持在末尾追加,所有的 ID 都是单调递增的,所以如果指定的 ID 小于或等于流中最后一个条目的 ID 时,Redis 就会报错

接下来我们再看看 XADD 命令的第二部分。第二部分与后面会介绍的 XTRIM 命令相近,用来防止流中的条目无限增多。此外,MAXLEN 还支持修饰符“~”,其含义是近似裁剪。这个修饰符表示不需要精确地保留 100 个条目,而是可以略微多一些。Redis 之所以提供这个修饰符,是因为考虑到流类型的内部实现所使用的数据结构,想要精确地保留指定个数的条目的性能开销相比于近似保留指定个数的条目要更大一些。考虑到一般不需要很精确地对流中条目个数进行修剪,所以建议在需要使用 MAXLEN 参数的大多数场景中都带上“~”修饰符来提升性能。

根据 ID 来按范围查询条目

XRANGE KEY START END [COUNT COUNT] XRANGE 命令提供根据两个条目 ID 来查找它们之间的条目列表的方法。因为条目 ID 是由时间戳组成的,所以这条命令可以让我们查询某个时间范围内的条目列表。另外,在查询时可以省略序列号部分,而只提供时间戳。XRANGE 命令会为起始时间戳补上“0”,为终止时间戳补上“18446744073709551615”(最大的序列号)。这样使得返回的结果会包含这两个时间戳之间的所有条目。此外,XRANGE 命令提供了两个特殊的 ID“”和“+”,分别用来表示最小 ID 和最大 ID。所以当想要获取一个流的所有条目时,可以使用 XRANGE key - +。

删除指定元素

XDEL KEY ID ID2 ID3

裁剪流

XTRIM KEY MAXLEN [=|~] THRESHOLD

XTRIM 命令相当于把 XADD 中的裁剪功能提取出来了,所以用法也和 XADD 的 MAXLEN 参数相同,返回值是被删除的条目的数量

获取流的长度

XLEN KEY XLEN 会返回一个流的条目个数

根据反向 ID 按范围查询条目

XREVRANGE 命令和 XRANGE 命令类似,只不过前者获取的条目是逆序的。此外 XREVRANGE 命令也需要查询参数的起止 ID 并反向提供,如 XREVRANGEstreamkey + -,具体用法这里不再赘述

posted @ 2023-01-28 14:56  阿宇和阿屿  阅读(65)  评论(0)    收藏  举报