Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
注:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。
1、String类型
1.1基本介绍
string 类型是二进制安全的,即redis 的 string 可以包含任何数据,比如jpg图片或者序列化的对象。而且键的值有最大值限制,一个键最大能存储512MB。
1.2 常见命令
赋值:set key value
取值:get key
127.0.0.1:6379> set test zhangsan
OK
127.0.0.1:6379> get test
"zhangsan"
2、Hash类型
2.1 基本介绍
Hash类型也叫散列类型,它提供了字段和字段值的映射。hash 特别适合用于存储对象,字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。每个 hash 可以存储 232 -1 键值对(40多亿)。
结构如下图:
2.2 常见命令
赋值:
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
- 一次只能设置一个字段值
语法:HSET key field value
127.0.0.1:6379> hset user username zhangsan
(integer) 1
- 一次可以设置多个字段值
语法:HMSET key field value [field value …]
127.0.0.1:6379> hmset user age 20 username lisi
OK
- 当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作
语法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作
(integer) 0
取值:
- 一次只能获取一个字段值
语法:HGET key field
127.0.0.1:6379> hget user username
"zhangsan“
- 一次可以获取多个字段值
语法:HMGET key field [field …]
127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"
- 获取所有字段值
语法:HGETALL key
127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"
3、List类型
3.1 基本介绍
Redis的列表类型(list)是简单的字符串列表,可以存储一个有序的字符串列表。按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。
3.2 常见命令
向列表两端增加元素:
- 向列表左边增加元素
语法:LPUSH key value [value …]
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
- 向列表右边增加元素
语法:RPUSH key value [value …]
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3
查看列表:
- 语法:LRANGE key start stop
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
4、Set类型
4.1 基本介绍
Redis的Set是string类型的无序集合,其中的数据是不重复且没有顺序。集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
集合类型和列表类型的对比:
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)。
Redis还提供了多个集合之间的交集、并集、差集的运算。
4.2 常见命令
增加/删除元素:
- 语法:SADD key member [member …]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
由于对键set添加了两次a,因为集合的唯一性,所以第二次添加a被忽略。
- 语法:SREM key member [member …] (移除集合中一个或多个成员)
127.0.0.1:6379> srem set c d
(integer) 1
5、Zset类型
5.1 基本介绍
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
在某些方面有序集合和列表类型有些相似。
1、二者都是有序的。
2、二者都可以获得某一范围的元素。
但是,二者有着很大区别:
1、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
2、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
4、有序集合要比列表类型更耗内存。
5.2 常见命令
增加元素:
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
- 语法:ZADD key score member [score member …]
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
获得排名在某个范围的元素列表:
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
- 语法:ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange scoreboard 0 2
1) "zhangsan"
2) "wangwu"
3) "lisi“
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
- 语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange scoreboard 0 2
1) " lisi "
2) "wangwu"
3) " zhangsan “
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"