Redis 五种数据类型和 key 命令食用指南

Redis 的五种基本数据结构

Redis 有五种基本数据结构,分别是 String(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

目录

    • 1 ) Key 键常用命令
      • 是否存在(exists)
      • 移动 move
      • 定时 expire
      • 查看过期时间
      • 查看类型 type
      • 重命名键 rename
      • 删除 del
    • 2 )String 字符串
      • 设置
      • 批量设置(获取)键值对
      • 定时
      • set 扩展
      • 计数
      • 返回原值的
    • 3 )列表
      • 插入
      • 获取
      • 移除
    • 4 )hash 字典
      • 设置和获取
      • 存在
      • 长度
      • 删除
      • 其他
    • 5 )集合 set
      • 设置和获取
      • 长度
      • 移除
      • 数学集合类
    • 6 ) 有序列表 zset
      • 设置
      • 获取
      • 删除
      • 长度
    • 7 ) 命令总结
      • key 命令
      • string 命令
      • hash 命令
      • list 命令
      • set 命令
      • zset 命令

1 ) Key 键常用命令

是否存在(exists)

使用 EXISTS 命令判断是否存在

> keys *
"key1"
> exists key1
(integer) 1   # 存在
> exists key2
(integer) 0   # 不存在

移动 move

使用move 命令,将 key1 从数据库 1 移动到数据库 0 中,如下:

> select 1	# 切换到数据库 1
OK
> keys *	# 查询 key 都有哪些
"key1"
> move key1 0	# 移动到 0 数据库
(integer) 1
> select 0	# 切换到数据库 0
OK
> keys *	# 查询 key 都有哪些
"key1"

定时 expire

使用expire 命令,设置 key1 的过期时间为10秒。

> set key1 value1
ok
> get key
"value1"
> expire key1 5    # 5s 后过期
(integer) 1
 # 静等 5 秒
> get key1
(nil)

5 秒后通过 GET 查看 key1 发现已被删除,不存在了。

查看过期时间

通过 ttl 命令查看到 key1 过期还有 2 秒

> set key1 value1
ok
> get key
"value1"
> expire key1 5    # 5s 后过期
(integer) 1
 # 静等 3 秒
> ttl key1
(integer) 2
 # 静等 3 秒
> ttl key1
(integer) -2		# 过时

执行命令后的返回值中 -2 表示 key 不存在或者已过期;-1 表示 key 存在并且没有设置过期时间(永久有效)。

查看类型 type

使用type查看 key1 的类型

> set key1 value1
ok
> type key1
string

重命名键 rename

使用rename key1 newkey1将 key1 的键值改为newkey1

> rename key1 newkey1
OK
> get newkey1
"value1"

删除 del

使用del key1命令删除 key1

> set key1 value1
ok
> del key1
(integer) 1
> get key1
(nil)

2 )String 字符串

设置

> set key1 value1
ok

通常使用 SET 来设置字符串的值。

并且 Redis 中的字符串可以是二进制数据,这就相当于你可以保持一张 .png 图片,只是要注意,不要超过 512 MB 的限度就好了。

修改,当 key 存在时,SET 命令会覆盖你上一次设置的值。

> set key1 value2
ok
> get key1
"value2"

这里也就看到了,可以通过 GET 命令来获取你设置的值,当值不存在的时候,会显示 nil

> get key2
(nil)

另外你还可以使用 EXISTSDEL 关键字来查询是否存在和删除键值对:

> exists key1
(integer) 1
> del key1
(integer) 1
> get key1
(nil)

批量设置(获取)键值对

> set key1 value1
OK
> set key2 value2
OK
> mget key1 key2 key3    # 批量获取值
1) "value1"
2) "value2"
3) (nil)
> mset key1 value1 key2 value2 # 批量设置键
> mget key1 key2
1) "value1"
2) "value2"

可以通过 MSETMGET 命令设置或获取键值对。

定时

可以对 key 设置过期时间,到时间会被自动删除,这个功能常用来控制缓存的失效时间。(过期可以是任意的数据类型,不只是 String 类型)

> set key1 value1
ok
> get key
"value1"
> expire key1 5    # 5s 后过期
(integer) 1
 # 静等 5 秒
> get key1
(nil)

set 扩展

可以通过 SETNX 命令,对如果以存在的 key 不进行设置(SET),而不存在的则设置(SET)成功。

> SETNX key2 value2  # 如果 key 不存在则 SET 成功
(integer) 1
> SETNX key1 value3  # 如果 key 存在则 SET 失败
(integer) 0
> GET key1
"value1"             # 没有改变
> GET key2
"value2"			 # 成功

计数

如果 value 是一个整数,还可以对它使用 INCR 命令进行 原子性 的自增操作,这意味着及时多个客户端对同一个 key 进行操作,也决不会导致竞争的情况:

> set counter 100
OK
> INCR count
(interger) 101
> INCRBY counter 50
(integer) 151

其中,INCR 是加 1 ,而 INCRBY 是可以指定增加多少。

返回原值的

对字符串,还有一个 GETSET 比较让人觉得有意思,它的功能跟它名字一样:为 key 设置一个值并返回旧值:

> set key1 value1
OK
> GETSET key1 value2
"value1"				# 返回了旧值
> get key1
"value2"

该命令可以用在例如统计用户,如果使用 INCR 命令统计到一定的在线用户,现在需要重新归 0,并且记录已经在线的用户数量。这个时候可以通过 GETSET 命令,即赋值 0,又可以获得统计的数据

3 )列表

Redis 的列表相当于 Java 语言中的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。

插入

LPUSHRPUSH 分别可以向 list 的左边(头部)和右边(尾部)添加一个新元素;

> LPUSH list1 1 2 3 4 5
(integer) 5
> lrange list1 0 -1	 # 遍历列表
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

可以看出,因为 LPUSH从头部插入,和栈结构很像,插在头部,所以遍历的时候,就是倒序了。

>  RPUSH list2 1 2 3 4 5
(integer) 5
> lrange list2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

可以看出,因为 RPUSH从尾部插入,可队列结构很像,插在尾部,所以遍历的时候,就是有序的了。

获取

LRANGE 命令可以从 list 中取出一定范围的元素;

> lrange list2 1 3
1) "2"
2) "3"
3) "4"

其中。范围如果是 0 -1 ,就是遍历列表

LINDEX 命令可以从 list 中取出指定下表的元素,相当于 Java 链表操作中的 get(int index) 操作;

> lindex list2 1
"2"

移除

LPOP 命令就是从列表的最左边(头部)弹出

> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
> LPOP list1		 # 弹出
"5"
> lrange list1 0 -1     # 遍历列表,发现 5 不见了
1) "4"
2) "3"
3) "2"
4) "1"

RPOP 命令就是从列表的最右边(尾部)弹出

> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
>RPOP list1		 # 弹出
"1"
> lrange list1 0 -1  # 遍历列表,发现 1 不见了
1) "4"
2) "3"
3) "2"

4 )hash 字典

Redis 中的字典相当于 Java 中的 HashMap,内部实现也差不多类似,都是通过 “数组 + 链表” 的链地址法来解决部分 哈希冲突,同时这样的结构也吸收了两种不同数据结构的优点。

设置和获取

> HSET books java "think in java" python "python book"   # 命令行的字符串如果包含空格则需要使用引号包裹
(integer) 2
> HGET books java
"think in java" 
> HGET books python
"python book"

通过上面能看到,和其他类型差不多,HSET 可以设置新的 hash 值,HGEET 可以获取值。

还可以通过 HGETALL 获取键中全部对应的值。

> HGETALL books    # key 和 value 间隔出现
1) "java"
2) "think in java"
3) "python"
4) "python book"

也可以通过 HMSET 设置 hash 的多个 value,批量操作

> HMSET books2 c++ "c++  book" c "c book"    # 批量操作
OK

还有 hkeyshvals 命令可以获取该指定 hash 的所有的键或者值。

存在

hexists 命令可以判断 hash 里面的是否存在指定的 key。

> hkeys stus		# 查询 stus 中所有键
1) "stu1"
2) "stu2"
3) "stu3"
> hexists stus stu1		# 查询 stus 中是否存在键为 stu1
(integer) 1
> hexists stus stu5
(integer) 0

长度

hlen 命令可以获取 hash 的长度

> hlen stus
(integer) 3

删除

hdel 命令可以删除指定的 hash 中的 key

> hkeys stus
1) "stu1"
2) "stu2"
3) "stu3"
> hdel stus stu1
(integer) 1
> hkeys stus
1) "stu1"
2) "stu2"

其他

HSETNX 命令可以不存在则添加属性,存在则不添加属性

> HSET stus stu1 "stu1 value" stu2 "stu2 value"   # 命令行的字符串如果包含空格则需要使用引号包裹
(integer) 2
> HSETNX stus stu1 "stu1 value"
(integer) 0
> HSETNX stus stu3 "stu3 value"
(integer) 1
>  hgetall stus		 # 查看所有值
1) "stu1"
2) "stu1 value"
3) "stu2"
4) "stu2 value"
5) "stu3"
6) "stu3 value"

5 )集合 set

Redis 的集合相当于 Java 语言中的 HashSet,它内部的键值对是无序、唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 NULL。

设置和获取

SADD 命令可以设置一个新的集合,或者对已经存在的集合追加,但是是无序的。

> SADD set1 value1
(integer) 1
> SMEMBERS set1
"value1"

SMEMBERS 命令可以获取 key 对应的值。

这里 SADD 可以设置多个 value,毕竟是集合。

> SADD set2 java phthon golang
(integer) 2
> SMEMBERS set2    # 注意顺序,set 是无序的
1) "java"
2) "python"
3) "golang"

set 集合是不能够设置重复的,这里也一样。

> sadd set2 java
(integer) 0		# 重复了
> smembers set2
1) "phthon"
2) "golang"
3) "java"

但是如果只是其中一个值重复了,其他值没有重复,也可以插入。

> sadd set2 java c++ c
(integer) 2 		# 成功插入了 2 个
> SMEMBERS set3
1) "phthon"
2) "golang"
3) "java"
4) "c++"
5) "c"

长度

SCARD 命令获取 set 集合的长度。

> SCARD set2    # 获取长度
(integer) 5

移除

SPOP 可以弹出集合中的一个值。

> SPOP set2     # 弹出一个
"java"
> SPOP set2 2 # 随机弹出两个
1) "phthon"
2) "c"

数学集合类

差集:sdiff 在第一个set里面而不在后面任何一个set里面的项
交集:sinter 在第一个set里面且在后面的set里面的项
并集:sunion 在第一个set里面或者在其他set里面的 项

6 ) 有序列表 zset

这可能使 Redis 最具特色的一个数据结构了,它类似于 Java 中 SortedSetHashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以为每个 value 赋予一个 score 值,用来代表排序的权重。

它的内部实现用的是一种叫做 「跳跃表」 的数据结构。

设置

ZADD 命令可以设置一个新的集合,或者对已经存在的集合追加,并且有序。

> zadd book 9 "java book"
(integer) 1
> zadd book 8.7 "python book"
(integer) 1
> zadd book 8.6 "c++ book"
(integer) 1
> zrange book 0 -1 withscores # 遍历,并且以 score value ... 一行一行呈现 , 按 score 排序列出,参数区间为排名范围
1) "python book"
2) "8.5"
3) "c++ book"
4) "8.7"
5) "java book"
6) "9"

可以看到,每一个 value 对应一个权重,也就 score,然后按照这个权重排序。

同时,ZADD 命令也可以多个 score value 插入

> zadd book 9.5 "c  book" 9.6 "c++ book"
(integer) 1
> zrange book 0 -1 withscores # 按 score 排序列出,参数区间为排名范围
1) "python book"
2) "8.5"
3) "java book"
4) "9"
5) "c  book"
6) "9.5"
7) "c++ book"
8) "9.5999999999999996"    # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题

获取

正序

zrange 按 score 排序列出,参数区间为排名范围

> zrange book 0 -1 withscores # 按 score 排序列出,参数区间为排名范围
1) "python book"
2) "8.5"
3) "java book"
4) "9"
5) "c  book"
6) "9.5"
7) "c++ book"
8) "9.5999999999999996"    # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题

逆序

zrevrange 命令和 zrange 差不多,一个是逆序,一个是顺序排序。

> zrevrange book 0 -1 withscores # 按 score 逆序列出,参数区间为排名范围
1) "c++ book"
2) "9.5999999999999996"
3) "c  book"
4) "9.5"
5) "java book"
6) "9"
7) "python book"
8) "8.5"

获取 score

ZSCORE 命令可以获取指定的 value 对应的 score。

> ZSCORE books "java book"   # 获取指定 value 的 score
"9"             

通过分数区间获取元素个数

zcount 获取分数区间内元素个数,命令是:zcount key 开始分数区间 结束分数区间

> zcount book 8 9
(integer) 2

获取 value 在 zset 中的下标位置

zrank 获取 value 在 zset 中的下标位置

> zrange book 0 -1 
1) "python book"
2) "java book"
3) "c  book"
4) "c++ book"
> zrank book "c++ book"
(integer) 3			# 下表是从 0 开始

根据分值区间遍历 zset

ZRANGEBYSCORE 命令可以根据分支区间遍历 zset

> ZRANGEBYSCORE book 8 9
1) "python book"
2) "java book"

还可以限定区间更细的范围,例如 根据分值区间 (-∞, 8.91] 遍历 zset

# 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
> ZRANGEBYSCORE book -inf 8.91 withscores
1) "python book"
2) "8.5"

删除

ZREM 命令可以删除指定的 value 值

> zrem book "python book"
(integer) 1
> zrange book 0 -1
1) "java book"
2) "c  book"
3) "c++ book"

长度

zcard 命令可以获取集合中元素个数

> zcard book
(integer) 4

7 ) 命令总结

key 命令

序号 命令及描述
1 DEL key 该命令用于在 key 存在时删除 key。
2 TYPE key 返回 key 所储存的值的类型。
3 EXISTS key 检查给定 key 是否存在。
4 EXPIRE key seconds 为给定 key 设置过期时间,以秒计。
5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。
6 PEXPIRE key milliseconds 设置 key 的过期时间以毫秒计。
7 SCAN cursor [MATCH pattern\] [COUNT count] 迭代数据库中的数据库键。
8 KEYS pattern 查找所有符合给定模式( pattern)的 key 。
9 MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中。
10 PERSIST key 移除 key 的过期时间,key 将持久保持。
11 PTTL key 以毫秒为单位返回 key 的剩余的过期时间。
12 TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
13 RANDOMKEY 从当前数据库中随机返回一个 key 。
14 RENAME key newkey 修改 key 的名称
15 RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 。

string 命令

序号 命令及描述
1 SET key value 设置指定 key 的值
2 GET key 获取指定 key 的值。
3 GETRANGE key start end 返回 key 中字符串值的子字符
4 GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5 MGET key1 key2.. 获取所有(一个或多个)给定 key 的值。
6 SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
7 SETNX key value 只有在 key 不存在时设置 key 的值。
8 STRLEN key 返回 key 所储存的字符串值的长度。
9 MSET key value key value ... 同时设置一个或多个 key-value 对。
10 MSETNX key value key value ... 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
11 PSETEX key milliseconds value 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
12 INCR key 将 key 中储存的数字值增一。
13 NCRBY key increment 将 key 所储存的值加上给定的增量值(increment) 。
14 INCRBYFLOAT key increment 将 key 所储存的值加上给定的浮点增量值(increment) 。
15 DECR key 将 key 中储存的数字值减一。
16 DECRBY key decrement key 所储存的值减去给定的减量值(decrement) 。
17 APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

hash 命令

序号 命令及描述
1 HDEL key field1 ield2 删除一个或多个哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 获取存储在哈希表中指定字段的值。
4 HGETALL key 获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
6 HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
7 HKEYS key 获取所有哈希表中的字段
8 HLEN key 获取哈希表中字段的数量
9 HMGET key field1field2 获取所有给定字段的值
10 HMSET key field1 value1 field2 value2 同时将多个 field-value (域-值)对设置到哈希表 key 中。
11 HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
12 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
13 HVALS key 获取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern\] [COUNT count] 迭代哈希表中的键值对。

list 命令

序号 命令及描述
1 BLPOP key1 [key2] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
2 BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
17 RPUSHX key value 为已存在的列表添加值
4 LINDEX key index 通过索引获取列表中的元素
5 LINSERT key BEFORE 在列表的元素前或者后插入元素
6 LLEN key 获取列表长度
7 LPOP key 移出并获取列表的第一个元素
8 LPUSH key value1 [value2] 将一个或多个值插入到列表头部
9 LPUSHX key value 将一个值插入到已存在的列表头部
10 LRANGE key start stop 获取列表指定范围内的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通过索引设置列表元素的值
13 LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
14 RPOP key 移除列表的最后一个元素,返回值为移除的元素。
15 RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
16 RPUSH key value1 [value2] 在列表中添加一个或多个值

set 命令

序号 命令及描述
1 SADD key member1 [member2] 向集合添加一个或多个成员
2 SCARD key 获取集合的成员数
3 SDIFF key1 [key2] 返回第一个集合与其他集合之间的差异。
4 SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
5 SINTER key1 [key2] 返回给定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
7 SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8 SMEMBERS key 返回集合中的所有成员
9 SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10 SPOP key 移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count] 返回集合中一个或多个随机数
12 SREM key member1 [member2] 移除集合中一个或多个成员
13 SUNION key1 [key2] 返回所有给定集合的并集

zset 命令

序号 命令及描述
1 ZADD key score1 member1 [score2 member2\] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZCARD key 获取有序集合的成员数
3 ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4 ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5 ZSCORE key member 返回有序集中,成员的分数值
6 ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7 ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8 ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10 ZRANK key member 返回有序集合中指定成员的索引
11 ZREM key member [member ...] 移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

你可能感兴趣的:(Redis)