第三章 Redis 命令

40 阅读6分钟

1 字符串

字符串是一个由字节组成的序列,它可以存储 3 种不同的值:

  • 字节串(byte string)
  • 整数
  • 浮点数

对不同类型数据的操作:

  • 对整数浮点数进行自增、自减(INCR、DECR、INCRBY、DECRBY、INCREBYFLOAT),在 32 位系统上整数是 32 位有符号整数, 64 位系统上,整数是 64 位有符号整数。 浮点数的取值范围和精度是 IEEE 754 标准的双精度浮点数。

进行自增、自减操作时,空字符串会被当作 0 ,对非数值字符串进行自增自减会报错。

  • 对字符串可以当作二进制(bit)和子串(substring)处理。支持对字符串追加(APPEND),对字符串进行范围修改获取(GETRANGE、SETRANGE),按照二进制进行设置获取值(GETBIT、SETBIT),统计二进制值为 1 的个数(BITCOUNT),进行位运算(BITOP)。

SETRANGE、SETBIT 在当前字符串长度不满足新字符串长度时,会在末尾使用 null 来扩展字符串后写入。GETRANGE 超出字符串末尾的部分会被视为空串, GETBIT 超出字符串末尾的二进制会被视为 0.

2 列表

列表是由多个字符串值组成的有序序列结构。

它支持从左右两侧推入值 (RPUSH、LPUSH),从左右两侧弹出并删除值(RPOP、LPOP)每值返回 null,在列表中按照偏移量取值(LINDEX),返回给定范围内的值(LRANGE)其中会包含偏移量的开始和结尾值。对列表进行修剪(LTRIM)修剪得开始和结尾值会被保留。

还支持定时、不定时阻塞式弹出(BLPOP、BRPOP)定时阻塞弹出,如果到时没有值,返回 null。

还支持非阻塞、定时或非定时阻塞从一个队列右端弹出,推入另一个队列得左边(RPOPLPUSH、BRPOPLPUSH)。

3 集合

集合是用来存储多个不相同的值,可以快速对集合进行添加、移除、和检查元素是否存在的操作。

它支持添加(SADD),删除(SREM),检查元素是否存在(SISMEMBER),返回集合元素个数(SCARD),返回所有元素(SMEMBERS),随机返回一个或者多个元素(SRANDMEMBER),随机移除并删除一个元素(SPOP),将目标元素移动到新的集合(SMOVE)。

还支持对多个集合进行计算:求差集(SDIFF),返回属于第一个集合但是不属于其他集合的元素,求差集并存储到新的集合里(SDIFFSTORE),求交集(SINTER),求交集并存储到新的集合里(SINTERSTORE),求并集(SUNION),求并集并存储到新的集合里(SUNIONSTORE)。

4 散列

散列可以将多个键值对存储在一个 Redis 键里。

它支持单个键值操作(HSET、HGET)、支持多个键值对操作(HMGET、HMSET)。获取散列的键值对个数(HLEN),获取散列中所有的键值对(HGETALL),删除散列中的键值对(HDEL)。判断散列中是不存在给定的键(HEXISTS),获取散列中所有的键(HKEYS),获取散列中所有的值(HVALS),给散列中的值自增(HINCRBY),给散列中的值进行浮点自增(HINCRBYFLOAT)。

如果散列中的值非常大,可以使用 HKEYS 获取所有的键,然后再取值,从而避免使用 HGETALL。

5 有序集合

有序集合和散列一样存储着键值的映射关系,有序集合存储的是成员和分值的映射,并且提供了分值处理命令,以及根据分值大小有序 fetch 或者 sacn 成员和分值的命令。

添加带有分值的成员(ZADD),删除指定成员并返回被删除的数量(ZREM),返回有序集合成员数量(ZCARD),对成员的分值进行自增(ZINCRBY),返回给定分值范围内的成员数量(ZCOUNT),返回指定成员再有序集合中的排名(ZRANK),返回成员的分值(ZSCORE),返回给定范围内的成员(ZRANGE)可选返回成员的分值。

返回成员的排名,成员的排名由分值从大到小排列(ZREVRANK),返回给定排名范围内的成员,成员分值按照从大到小排列(ZREVRANGE),返回有序集合中分值介于给定范围之间的所有成员(ZRANGEBYSCORE),返回有序集合中分值介于给定范围之间的成员,分值由大到小排列(ZREVRANGEBYSCORE),移除排名介于给定范围内的成员(ZREMRANGEBYRANK),移除分值介于给定范围内的成员(ZREMRANGEBYSCORE),对有序集合进行交集运算并存储到新的集合中(ZINTERSTORE)求交集时对所有相交成员分值求和,对有序集合进行并集计算并存储到新的集合中(ZUNIONSTORE)求并集时对相同成员的分值求和。

6 发布与订阅

支持订阅一个或者多个频道(SUBSCRIBE),退定一个或多个频道(UNSUBSCRIBE),向给定频道发布消息(PUBLISH),按照给定模式订阅匹配的所有频道(PSUBSCRIBE),按照模式退定所有匹配的频道(PUNSUBSCRIBE)。

使用 Redis 做发布订阅存在两个问题,当多个客户端订阅 Redis 频道时,如果有处理较慢的客户端,会导致 Redis 消息积压,导致 Redis 变慢甚至系统崩溃。新版本的 Redis 会自动断开不符合 client-output-buffer-limit 的客户端。

当客户端断线重连后,会丢失断线期间的所有消息。

7 其他命令

排序

Redis 可以根据字符串、列表、集合、散列、有序集合的键里存储的值,对列表、集合、有序集合进行排序。

sort 可以实现按升序来排序元素;将元素看作数字来排序;或者将元素看作二进制字符串进行排序;或者使用值作为权重来进行排序;甚至还可以输入列表、集合、有序集合意外的其他地方进行取值。

> rpush sort-input 23 15 110 7
4
> sort sort-input
7
15
23
110
> sort sort-input desc
110
23
15
7
> sort sort-input asc alpha
110
15
23
7

事务

Redis 事务可以让一个客户端再不被其他客户端打断的情况下执行多个命令,它是用 MULTI 和 EXEC 命令将要执行的命令包裹起来,被包裹的命令会一个接一个执行,直到所有命令都执行完为止。当一个事务执行完毕 Redis 才会处理其他客户的命令。

键过期

给键设置一个过期时间,这样就不用显示的删除无用数据。

支持 移除键的过期时间(PERSIST),查看键距离过期还有多少秒(TTL),让键在指定秒数后过期(EXPIRE),让指定键在给定的 UNIX 时间戳过期(EXPIREAT),查看键距离过期还有多少毫秒(PTTL),让指定键在指定的毫秒数之后过期(PEXPIRE),将一个毫秒级精度的 UNIX 时间戳设置为过期时间。