一、Redis是什么
Redis是一个开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如字符串、哈希、列表、集合、带范围查询的排序集合、位图、超日志、带半径查询的地理空间索引和流。Redis具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和带有Redis集群的自动分区提供高可用性。
二、Redis的数据类型
Redis不是一个简单的键值存储,它实际上是一个数据结构服务器,支持不同类型的值。这意味着,在传统的键值存储中,将字符串键与字符串值相关联,而在Redis中,该值不仅限于简单的字符串,还可以保存更复杂的数据结构。这些数据结构包括:
数据结构 | 描述 |
---|---|
string | 二进制安全字符串。 |
List | 根据插入顺序排序的字符串元素集合。 |
Set | 唯一的、未排序的字符串元素的集合。 |
Sorted set | 类似于集合,但每个字符串元素都与一个浮点数(称为score)相关联。元素总是按其分数排序,因此与集合不同,可以检索一系列元素 |
Hashe | 它们是由与值关联的字段组成的映射。字段和值都是字符串。 |
Bit arrays (or simply bitmaps) | 使用特殊命令,可以像处理一个位数组一样处理字符串值:可以设置和清除单个位,将所有位设置为1,查找第一个设置或未设置的位,等等。 |
HyperLogLog | 这是一种概率数据结构,用于估计集合的基数。 |
Stream | 只追加提供抽象日志数据类型的类映射项集合 |
1、key
Redis的key是二级制安全的,可以用任意的二级制序列作为key,使用key有几点注意事项:
- 避免key过长,过长的key可以通过hash key 生成一个sha1串解决
- 避免key过短,尽量保持key的可读性的情况下缩短key的长度
- 建立一种key的Schema:例如 应用名:业务名:实体名:属性名
- key的最大允许值是512MB
2、string
string类型是可以与Redis键关联的最简单的值类型。与string相关的命令:
命令 | 描述 |
---|---|
set key value [expiration EX seconds|PX milliseconds] [NX|XX] | 如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。 expiration 表示key的生存时间 为空表示不设置生存时间,NX表示只在键不存在时, 才对键进行设置操作,XX表示只在键已经存在时, 才对键进行设置操作。 |
get key string | 检索一个key值 |
incr key | 为键 key 储存的数字值加上一。如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。INCR 命令会返回键 key 在执行加一操作之后的值。 |
SETNX key value | 只在键 key 不存在的情况下, 将键 key 的值设置为 value 。 若键 key 已经存在, 则 SETNX 命令不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 |
SETEX key seconds value | 将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。 如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。 SETEX 和这两个命令的不同之处在于 SETEX 是一个原子(atomic)操作, 它可以在同一时间内完成设置值和设置过期时间这两个操作, 因此 SETEX 命令在储存缓存的时候非常实用。 |
PSETEX key milliseconds value | 这个命令和 SETEX 命令相似, 但它以毫秒为单位设置 key 的生存时间, 而不是像 SETEX 命令那样以秒为单位进行设置。 |
GET key | 返回与键 key 相关联的字符串值。 如果键 key 不存在, 那么返回特殊值 nil ; 否则, 返回键 key 的值。 如果键 key 的值并非字符串类型, 那么返回一个错误, 因为 GET 命令只能用于字符串值。 |
GETSET key value | 将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。 如果键 key 没有旧值, 也即是说, 键 key 在被设置之前并不存在, 那么命令返回 nil 。 当键 key 存在但不是字符串类型时, 命令返回一个错误。 |
STRLEN key | STRLEN 命令返回字符串值的长度。 当键 key 不存在时, 命令返回 0 。 当 key 储存的不是字符串值时, 返回一个错误。 |
APPEND key value | 如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾。 如果 key 不存在, APPEND 就简单地将键 key 的值设为 value , 就像执行 SET key value 一样。 返回 追加 value 之后, 键 key 的值的长度。 |
SETRANGE key offset value | 从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。 不存在的键 key 当作空白字符串处理。 SETRANGE 命令会确保字符串足够长以便将 value 设置到指定的偏移量上, 如果键 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ), 那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )进行填充。 SETRANGE 命令会返回被修改之后, 字符串值的长度。 |
GETRANGE key start end | 返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)。 负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符, 以此类推。 GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。 GETRANGE 命令会返回字符串值的指定部分。 |
INCRBY key increment | 为键 key 储存的数字值加上增量 increment 。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。 如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。 返回 在加上增量 increment 之后, 键 key 当前的值。 |
INCRBYFLOAT key increment | 为键 key 储存的值加上浮点数增量 increment 。 如果键 key 不存在, 那么 INCRBYFLOAT 会先将键 key 的值设为 0 , 然后再执行加法操作。 如果命令执行成功, 那么键 key 的值会被更新为执行加法计算之后的新值, 并且新值会以字符串的形式返回给调用者。 |
DECR key | 为键 key 储存的数字值减去一。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。 如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。 DECR 命令会返回键 key 在执行减一操作之后的值。 |
DECRBY key decrement | 将键 key 储存的整数值减去减量 decrement 。 如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECRBY 命令。 如果键 key 储存的值不能被解释为数字, 那么 DECRBY 命令将返回一个错误。 DECRBY 命令会返回键在执行减法操作之后的值。 |
MSET key value [key value …] | 同时为多个键设置值。 MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。 |
MSETNX key value [key value …] | 当且仅当所有给定键都不存在时, 为所有给定键设置值。 即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。 MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。 |
MGET key [key …] | 返回给定的一个或多个字符串键的值。 如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。 MGET 命令将返回一个列表, 列表中包含了所有给定键的值。 |
3、List
命令 | 描述 |
---|---|
LPUSH key value [value …] | 将一个或多个值 value 插入到列表 key 的表头 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。 执行 LPUSH 命令后,列表的长度。 |
LPUSHX key value | 将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。 和 LPUSH key value [value …] 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。 |
RPUSH key value [value …] | 将一个或多个值 value 插入到列表 key 的表尾(最右边)。 如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。 |
RPUSHX key value | 将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。 和 RPUSH key value [value …] 命令相反,当 key 不存在时, RPUSHX 命令什么也不做。 |
LPOP key | 移除并返回列表 key 的头元素。 返回值 列表的头元素。 当 key 不存在时,返回 nil 。 |
RPOP key | 移除并返回列表 key 的尾元素。 返回值 列表的尾元素。 当 key 不存在时,返回 nil 。 |
RPOPLPUSH source destination | 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作: 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。 如果 source 不存在,值 nil 被返回,并且不执行其他动作。 如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。 |
LREM key count value | 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作: 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。 如果 source 不存在,值 nil 被返回,并且不执行其他动作。 如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。 |
LREM key count value | 根据参数 count 的值,移除列表中与参数 value 相等的元素。 count 的值可以是以下几种: count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。 count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。 count = 0 : 移除表中所有与 value 相等的值。 被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。 |
LLEN key | 返回列表 key 的长度。 如果 key 不存在,则 key 被解释为一个空列表,返回 0 . 如果 key 不是列表类型,返回一个错误。 |
LINDEX key index | 返回列表 key 中,下标为 index 的元素。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 如果 key 不是列表类型,返回一个错误。 |
LINSERT key BEFORE|AFTER pivot value | 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 当 pivot 不存在于列表 key 时,不执行任何操作。 当 key 不存在时, key 被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。 如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。 |
LSET key index value | 将列表 key 下标为 index 的元素的值设置为 value 。 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。 |
LRANGE key start stop | 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 假如你有一个包含一百个元素的列表,对该列表执行 LRANGE list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LRANGE 命令的取值范围之内(闭区间). 超出范围的下标值不会引起错误。 如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。 如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。 返回值一个列表,包含指定区间内的元素。 |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 当 key 不是列表类型时,返回一个错误。 |
BLPOP key [key …] timeout | BLPOP 是列表的阻塞式(blocking)弹出原语。 它是 LPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。 |
BRPOP key [key …] timeout | BRPOP 是列表的阻塞式(blocking)弹出原语。 它是 RPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到等待超时或发现可弹出元素为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的尾部元素。 |
BRPOPLPUSH source destination timeout | BRPOPLPUSH 是 RPOPLPUSH source destination 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH source destination 一样。 当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH key value [value …] 或 RPUSH key value [value …] 命令为止。 超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长(block indefinitely) 。 |
4、Set
命令 | 描述 |
---|---|
SADD key member [member …] | 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。 当 key 不是集合类型时,返回一个错误。 |
SISMEMBER key member | 判断 member 元素是否集合 key 的成员。 如果 member 元素是集合的成员,返回 1 。 如果 member 元素不是集合的成员,或 key 不存在,返回 0 。 |
SPOP key | 移除并返回集合中的一个随机元素。 被移除的随机元素。 当 key 不存在或 key 是空集时,返回 nil 。 |
SRANDMEMBER key [count] | 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。 |
SREM key member [member …] | 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。 当 key 不是集合类型,返回一个错误。 |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合。 SMOVE 是原子性操作。 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。 当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。 当 source 或 destination 不是集合类型时,返回一个错误。 |
SCARD key | 返回集合 key 的基数(集合中元素的数量)。 集合的基数。 当 key 不存在时,返回 0 。 |
SMEMBERS key | 返回集合 key 中的所有成员。 不存在的 key 被视为空集合。 |
SINTER key [key …] | 返回一个集合的全部成员,该集合是所有给定集合的交集。 不存在的 key 被视为空集。 当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。 |
SINTERSTORE destination key [key …] | 这个命令类似于 SINTER key [key …] 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 |
SUNION key [key …] | 返回一个集合的全部成员,该集合是所有给定集合的并集。 不存在的 key 被视为空集。 |
SUNIONSTORE destination key [key …] | 这个命令类似于 SUNION key [key …] 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 已经存在,则将其覆盖。 destination 可以是 key 本身。 |
SDIFF key [key …] | 返回一个集合的全部成员,该集合是所有给定集合之间的差集。 不存在的 key 被视为空集。 |
SDIFFSTORE destination key [key …] | 这个命令的作用和 SDIFF key [key …] 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。 如果 destination 集合已经存在,则将其覆盖。 destination 可以是 key 本身。 |
5、Sorted set
命令 | 描述 |
---|---|
ZADD key score member [[score member] [score member] …] | 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。 score 值可以是整数值或双精度浮点数。 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。 当 key 存在但不是有序集类型时,返回一个错误。 |
ZSCORE key member | 返回有序集 key 中,成员 member 的 score 值。 如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。 |
ZINCRBY key increment member | 为有序集 key 的成员 member 的 score 值加上增量 increment 。 可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。 当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。 当 key 不是有序集类型时,返回一个错误。 score 值可以是整数值或双精度浮点数。 |
ZCARD key | 当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0 。 |
ZCOUNT key min max | 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。 |
ZRANGE key start stop [WITHSCORES] | 返回有序集 key 中,指定区间内的成员。 其中成员的位置按 score 值递增(从小到大)来排序。 具有相同 score 值的成员按字典序(lexicographical order )来排列。 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集 key 中,指定区间内的成员。 其中成员的位置按 score 值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。 |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。 |
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count] | 返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。 |
ZRANK key member | 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。 排名以 0 为底,也就是说, score 值最小的成员排名为 0 。 |
ZREVRANK key member | 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。 排名以 0 为底,也就是说, score 值最大的成员排名为 0 。 |
ZREM key member [member …] | 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。 当 key 存在但不是有序集类型时,返回一个错误。 |
ZREMRANGEBYRANK key start stop | 移除有序集 key 中,指定排名(rank)区间内的所有成员。 区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 |
ZREMRANGEBYSCORE key min max | 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。 |
ZRANGEBYLEX key min max [LIMIT offset count] | 当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序, 而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员。 如果有序集合里面的成员带有不同的分值, 那么命令返回的结果是未指定的(unspecified)。 可选的 LIMIT offset count 参数用于获取指定范围内的匹配元素 (就像 SQL 中的 SELECT LIMIT offset count 语句)。 |
ZLEXCOUNT key min max | 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会返回该集合中, 成员介于 min 和 max 范围内的元素数量。 |
ZREMRANGEBYLEX key min max | 对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。 |
ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | 计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。 WEIGHTS 使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。 如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。 AGGREGATE 使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。 默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。 |
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | 计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和. |
6、Hash
命令 | 描述 |
---|---|
HSET hash field value | 将哈希表 hash 中域 field 的值设置为 value 。 如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。 如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。 |
HSETNX hash field value | 当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。 如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。 如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。 |
HGET hash field | HGET 命令在默认情况下返回给定域的值。 如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil 。 |
HEXISTS hash field | 检查给定域 field 是否存在于哈希表 hash 当中。 HEXISTS 命令在给定域存在时返回 1 , 在给定域不存在时返回 0 。 |
HDEL key field [field …] | 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。 |
HLEN key | 返回哈希表 key 中域的数量。 当 key 不存在时,返回 0 。 |
HSTRLEN key field | 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。 如果给定的键或者域不存在, 那么命令返回 0 。 |
HINCRBY key field increment | 为哈希表 key 中的域 field 的值加上增量 increment 。 增量也可以为负数,相当于对给定域进行减法操作。 如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。 |
HINCRBYFLOAT key field increment | 如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。 如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。 |
HMSET key field value [field value …] | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 此命令会覆盖哈希表中已存在的域。 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。 |
HMGET key field [field …] | 返回哈希表 key 中,一个或多个给定域的值。 如果给定的域不存在于哈希表,那么返回一个 nil 值。 因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。 |
HKEYS key | 返回哈希表 key 中的所有域。 |
HVALS key | 返回哈希表 key 中所有域的值。 |
HGETALL key | 返回哈希表 key 中,所有的域和值。 在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。 |
三、数据库命令
命令 | 描述 |
---|---|
EXISTS key | 若 key 存在,返回 1 ,否则返回 0 。 |
TYPE key | 返回 key 所储存的值的类型。 |
RENAME key newkey | 将 key 改名为 newkey 。 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。 当 newkey 已经存在时, RENAME 命令将覆盖旧值。 |
RENAMENX key newkey | 当且仅当 newkey 不存在时,将 key 改名为 newkey 。 当 key 不存在时,返回一个错误。 修改成功时,返回 1 ; 如果 newkey 已经存在,返回 0 。 |
MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中。 如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。 因此,也可以利用这一特性,将 MOVE 当作锁(locking)原语(primitive)。 |
DEL key [key …] | 删除给定的一个或多个 key 。 不存在的 key 会被忽略。 返回被删除 key 的数量。 |
RANDOMKEY | 当数据库不为空时,返回一个 key 。 当数据库为空时,返回 nil |
DBSIZE | 返回当前数据库的 key 的数量。 |
KEYS pattern | 查找所有符合给定模式 pattern 的 key , 比如说: KEYS * 匹配数据库中所有 key 。 KEYS h?llo 匹配 hello , hallo 和 hxllo 等。 KEYS h*llo 匹配 hllo 和 heeeeello 等。 KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。 特殊符号用 \ 隔开。 |
FLUSHDB | 清空当前数据库中的所有 key。 |
FLUSHALL | 清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。 |
SELECT index | 切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。 默认使用 0 号数据库。 |
SWAPDB db1 db2 | 对换指定的两个数据库, 使得两个数据库的数据立即互换。 |
1、SCAN cursor [MATCH pattern] [COUNT count]
SCAN
命令及其相关的 SSCAN
命令、 HSCAN
命令和 ZSCAN
命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):
-
SCAN
命令用于迭代当前数据库中的数据库键。 -
SSCAN
命令用于迭代集合键中的元素。 -
HSCAN
命令用于迭代哈希键中的键值对。 -
ZSCAN
命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS
命令、 SMEMBERS
命令带来的问题 —— 当 KEYS
命令被用于处理一个大的数据库时, 又或者 SMEMBERS
命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。
不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS
命令可以返回集合键当前包含的所有元素, 但是对于 SCAN
这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 (offer limited guarantees about the returned elements)。
因为 SCAN
、 SSCAN
、 HSCAN
和 ZSCAN
四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:
-
SSCAN
命令、HSCAN
命令和ZSCAN
命令的第一个参数总是一个数据库键。 -
而
SCAN
命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。
COUNT 选项
虽然增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT
选项, 对命令的行为进行一定程度上的调整。
基本上, COUNT
选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。
虽然 COUNT
选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。
-
COUNT
参数的默认值为10
。 -
在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用
MATCH
选项, 那么命令返回的元素数量通常和COUNT
选项指定的一样, 或者比COUNT
选项指定的数量稍多一些。 -
在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视
COUNT
选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。
MATCH 选项
和 KEYS
命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern>
参数来实现。
2、SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination]
返回或保存给定列表、集合、有序集合 key
中经过排序的元素。
排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
选项 | 描述 |
---|---|
[BY pattern] | 默认情况下, SORT uid 直接按 uid 中的值排序, 通过使用 BY 选项,可以让 uid 按其他键的元素来排序。 |
[GET pattern …] | 使用 GET 选项, 可以根据排序的结果来取出相应的键值。 |
DESC | 降序 |
ASC | 升序 |
ALPHA | 字典序排列 |
[LIMIT offset count] | 类似SQL的语法 |
[STORE destination] | 将结果存储到目标key中 |
四、自动过期
命令 | 描述 |
---|---|
EXPIRE key seconds | 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。 |
EXPIREAT key timestamp | 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。 |
PERSIST key | 移除给定 key 的生存时间,将这个 key 从“易失的”(带生存时间 key )转换成“持久的”(一个不带生存时间、永不过期的 key )。 当生存时间移除成功时,返回 1 . 如果 key 不存在或 key 没有设置生存时间,返回 0 。 |
PEXPIRE key milliseconds | 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。 |
PEXPIREAT key milliseconds-timestamp | 这个命令和 expireat 命令类似,但它以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 expireat 那样,以秒为单位。 |
PTTL key | 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。 |