Redis 中的数据类型及基本操作
Redis 内置的数据类型有 5种:字符串String、哈希Hash、列表List、集合Set、有序集合ZSet
字符串类型
String 是 Redis 中最基本的类型,一个 key 对应着一个 value,String 类型是二进制安全的,即其值可以存储任何的类型,如图片或者序列化后的对象,其一个键最大可以存储 512MB
的数据。
字符串类型的操作
赋值操作
- Set key value [EX seconds] [PX milseconds] [NX|XX]
设置指定键的值,若不存在指定的 key,则添加,否则,则更新原有项。可选参数 EX 用于设置键值的过期时间,单位为秒,可选参数 PX 作用相同,不同的是其单位为毫秒,可选参数 NX 表示只有 key 不存在时才执行相应操作,XX 表示指定 key 存在时执行相应操作。
- SETNX key value
设置指定键的值,与上面的SET key value
不同的是,该命令只有在 key 不存在时才添加,相当于先进行exists key
判断是否已存在是否已存在指定的 Key,只有前面的命令返回 0,即不存在指定的 key 时,在执行set key value
。
- MSET key value [key value]
该命令开头的M
表示 Mutiple,这个命令用于同时设置多个键值,规则同SET key value
,不存在则添加,否则,则更新,如MSET name tusk gender male
。
- MSETNX
同时添加多个键值,与上面的MSET
相对应,只有的指定的 key 不存在时才会执行添加操作
- SETRANGE key offset value
使用 value 值替换指定 key 项从 offset 偏移值开始的的值。例如,现有一个name:tom
,
命令 | 结果 |
---|---|
SETRANGE name 1 T | Tom |
SETRANGE name 6 T | tom\x00\x00\x00T |
SETRANGE gender 5 gender | \x00\x00\x00\x00\x00\x00gender |
从上面的例子可以看出,当指定的 offset 大于原字符串的 len -1 时,两者的差项会被使用 \x00
补齐,如果指定的 key 不存在,则会根据指定的 key、offset、value 创建一个新的项并添加。
取值操作
-
GET key
获取指定的 key 的 value,如果不存在指定的 key,则返回 nil。
-
GETRANGE key start end
获取指定的 key 的值中的子串,如果指定的 key 不存在则返回空串,必须指定 start 和 end 参数,当end - start
值大于字符串的长度时,返回串本身。
-
GETSET key value
获取指定 key 的值,并返回原来的值,如果指定的 key 不存在,则添加此项,返回 nil
-
MGET k1,k2
获取指定的一个或多个 key 的值,指定 key 不存在时返回 nil
增量操作
-
INCR key
将 key 对应项的值增加 1,仅限对应值的类型为数值时有效,若对应项的值不为数值,则会发生错误
-
INCRBY key incresement
将 key 对应的项的值增加 incresement,若对应项不为整数数值,则会发生异常。
-
INCRBYFLOAT key increment
将 key 对应的项的值增加 increment,这里的 increment 为一个浮点数
-
DECR key
将 key 对应项的值减 1,对应项不为整数数值时发生错误
-
DECRBY key increment
将 key 对应项的值减 increment,对应项的值或 increment 不为整数时发生错误
生存时间设置
-
SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
-
PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
其它
- STRLEN key
获取 key 对应项的长度,不存在时返回 0
Hash 类型
Redis 中的 Hash 是一个字符串类型的字段与值的映射表,适合与一些对象的存储,Redis 中的每个 Hash 可以存储 2^32 - 1 个键值对。
Hash 类型的操作
赋值
- HMSET k field1 value1 field2 value2..
添加一个新的 Hash 对象,若指定的 key 项已存在,后续的操作会覆盖原来的项
- HSET key field value
将 key 指定的 Hash 对象的 field 对应的值设置为 value,当指定的 key 或 field 不存在时则添加。
- HSETNX key field value
作用同 HSET,不同的是,该命令只有在指定的 field 不存在时才会执行。
取值
- HGET key field
从 key 指定的 Hash 对象中获取对应的值,若指定的 key 或 field 不存在,均返回 nil
- HMGET key field1 field2..
从 key 指定的 Hash 对象中获取指定 filed 的值,不存在的 key 或 field 均返回 nil
- HGETALL key
返回 key 指定的 Hash 对象中的所有的减值对,key 不存在时返回 nil
增值操作
- HINCRBY key field increment
将 key 指定的 field 的值增加 increment ,对应项的值和 increment 必须为整数,increment 可以为负值
- HINCRBYFLOAT key field increment
将 key 指定的 field 的值增加,其中的对应项的值和 increment 均可以为 整数或浮点数,increment 可以为负值。
其它操作
-
HEXISTS key field
判断指定的字段 field 是否存在于 key 指定的 Hash 对象中,如果存在返回 1,否则返回0
-
HDEL key field1 field2
删除 key 指定的 Hash 对象的一个或多个字段,返回受影响的数目,当 key 或 field
不存在时,则忽略 -
HKEYS key
获取 key 值指定的 Hash 对象中的所有的字段,当 key 不存在时输出提示empty list or set
-
HLEN key
获取 hash 表中字段的数量,当key
不存在时返回 0
-
HVALS key
获取 hash 表中的所有的值,当 key 不存在时,输出提示:empty list or set
-
HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的键值对:Redis 中的Scan
列表类型
Redis 中的列表是简单的字符串列表,按照插入的顺序排序,一个列表最多可以存储 **2^32 -1 ** 个元素。
列表类型的操作
插入(赋值)操作
-
LPUSH key value1 [value2]
在 key 指定的列表的头部插入一个或多个值。当指定列表不存在时则创建后插入
-
LPUSHX key value1 [value2]
在 key 指定的列表头部插入一个或多个值,与 **LPUSH ** 不同的是,该命令只有在 key 指定的列表存在时才执行。
-
RPUSH key value1 [value2]
在 key 指定的列表的尾部插入一个或多个值, 当指定列表不存在时则创建后插入。
-
RPUSHX key value1 [value2]
在 key 指定列表的尾部插入一个或多个值,只有指定的列表存在时才会执行插入。
-
LINSERT key before|after existValue newValue
在 key 指定的列表的指定元素 existValue 的元素的前面或后面插入元素 newValue,若 existValue 不存在则返回 -1,如果 key 不存在或者为空列表,则视为空列表,不执行任何操作,当 key 指定的对象不是列表对象时,会发生错误,当执行成功时,返回插入后列表的长度。
-
LSET key index value
通过索引来设置列表的值,当key
指定的项不存在或不是列表类型时会发生错误,当指定的索引值无效时,发生错误,索引值可以为负值。
移除(取值)操作
-
LINDEX key index
通过索引获取 key 指定的列表中的元素。当 key 指定的对象不存在或指定的索引无效时返回 nil,其中的索引可以为负值,表示倒序取值,当 key 指定的对象不是列表时,则会发生错误。
-
LPOP key
移除并返回 key 指定列表中的第一项,当指定类型不为列表时发生错误,当列表为空或不存在时返回 nil
-
RPOP key
移除并返回 key 指定的列表中的最后一项,当指定类型不为列表时发生错误,当列表为空或不存在时返回 nil
-
LREM key count value
从 key 指定的列表中移除 count 的绝对值个与 value 相等的项。当 count>0 时表示从列表的头部向尾部进行搜索,当 count<0 时表示从列表的尾部向头部进行搜索。
-
BLPOP key1 key2 timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。当操作执行成功时返回两个元素,第一个为移除元素所属列表的 key,第二个为移除的元素,在指定多个列表的情况下,如指定两个列表 k1 和 k2,则当且仅当 k1 为空时才对 k2 进行操作,timeout 指操作的超时时间,单位为秒,如果列表被阻塞或列表为空时,在指定的超时时间后返回 nil,当指定的 key 不为列表类型时,发生错误
-
RLPOP key1 key2 timeout
作用及用法同 BLPOP,不同的是该命令 移除的为列表的最后一个元素
其它命令
- LLEN key
获取 key 对应的列表的长度,当 key 对应元素不为列表时发生错误
- LRANGE key start stop
获取 key 对应的列表 start 和 stop 范围内的元素,start 和 stop 均可以为负值,当 start 为负值时,总是返回empty list or set
.
- LTRIM key start stop
对 key 指定的列表进行裁剪,即只保留索引值介于 start 和 stop 之间(包括两端)的元素,其余元素会被删除。start 和 stop 均可以为负值。表示倒序
* RPOPLPUSH source destination 移除 **source** 列表的最后一个元素并将其添加到 **destination** 列表中,若 **source** 列表为空则返回 **nil**
* BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT 假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
集合
Redis 中的集合是一个字符串类型的无序集合,即集合中不存在重复的元素。集合中最大的元素个数为 2^32 -1
个,集合内部的操作是基于哈希表实现的,一次添加、查找、删除操作的时间复杂度都为 O(1)
集合类型的操作
添加操作
- SADD key member1 [member2]
向 key 指定的集合中添加项,若集合不存在则创建后添加
集合操作
- SDIFF key1 [key2] [key3]
返回给定k1与其它所有集合的差集,如 SDIFF k1,k2,k3,则返回从 k1 从移除 k1 与 k3、k1 与 k2的所有交集项构成的集合,不影响原来的集合。当两个集合 k1 和 k2 求差集时,若 k1 为空集合或不存在时返回empty list or set
,当 k2 为空集合或不存在时,二者差集为集合 k1
- SDIFFSTORE destination key1 [key2]
作用同 SDIFF,不同的是会将差集结果存储到 destination 中。
- SINTER k1 [k2]
获取指定所有集合的交集,当 k1 为空集合或者不存在时,返回empty list or set
- SINTERSTORE destination k1 [k2]
作用同 SINTER,不同的是会将获取的交集存储到 destination 中
- SUNION k1 [k2]
获取给定所有集合的并集
- SUNION destion k1 [k2]
作用同 SUNION,不同的是会将获取的并集结果存储到 destination 中
其它操作
- SCARD key
获取 key 指定的结合中的项数
- SISMEMBER key member
判断 member 是否属于 key 指定的集合。属于时返回 1,否则返回0
- SMEMBERS key
返回 key 指定集合中的所有的元素,当指定集合不存在时返回empty list or set
- SMOVE source destination member
将 member 从 source 移动到 destination 集合
- SPOP key
从 key 指定的集合中随机移除一个元素并返回。当指定的集合不存在时,返回 nil
* SRANDMEMBER key [count] 随机返回 **key** 指定的集合中的一个或多个元素,当集合不存在时返回 **nil**,当指定的 **count** 大于集合的长度时,返回集合中的所有的元素。
* SREM key member1 [memeber2] 移除集合中的一个或多个元素
* SSCAN KEY cursor [MATCH pattern] [COUNT count] 迭代返回集合中的元素
### 有序集合 有序集合与集合相同都是字符串类型的集合,也不允许出现重复的元素,不同的是,其中的每个元素都有一个与之相关联的 **double** 类型的分数,**Redis** 便是根据这个分数对集合内部的元素进行的排序的。在一个有序集合中,不可以存在相同的项,但可以存在相同的分数。同普通集合相同,有序集合内部也是通过哈希表实现的,因此,其插入、查找、删除的时间复杂度同样都为 **O(1)**。集合中的元素个数最大为 `2^32 -1` 个。
有序集合的操作
插入操作
- ZADD key [NX |XX] [CH] [INCR] socore member [sorce2 member]
向一个有序集合中添加一个项,或更新现有项的分数。
计数操作
- ZCARD key
获取有序集合中的项数
- ZCOUNT key min max
获取 key 指定的有序集合中,分数介于min 和 max 之间的项数。默认是包含两端的,如果不包含两端的 min 和 max,如果要不包括两端的值,可以写作ZCOUNT key (min (max
。
当指定集合不存在时返回0。
- ZLEXCOUNT key min max
获取 key 指定的有序集合中,项的值(基于ASCLL码值进行比较)介于 min 和 max 之间的项数,同 ZCOUNT 其默认也是包含两端的。可以为 min 和 max 分别指定 - 和 + ,代表集合中的最小项和最大项。
索引操作
- ZRANK key member
返回指定项 member 在指定集合中的索引值。当该项在指定集合中不存在时返回 nil。当指定集合不存在时返回 nil
- ZREVRANK key member
作用同 ZRANK ,不同的是该命令获取的索引值是集合中元素按照分数从高到底排列时的索引值。
- ZRANGE key start stop [WITHSCORES]
返回指定集合中索引值介于 start 和 stop (含两端)之间的元素,返回的元素按照分数从低到高排列。 可选参数 WITHSCORES 表示是否在返回结果中包含对应项的 分数。其中的下标可以为负值。若需要返回结果的分数从大到小降序排列,请使用 ZREVRANGE
- ZREVRANK key start stop [WITHSCORES]
作用同 ZRANK,不同的是其返回元素集合中元素是按照分数从高到底降序排列的。
取值和移除操作
- ZRANGEBYLEX key min max [limit offset count]
通过字典区间返回有序集合的的成员。返回的集合,整体按照分数从低到高排列,每一组分数相同的部分,按照字典集合进行排序,如现有集合 zset,其中有成员:zadd zset 0 a 0 b 0 c 1 e 1 f 1 g 0 h
,则调用 ZRANGEBYLEX zset [a [z,返回结果如下示:
- ZRANGEBYSCORE key min max [withscores] [limit offset count]
获取分数介于 min 和 max 之间的元素,可设置是否包含两端。可选参数 withscores 表示在返回结果集中是否包含对应项的分数,可选参数 limit 表示返回数据集的偏移量和返回元素的个数。返回结果集按照分数从低到高排列。
- ZREVRANGEBYSCORE key max min [WITHSCORES]
作用同 ZRANGEBYSCORE 不同的是其返回结果集的分数排列是从高到低的。 - ZREM key member1 [member2]
从 key 指定的集合中移除指定项,返回移除元素的个数,当指定 member 不存在与指定集合时则忽略。返回0.
- ZREMRANGEBYSCORE key min max
移除指定集合中 分数介于 **min ** 和 max 之间的元素,默认情况下是包含两端的,可以使用(
来排除两端,当指定集合不存在时,返回0,其它情况返回删除的元素个数。
其它
- ZSCORE key member
从 key 指定的集合中获取 memeber 的分数,当 member 不属于指定集合时,返回 nil
- ZINCRBY key increment member
在 key 指定的集合的 member 的分数上增加分量 increment。当 member 不存在与指定的集合时,便会将其添加到指定集合,其对应分数值为 increment。
- ZINTERSTORE destion keysnum key [ key2]
计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中。其中参数 destion 指定结果集存储的集合,keysnum 表示要求交集的集合的个数。当该参数的值与指定的集合个数不一致时,发生错误。返回的交集结果集中,每个项的分数为原集合中对应项的分数之和。返回结果集合中元素的个数。
- ZSCAN key cursor [MATCH pattern] [COUNT count]
用于迭代有序集合中的元素(包括分数)
- ZUNIONSTORE destination numkeys key [key2]
计算一个或多个有序集合的交集,并将返回的结果集存储到 destination 中。当指定的集合中包含相同的元素但分数不同时,默认情况下会计算两个元素的分数之和来作为返回集合对应元素的分数的那个,但可以指定一个可选参数 Aggregate 来更改这一默认处理,该参数具有三个值:SUM | MAX | MIN
。该命令还有一个可选参数:WEIGHTS,该参数表示给定的有序集合在传递给聚合函数之前,集合中成员的分数都会乘上这个因子,该值默认为1。