Redis 的五种基本数据类型
一、String 类型
1.1 介绍
String 类型,也就是字符串类型,是 Redis 中最简单的存储类型。其 value 是字符串,不过根据字符串的格式不同,又可以分为 3 类:
- string:普通字符串
- int:整数类型,可以做自增、自减操作
- float:浮点类型,可以做自增、自减操作
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过 512M。
key | value |
---|---|
msg | hello world |
num | 10 |
score | 92.5 |
1.2 String 类型的常见命令
String 的常见命令有:
- SET:添加或者修改已经存在的一个 String 类型的键值对
- GET:根据 key 获取 String 类型的 value
- MSET:批量添加多个 String 类型的键值对
- MGET:根据多个 key 获取多个 String 类型的 value
- INCR:让一个整型的 key 自增 1
- INCRBY:让一个整型的 key 自增并指定步长,例如:incrby num 2 让 num 值自增 2
- INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- SETNX:添加一个 String 类型的键值对,前提是这个 key 不存在,否则不执行
- SETEX:添加一个 String 类型的键值对,并且指定有效期
1.2.1 APPEND 命令
使用 APPEND 命令时,如果 key 已经存在,则会直接在 value 后追加值,如果 key 不存在,则会先创建一个 value 为空字符串的 key,然后再追加:
1.2.2 DECR 命令
DECR 命令可以实现对 value 的减 1 操作,如果 key 不存在,则 key 对应的初始值会被置为 0,如果 key 的value 不为数字,则会报错,如下:
1.2.3 DECRBY 命令
DECRBY 和 DECR 类似,不同的是 DECRBY 可以指定步长,如下:
1.2.4 GET 命令
GET 命令用来获取对应 key 的 value,如果 key 不存在则返回 nil,如下:
1.2.5 GETRANGE 命令
GETRANGE 用来返回 key 所对应的 value 的子串,子串由 start 和 end 决定,从左往右计算,如果下标是负数,其中 -1 表示最后一个字符,-2 表示倒数第二个…,如下:
1.2.6 GETSET
GETSET 命令可以用来获取 key 所对应的 value,并对 key 进行重置,如下:
1.2.7 INCR 命令
INCR 操作可以对指定的 key 的 value 执行加 1 操作,如果 指定的 key 不存在,那么在加 1 操作之前,会先将 key 的 value 设置为 0,如果 key 的 value 不是数字,则会报错,如下:
1.2.8 INCRBY 命令
INCRBY 和 INCR 功能类似,不同的是 INCRBY 可以指定增长的步长,如下:
1.2.9 INCRBYFLOAT 命令
INCRBYFLOAT 命令可以用来增长浮点数,如下:
1.2.10 MGET 与 MSET 命令
1.2.11 SETEX 命令
SETEX 用来给 key 设置 value,同时设置过期时间,等效于先给 key 设置 value,再给 key 设置过期时间,如下:
1.2.12 PSETEX 命令
PSETEX 的作用和 SETEX 类似,不同的是,这里设置过期时间的单位是毫秒,如下:
1.2.13 SETNX 命令
SETNX 是 SET if Not eXists 的简写,SET 命令在执行时,如果 key 已经存在,则新值会覆盖掉旧值,而对于 SETNX 命令,如果 key 已经存在,则不做任何操作,如果 key 不存在,则效果等同于 SET 命令。如下:
1.2.14 MSETNX 命令
MSETNX 兼具了 SETNX 和 MSET 的特性,但是 MSETNX 在执行时,如果有一个 key 存在,则所有的都不会执行,如下:
因为 k1 已经存在,所以 k2 也没执行成功。
1.2.15 SETRANGE 命令
SETRANGE 用来覆盖一个已经存在的 key 的 value,如下:
但是如果已经存在的 key 的 value 长度小于 offset,则不足的地方用 0 补齐,如下:
1.2.15 STRLEN 命令
STRLEN 用来计算 key 的 value 的长度,如下:
二、Hash 类型
2.1 Hash 类型介绍
Hash 类型,也叫散列,其 value 是一个无序字典,类似于 Java 中的 HashMap 结构。
在存储 Java 对象时,String 结构是将对象序列化为 JSON 字符串后存储,当需要修改对象某个字段时很不方便。
KEY | VALUE |
---|---|
user:1 | {name:“Jack”,age:21} |
user:2 | {name:“Rose”,age:18} |
Hash 结构可以将对象中的每个字段独立存储,可以针对单个字段做 CRUD。
KEY | VALUE | |
---|---|---|
FIELD | VALUE | |
user:1 | name | Jack |
age | 21 | |
user:2 | name | Rose |
age | 18 |
2.2 Hash 类型的常见命令
Hash 的常见命令有:
- HSET key field value:添加或者修改 hash 类型 key 的 field 的值
- HGET key field:获取一个 hash 类型 key 的 field 的值
- HMSET:批量添加多个 hash 类型 key 的 field 的值
- HMGET:批量获取多个 hash 类型 key 的 field 的值
- HGETALL:获取一个 hash 类型的 key 中的所有的 field 和 value
- HKEYS:获取一个 hash 类型的 key 中的所有的 field
- HVALS:获取一个 hash 类型的 key 中的所有的 value
- HINCRBY:让一个 hash 类型的 key 的字段值自增并指定步长
- HSETNX:添加一个 hash 类型的 key 的 field 值,前提是这个 field 不存在,否则不执行
2.2.1 HSET 命令
HSET 命令可以用来设置 key 指定的哈希集中指定字段的值,如下:
2.2.2 HGET 命令
HGET 命令可以用来返回 key 指定的哈希集中该字段所关联的值,如下:
2.2.3 HMSET 命令
HMSET 命令可以批量设置 key 指定的哈希集中指定字段的值,如下:
2.2.4 HMGET 命令
HMGET 命令可以批量返回 key 指定的哈希集中指定字段的值,如下:
2.2.5 HDEL 命令
HDEL 命令可以从 key 指定的哈希集中移除指定的域,在哈希集中不存在的域将被忽略,如下:
2.2.6 HSETNX 命令
HSETNX 命令只在 key 指定的哈希集中不存在指定的字段时,设置字段的值,如果字段已经存在,该操作无效果,如下:
2.2.7 HVALS 命令
HVALS 命令可以返回 key 指定的哈希集中所有字段的值,如下:
2.2.8 HKEYS 命令
HKEYS 命令可以返回 key 指定的哈希集中所有字段的名字,如下:
2.2.9 HGETALL 命令
HGETALL 命令可以返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍,如下:
2.2.10 HEXISTS 命令
HEXISTS 命令可以返回 hash 里面 field 是否存在,如下:
2.2.11 HINCRBY 命令
HINCRBY 可以增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0,HINCRBY 支持的值的范围限定在 64 为有符号整数,如下:
2.2.12 HINCRBYFLOAT 命令
HINCRBYFLOAT 和 HINCRBY 用法基本一致,只不过这里允许 float 类型的数据。
2.2.13 HLEN 命令
HLEN 返回 key 指定的哈希集包含的字段的数量,如下:
2.2.14 HSTRLEN 命令
HSTRLEN 可以返回 hash 指定 field 的 value 的字符串长度,如果 hash 或者 field 不存在,返回 0,如下:
三、List 类型
3.1 List 类型介绍
Redis 中的 List 类型与 Java 中的 LinkedList 类似,可以看做是一个双向链表结构,既可以支持正向检索,也可以支持反向检索。
特征也与 LinkedList 类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
3.2 List 类型的常见命令
List 的常见命令有:
- LPUSH key element … :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回 nil
- RPUSH key element … :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key start end:返回一段角标范围内的所有元素
- BLPOP 和 BRPOP:与 LPOP 和 RPOP 类似,只不过在没有元素时等待指定时间,而不是直接返回 nil
3.2.1 LPUSH 命令
将一个或多个值 value 插入到列表 key 的表头,如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头,如下:
3.2.2 LRANGE 命令
返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定,下标(index)参数 start 和 stop 都以 0 为底,即 0 表示列表中的第一个元素,1 表示列表的第二个元素,以此类推。我们也可以使用负数下标,以 -1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推。如下:
3.2.3 RPUSH 命令
RPUSH 和 LPUSH 的功能基本一致,不同的是 RPUSH 中的 value 值是按照从右到左的顺序依次插入,如下:
3.2.4 RPOP 命令
RPOP 命令可以移除并返回列表右侧的第一个元素。如下:
3.2.5 LPOP 命令
LPOP 和 RPOP 类似,不同的是 LPOP 移除并返回的是列表左侧的第一个元素。如下:
3.2.6 LINDEX 命令
LINDEX 命令可以返回列表 key 中,下标为 index 的元素,正数下标 0 表示第一个元素,也可以使用负数下标,-1 表示倒数第一个元素,如下:
3.2.7 LTRIM 命令
LTRIM 命令可以对一个列表进行修剪,即让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。下标与之前介绍的写法都一致,如下:
3.2.8 BLPOP 命令
BLPOP 是阻塞式列表的弹出原语。它是命令 LPOP 的阻塞版本,当给定列表内没有任何元素可弹出的时候,连接将被 BLPOP 命令阻塞。当给定多个 key 参数时,按照参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。同时,在使用该命令时也需要指定阻塞的时长,时长单位为秒,在该时长内如果没有元素可供弹出,则阻塞结束。返回的结果时 key 和 value 的组合,如下:
BRPOP、BPOPLPUSH、BRPOPLPUSH 都是相应命令的阻塞版本,这里不再赘述。
3.3 思考
-
如何利用 List 结构模拟一个栈?
入口和出口在同一边。 -
如何利用 List 结构模拟一个队列?
入口和出口在不同边。 -
如何利用 List 结构模拟一个阻塞队列?
入口和出口在不同边,出队时采用 BLPOP 或 BRPOP。
四、Set 类型
4.1 介绍
Redis 的 Set 结构与 Java 中的 HashSet 类似,可以看做是一个 value 为 null 的 HashMap。因为也是一个 hash 表,因此具备与 HashSet 类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
4.2 Set 类型的常见命令
Set 常见命令:
- SADD key member … :向 set 中添加一个或多个元素
- SREM key member … :移除 set 中的指定元素
- SCARD key … :返回 set 中元素的个数
- SISMEMBER key member:判断一个元素是否存在于 set 中
- SMEMBERS:获取 set 中的所有元素
- SINTER key1 key2 … :求 key1 与 key2 的交集
- SDIFF key1 key2 … :求 key1 与 key2 的差集
- SUNION key1 key2 … :求 key1 与 key2 的并集
4.2.1 SADD 命令
SADD 命令可以添加一个或多个指定的 member 元素到集合的 key 中,指定的一个或多个 member 元素 如果已经在集合 key 中存在,则忽略,如果集合 key 不存在,则新建集合 key,并添加 member 元素到集合 key 中。如下:
4.2.2 SREM 命令
SREM 命令可以在 key 集合中移除指定的元素,如果指定的元素不是 key 集合中的元素,则忽略。如果 key 集合不存在则视为一个空的集合,该命令返回 0。如下:
4.2.3 SISMEMBER 命令
SISMEMBER 命令可以返回成员 member 是否是存储的集合 key 的成员。如下:
4.2.4 SCARD 命令
SCARD 命令可以返回集合存储的 key 的基数(集合元素的数量),如下:
4.2.5 SMEMBERS 命令
SMEMBERS 命令可以返回 key 集合所有的元素,如下:
4.2.6 SRANDMEMBER 命令
SRANDMEMBER 仅需我们提供 key 参数,它就会随机返回 key 集合中的一个元素,从 Redis2.6 开始,该命令也可以接受一个可选的 count 参数,如果 count 是整数且小于元素的个数,则返回 count 个随机元素,如果 count 是整数且大于集合中元素的个数时,则返回集合中的所有元素,如果 count 是负数,则会返回一个包含 count 的绝对值的个数元素的数组,如果 count 的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况。如下:
4.2.7 SPOP 命令
SPOP 命令的用法和 SRANDMEMBER 类似,不同的是,SPOP 每次选择一个随机的元素之后,该元素会出栈,而 SRANDMEMBER 则不会出栈,只是将该元素展示出来。
4.2.8 SMOVE 命令
SMOVE 命令可以将 member 从 source 集合移动到 destination 集合中,如下:
4.2.9 SDIFF 命令
SDIFF 可以用来返回一个集合与给定集合的差集的元素,如下:
4.2.10 SDIFFSTORE 命令
SDIFFSTORE命令与 SDIFF 命令基本一致,不同的是 SDIFFSTORE 命令会将结果保存在一个集合中,如下:
4.2.11 SINTER 命令
SINTER 命令可以用来计算指定 key 之间元素的交集,如下:
4.2.12 SINTERSOTRE 命令
SINTERSOTRE 命令和 SINTER 命令类似,不同的是它会将结果保存到一个新的集合中,如下:
4.2.13 SUNION 命令
SUINON 可以用来计算两个集合的并集,如下:
4.2.14 SUNIONSTORE 命令
SUNIONSTORE 命令和 SUNION 命令类似,不同的是它会将结果保存到一个新的集合中,如下:
五、SortedSet 类型
5.1 介绍
Redis 的 SortedSet 是一个可排序的 set 集合,与 Java 中的 TreeSet 有些类似,但底层数据结构却差别很大。SortedSet 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash 表。
SortedSet 具备下列特性:
- 可排序
- 元素不重复
- 查询速度快
因为 SortedSet 的可排序特性,经常被用来实现排行榜这样的功能。
5.2 SortedSet 类型的常见命令
SortedSet 类型的常见命令有:
- ZADD key score member:添加一个或多个元素到 SortedSet,如果已经存在则更新其 score 值
- ZREM key member:删除 SortedSet 中的一个指定元素
- ZSCORE key member:获取 SortedSet 中的指定元素的 score 值
- ZRANK key member:获取 SortedSet 中的指定元素的排名
- ZCARD key:获取 SortedSet 中的元素个数
- ZCOUNT key min max:统计 score 值在给定范围内的所有元素的个数
- ZINCRBY key increment member:让 SortedSet 中的指定元素自增,步长为指定的 increment 值
- ZRANGE key min max:按照 score 排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max:按照 score 排序后,获取指定 score 范围内的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注:所有的排名默认都是升序,如果要降序则在命令的 Z 后面添加 REV 即可。
5.2.1 ZADD 命令
ZADD 命令可以将所有指定成员添加到键为 key 的有序集合里面,添加时可以指定多个分数/成员(score/memeber)对。如果指定添加的成员已经是有序集合里面的成员,则会更新该成员的分数(score)并更新到正确的排序位置。如下:
5.2.2 ZSCORE 命令
ZSCORE 命令可以返回有序集 key 中,成员 member 的 score 值。如下:
5.2.3 ZRANGE 命令
ZRANGE 命令可以根据 index 返回 member,该命令在执行时加上 withscores 参数可以连同 score 一起返回:
5.2.4 ZREVRANGE 命令
ZREVRANGE 和 ZRANGE 功能基本一致,不同的是 ZREVRANGE 是降序,如下:
5.2.5 ZCARD 命令
ZCARD 命令可以返回 key 的有序集元素个数,如下:
5.2.6 ZCOUNT 命令
ZCOUNT 命令可以返回有序集 key 中,score 值在 min 和 max 之间(默认包括值等于 min 或 max)的成员,如下:
如果在统计时,不需要包含 66 或者 90,则添加一个 ( 即可,如下:
5.2.7 ZRANGEBYSCORE 命令
ZRANGEBYSCORE 命令可以按照 score 范围获取元素,加上 withscores 可以连同 score 一起返回。如下:
5.2.8 ZRNAK 命令
ZRANK 命令可以返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,即 score 值最小的成员排名为 0。如下:
5.2.9 ZREVRANK 命令
ZREVRANK 和 ZRANK 命令功能基本一致,不同的是,ZREVRANK 中的排序是从大到小:
5.2.10 ZINCRBY 命令
ZINCRBY 命令可以为有序集 key 的成员 member 的 score 值加上增量 increment。如果 key 中不存在 member,就在 key 中添加一个 member,score 是 increment(就好像它之前的 score 是 0.0)。如果 key 不存在,就创建一个只含有指定 member 成员的有序集合:
5.2.11 ZINTER 命令
ZINTER 命令可以计算给定的 numkeys 个有序集合的交集。在给定要计算的 key 和其他参数之前,必须先给定 key 个数(numberkeys)。如下:
5.2.12 ZINTERSTORE 命令
ZINTERSTORE 命令可以计算给定的 numkeys 个有序集合的交集,并且把结果放到 destination 中。在给定要计算的 key 和其他参数之前,必须先给定 key 个数(numberkeys)。该命令也可以在执行的过程中给原 score 乘以 weights 后再求和,如下:
5.2.13 ZREM 命令
ZREM 命令可以从集合中弹出一个元素,如下:
5.2.14 ZLEXCOUNT 命令
ZLEXCOUNT 命令用于计算有序集合中指定成员之间的成员数量。如下:
注意:可以用 - 和 + 表示得分最小值和最大值,如果使用成员名的话,一定要在成员名之前加上 [ 。
5.2.15 ZRANGEBYLEX 命令
ZRANGEBYLEX 返回指定成员区间内的成员,安城院字典正序排序,分数必须相同。如下:
注意:min 和 max 参数的写法和 ZLEZCOUNT 一致。
更多推荐
所有评论(0)