阅读完需:约 9 分钟
redis 中的数据都是以 key/value 的形式存储的,五大数据类型主要是指 value 的数据类型
String
List
Hash
Set
Zset
1.String
String 是 Redis 里边最最简单的一种数据结构。在 Redis 中,所有的 key 都是字符串,但是,不同的 key 对应的 value 则具备不同的数据结构,我们所说的五种不同的数据类型,主要是指 value 的数据类型不同。
Redis 中的字符串是动态字符串,内部是可以修改的,像 Java 中的 StringBuffer,它采用分配冗余空间的方式来减少内存的频繁分配。在 Redis 内部结构中,一般实际分配的内存会大于需要的内存,当字符 串小于 1M 的时候,扩容都是在现有的空间基础上加倍,扩容每次扩 1M 空间,最大 512M。
String命令:
-
set
set 就是给一个 key 赋值的。 -
append
使用 append 命令时,如果 key 已经存在,则直接在对应的 value 后追加值,否则就创建新的键值对。 -
decr
可以实现对 value 的减 1 操作(前提是 value 是一个数字),如果 value 不是数字,会报错,如果 value 不存在,则会给一个默认的值为 0,在默认值的基础上减一。 - decrby
和 decr 类似,但是可以自己设置步长,该命令第二个参数就是步长。 -
get
get 用来获取一个 key 的 value。
-
getrange
getrange 可以用来返回 key 对应的 value 的子串,这有点类似于 Java 里边的 substring。这个命令第 二个和第三个参数就是截取的起始和终止位置,其中,-1 表示最后一个字符串,-2 表示倒数第二个字符 串,以此类推… -
getset
获取并更新某一个 key。 -
incr
给某一个 key 的 value 自增。 -
incrby
给某一个 key 的 value 自增,同时还可以设置步长。 -
incrbyfloat
和 incrby 类似,但是自增的步长可以设置为浮点数。 -
mget 和 mset
批量获取和批量存储 -
ttl
查看 key 的有效期 -
setex
在给 key 设置 value 的同时,还设置过期时间。 -
psetex
和 setex 类似,只不过这里的时间单位是毫秒 -
setnx
默认情况下, set 命令会覆盖已经存在的 key,setnx 则不会。 -
msetnx
批量设置。 -
setrange
覆盖一个已经存在的 key 的value -
strlen
查看字符串长度
BIT 命令:
在 Redis 中,字符串都是以二进制的方式来存储的。例如 set k1 a,a 对应的 ASCII 码是 97,97 转为 二进制是 01100001,BIT 相关的命令就是对二进制进行操作的。
-
getbit
key 对应的 value 在 offset 处的 bit 值。 -
setbit
修改 key 对应的 value 在 offset 处的 bit 值 -
bitcount
统计二进制数据中 1 的个数。
2.List
LIST 是一个简单的字符串列表,按照插入顺序进行排序,我们可以从 LIST 的头部 (LEFT) 或者尾部 (RIGHT) 插入一个元素,也可以从 LIST 的头部(LEFT)或者尾部 (RIGHT) 弹出一个元素。
-
lpush
lpush 表示将 value 的值从左到右依次插入表头位置。 -
lrange
返回列表指定区间内的元素。 -
rpush
这个和 lpush 功能基本类似,不同的是 rpush 是从右往左依次插入表头位置。 -
rpop
移除并返回列表的尾元素。 -
lpop
移除并返回列表的头元素。 -
lindex
返回列表中,下标为 index 的元素。 -
ltrim
ltrim 可以对一个列表进行修剪。 -
blpop
阻塞式的弹出,相当于 lpop 的阻塞版。
3.Set
SET 是 String类型的无序集合,不同于 LIST ,SET 中的元素不可以重复。
-
sadd
添加元素到一个 key 中 -
smembers
获取一个 key 下的所有元素 -
srem
移除指定的元素 -
sismemeber
返回某一个成员是否在集合中 -
scard
返回集合的数量 -
srandmember
随机返回一个元素 -
spop
随机返回并且出栈一个元素。
-
smove
把一个元素从一个集合移到另一个集合中去。 -
sdiff
返回两个集合的差集。 -
sinter
返回两个集合的交集。 -
sdiffstore
这个类似于 sdiff ,不同的是,计算出来的结果会保存在一个新的集合中 -
sinterstore
类似于 sinter,只是将计算出来的交集保存到一个新的集合中。 -
sunion
求并集。 -
sunionstore
求并集并且将结果保存到新的集合中。
4.Hash
HASH 类似于 Java 中的 Map ,是一个键值对集合,在 redis 中可以用来存储对象。
在 hash 结构中,key 是一个字符串,value 则是一个 key/value 键值对。
-
hset
添加值。 -
hget
获取值 -
hmset
批量设置 -
hmget
批量获取 -
hdel
删除一个指定的 field -
hsetnx
默认情况下,如果 key 和 field 相同,会覆盖掉已有的 value,hsetnx 则不会。 -
hvals
获取所有的 value -
hkeys
获取所有的 key -
hgetall
同时获取所有的 key 和 value
-
hexists
返回 field 是否存在 -
hincrby
给指定的 value 自增 -
hincrbyfloat
可以自增一个浮点数 -
hlen
返回 某一个 key 中 value 的数量 -
hstrlen
返回某一个 key 中的某一个 field 的字符串长度
5.ZSet
ZSET 和 SET 一样,也是 STRING 类型的元素的集合,不同的是 ZSET 中的每个元素都会关联一个 double 类型的分数,ZSET 中的成员都是唯一的,但是所关联的分数可以重复。
-
zadd
将指定的元素添加到有序集合中。 -
zscore
返回 member 的 score 值 -
zrange
返回集合中的一组元素。 -
zrevrange
返回一组元素,但是是倒序。 -
zcard
返回元素个数 -
zcount
返回 score 在某一个区间内的元素。 zrangebyscore 按照 score 的范围返回元素。 -
zrank
返回元素的排名(从小到大 -
zrevrank
返回元素排名(从大到小 -
zincrby
score 自增 -
zinterstore
给两个集合求交集。
-
zrem
弹出一个元素 -
zlexcount
计算有序集合中成员数量 -
zrangebylex
返回指定区间内的成员。
key 相关的命令
由于五大数据类型的数据结构本身有差异,因此对应的命令也会不同,但是有一些命令不管对于哪种数据类型都是存在的,我们今天就先来看看这样一些特殊的命令。
DEL 命令
看到 OK 表示插入成功。通过 DEL 命令我们可以删除一个已经存在的 key,如下:
1 2 |
127.0.0.1:6379> DEL k1 (integer) 1 |
看到 (integer) 1 表示数据已经删除成功。
DUMP 命令
DUMP 命令可以序列化给定的 key,并返回序列化之后的值:
1 2 |
127.0.0.1:6379> DUMP k1 “\x00\x02v1\b\x00\xe6\xc8\\\xe1bI\xf3c” |
EXISTS 命令
EXISTS 命令用来检测一个给定的 key 是否存在,如下:
1 2 3 4 5 |
127.0.0.1:6379> EXISTS k1 (integer) 1 127.0.0.1:6379> EXISTS k2 (integer) 0 127.0.0.1:6379> |
上面的运行结果表示 k1 存在而 k2 不存在。
TTL 命令
TTL 命令可以查看一个给定 key 的有效时间:
1 2 3 4 |
127.0.0.1:6379> TTL k1 (integer) -1 127.0.0.1:6379> TTL k2 (integer) -2 |
-2 表示 key 不存在或者已过期;-1 表示 key 存在并且没有设置过期时间(永久有效)。当然,我们可以通过下面的命令给 key 设置一个过期时间:
EXPIRE 命令
EXPIRE 命令可以给 key 设置有效期,在有效期过后,key 会被销毁。
1 2 3 4 5 |
127.0.0.1:6379> EXPIRE k1 30 (integer) 1 127.0.0.1:6379> TTL k1 (integer) 25 127.0.0.1:6379> |
30 表示 30 秒,TTL k1 返回 25 表示这个 key 的有效期还剩 25 秒。
PERSIST 命令
PERSIST 命令表示移除一个 key 的过期时间,这样该 key 就永远不会过期:
1 2 3 4 5 6 7 8 |
127.0.0.1:6379> EXPIRE k1 60 (integer) 1 127.0.0.1:6379> ttl k1 (integer) 57 127.0.0.1:6379> PERSIST k1 (integer) 1 127.0.0.1:6379> ttl k1 (integer) -1 |
PEXPIRE 命令
PEXPIRE 命令的功能和 EXPIRE 命令的功能基本一致,只不过这里设置的参数是毫秒:
1 2 |
127.0.0.1:6379> PEXPIRE k1 60000 (integer) 1 |
PTTL 命令
PTTL 命令和 TTL 命令基本一致,只不过 PTTL 返回的是毫秒数:
1 2 |
127.0.0.1:6379> PTTL k1 (integer) 25421 |
KEYS 命令
KEYS 命令可以获取满足给定模式的所有 key,比如:
1 2 3 4 |
127.0.0.1:6379> KEYS * 1) “k3” 2) “k2” 3) “k1” |
KEYS *
表示获取所有的 KEY, *
也可以是一个正则表达式。
补充
- 四种数据类型(list/set/zset/hash),在第一次使用时,如果容器不存在,就自动创建一个
- 四种数据类型(list/set/zset/hash),如果里边没有元素了,那么立即删除容器,释放内存。
更多的命令参考官方文档: