本文地址:https://www.jianshu.com/p/9942f1d65adc
一、简介
在Redis
之中,使用的是key-value
来存储数据,但实际上,Redis并不是一个简单的键值对存储数据库。在key-value
中的value
,不仅仅可以存储字符串,还可以支持多种数据结构,这使得Redis中的键值对,其所扮演的角色其实与关系型数据库中的表类似。
Redis中主要支持五种常见数据类型:
-
String
- 二进制安全的字符串类型,可以存储文本,图片等信息。 -
List
- 基本上是一个存储字符串元素的双向链表。 -
Hash
- 哈希类型,是由键值对组成的集合。里面存储的键值对的key
和value
都是字符串类型。 -
Set
- 元素唯一且无序的集合类型。 -
Sorted Set
- 一个有序的集合,顺序由插入时的浮点数分数决定。
二、Key
Redis存储的键值对中的key
,是二进制安全的,也就是说你既可以使用普通的字符串来做key
,也可以使用二进制的数据,例如图片,甚至空字符也是有效的。
但是依然有几条规则需要遵守:
- 同一个数据库中的key不可重名。
- key的最大值为512MB。
- key不应该过长。这不仅仅是因为内存上的考虑,当key过长时,查询等命令将会因为key过长而花费更多的时间在key的比较上。
- key同样不应该太短。key的命名同样需要考虑可读性,例如
"user:1000:followers"
就比"u1000flw"
好,需要在key命名的长度上找到一个平衡点。
在Redis中,基本上每种数据类型都有自己独特的命令,这部分命令是不能混着用的。但是也有一部分命令是每个类型的key都可以使用的。
命令:
命令 | 作用 |
---|---|
DEL key |
key存在时删除key |
EXISTS key |
检查key是否存在 |
TYPE key |
查看key的类型 |
RENAME key newkey |
将key重命名 |
RENAMENX key newkey |
只有当newkey不存在时,才进行重命名 |
KEYS pattern |
查找key |
RANDOMKEY |
从当前数据库随机获取一个key |
MOVE key db |
将这个key移动到指定的另一个数据库 |
DUMP key |
序列化key,并返回被序列化的值 |
EXPIRE key second |
以秒为单位给key设定过期时间 |
PEXPIRE key milliseconds |
以豪秒为单位给key设定过期时间 |
EXPIREAT key timestamp |
把一个时间戳设置为key的过期时间 |
PEXPIREAT key mill-timestamp |
把一个毫秒级别的时间戳设置为key的过期时间 |
PERSIST key |
移除key的过期时间 |
TTL key |
以秒为单位返回key的过期时间 |
PTTL key |
以豪秒为单位返回key的过期时间 |
三、String类型
字符串类型时Redis中最为基础的类型,且是二进制安全的,所以可以存储字符串、图片、数字等各种数据。
如果字符串中存储的为纯数字的话,还可以做一定的简单计算。
命令:
命令 | 作用 |
---|---|
SET key value |
给key设定或更新值 |
SETNX key value |
只有当key不存在时才给key设定值 |
SETEX key second value |
给key设定值,并且设定一个秒为单位的过期时间 |
PSETEX key milliseconds value |
给key设定值,并且设定一个豪秒为单位的过期时间 |
SETRANGE key offset value |
从offset开始,覆盖key的一部分 |
MSET key value [key value ...] |
同时设置多个键值对 |
MSETNX key value [key value ...] |
仅当列出的key都不存在时,同时设置多个键值对 |
GET key |
获取key的value |
MGET key1 [key2..] |
一次获取多个key的value |
GETSET key value |
给key设定一个新的value,获取旧的value并返回 |
GETRANGE key start end |
获取value中指定位置的内容 |
STRLEN key |
返回key中value的长度 |
APPEND key value |
将值添加到 |
INCR key |
将key存储的数字加1 |
INCRBY key increment |
将key存储的数字加上指定的数值 |
INCRBYFLOAT key increment |
将key存储的数字加上指定的浮点数数值 |
DECR key |
将key存储的数字减1 |
DECRBY key decrement |
将key存储的数字减去指定的数值 |
四、List类型
简单来说,Redis的List
基本上就是一个双向链表,可以分别在头部或者尾部添加删除数据,每一个List
类型的key最多可以存储4294967295个元素。
基于这样的特性,Redis中的List
常常被用来做消息队列之类的事情。
命令:
命令 | 作用 |
---|---|
LPUSH key value1 [value2] |
在List头部插入一个或多个值 |
RPUSH key value1 [value2] |
在List尾部插入一个或多个值 |
LPUSHX key value |
在List头部插入一个或多个值,key不存在则报错 |
RPUSHX key value |
在List尾部插入一个或多个值,key不存在则报错 |
LPOP key |
移除并返回List头部第一个元素 |
RPOP key |
移除并返回List尾部最后一个元素 |
RPOPLPUSH source destination |
移除列表尾部最后一个元素,添加到另一个列表头部 |
LINDEX key index |
根据列表索引查看元素的值 |
LLEN key |
查看List的长度 |
LRANGE key start stop |
查看一定索引范围内的元素 |
LREM key count value |
删除等于value的元素,如果count为0,则删除所有相等元素 |
LINSERT key BEFORE|AFTER pivot value |
将value插入到列表中,位于pivot之前或之后 |
LSET key index value |
根据index指定修改元素 |
LTRIM key start stop |
切片裁剪List |
BLPOP key1 [key2 ] timeout |
移除并返回列表头部第一个元素,如果没有元素则阻塞列表直到有元素为止 |
BRPOP key1 [key2 ] timeout |
移除并返回列表尾部最后一个元素,如果没有元素则阻塞列表直到有元素为止 |
BRPOPLPUSH source destination timeout |
移除列表尾部最后一个元素,添加到另一个列表头部,如果没有元素则阻塞列表直到有元素为止 |
五、Hash类型
Redis的Hash
类型则跟人们所期望的传统'hash'
类型基本相同,是一个由field-value
键值对组成的集合。其中field
和value
都是字符串类型。
众所周知,hash
类型都非常适合用于保存对象。而且值得注意的是,大小较小的hash
(元素较少、值比较短)以特殊的方式存储在内存中,使得其读写效率非常之高。
命令:
命令 | 作用 |
---|---|
HSET key field value |
添加或修改一个字段的值 |
HMSET key field1 value1 [field2 value2 ] |
同时添加或修改一个或多个字段的值 |
HSETNX key field value |
只有当字段不存在时,才添加一个字段的值 |
HLEN key |
获取所有字段的数量 |
HSTRLEN key field |
c查看key中指定字段的value的长度 |
HEXISTS key field |
查看字段是否存在 |
HDEL key field1 [field2] |
删除一个或多个字段 |
HGET key field |
获取某一个字段的值 |
HMGET key field1 [field2] |
获取一个或多个字段的值 |
HKEYS key |
获取一个key中所有的field |
HVALS key |
获取一个key中所有的value |
HGETALL key |
获取一个key中所有field和value |
HINCRBY key field increment |
给指定字段的value加上指定的increment数值 |
HINCRBYFLOAT key field increment |
给指定字段的value加上指定的increment浮点数数值 |
六、Set类型
Set
类型是由字符串类型元素构成的无序集合,其元素必须是唯一的。由于Redis中的集合类型都是通过HASH表实现的,所以其添加、查找、删除的复杂度都是O(1)。
Redis中还给集合类型提供了求交集、并集、差集等操作。
命令:
命令 | 作用 |
---|---|
SADD key member1 [member2] |
给集合添加一个或多个元素 |
SCARD key |
返回集合的成员数量 |
SISMEMBER key member |
判断元素是否是集合的成员 |
SMEMBERS key |
返回集合中所有的成员 |
SRANDMEMBER key [count] |
随机返回集合中一个或多个元素 |
SREM key member1 [member2] |
移除集合中的一个或多个元素 |
SPOP key |
随机移除并返回集合中的一个元素 |
SMOVE source destination member |
将一个元素member从source集合移动到destination集合 |
SDIFF key1 [key2] |
返回给定的所有集合的差集 |
SDIFFSTORE destination key1 [key2] |
返回给定的所有集合的差集,并存储到destination集合中 |
SINTER key1 [key2] |
返回给定的所有集合的交集 |
SINTERSTORE destination key1 [key2] |
返回给定的所有集合的交集,并存储到destination集合中 |
SUNION key1 [key2] |
返回给定的所有集合的并集 |
SUNIONSTORE destination key1 [key2] |
返回给定的所有集合的并集,并存储到destination集合中 |
七、Sorted Set类型
在Redis中,Sorted Set
比较像是一个混合了Set
和Hash
两种类型特点的数据类型。首先,在Sorted Set
中,存储的元素是唯一不可重复的字符串类型,所以说其在某种意义上是一种集合。
但是Set
中的元素是无序的,而Sorted Set
中的每个元素都与一个浮点数相关联,这个浮点数被称为Score(分数)
,通过这个分数,Sorted Set
实现了有序排列。这是其与Hash
类型类似的地方,每一个元素都映射着一个Score
。
Sorted Set
中的顺序主要由两个规则决定:
- 首先,一般情况下由
Score
决定顺序。 - 如果出现有两个或者两个以上元素的
Score
相同,这个时候由元素字符串的字典顺序决定先后。
命令:
命令 | 作用 |
---|---|
ZADD key score1 member1 [score2 member2] |
添加或更新一个或多个元素及其分数 |
ZCARD key |
获取集合中元素的数量 |
ZCOUNT key min max |
获取指定分数范围内元素的数量 |
ZSCORE key member |
获取某个元素的分数 |
ZRANK key member |
获取某个元素的排名 |
ZLEXCOUNT key min max |
获取指定区间内元素的数量 |
ZRANGE key start stop [WITHSCORES] |
返回指定排名区间内的元素 |
ZRANGEBYLEX key min max [LIMIT offset count] |
返回指定区间内的元素 |
ZRANGEBYSCORE key min max [WITHSCORES][LIMIT] |
返回指定分数区间内的元素 |
ZINCRBY key increment member |
给指定元素的分数加上increment数值 |
ZREM key member [member ...] |
移除一个或多个元素 |
ZREMRANGEBYRANK key start stop |
移除排名区间内的元素 |
ZREMRANGEBYSCORE key min max |
移除分数区间内的元素 |
网友评论