redis 数据结构篇

字符串类型

字符串类型是 redis 当中最基本的数据类型。它能存储任何形式的字符串,包括二进制数据。

也就是说可以存储图片。

一个字符串类型的键允许值的最大容量是 512 MB.

命令

赋值与取值

SET key value
GET key

递增

INCR key

INCRBY命令与INCR命令基本一样,只不过前者可以通过increment参数指定单次递增的数值

递减

DECR key
DECRBY key decrement

增加指定浮点数

INCRBYFLOAT key increment

哈希类型

赋值与取值

HSET key field value
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key
redis> HSET car price 500
(integer) 1
redis> HSET car name BMW
(integer) 1
redis> HGET car name
"BMW"

HSET命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作(insert)还是更新操作(update)。当执行的是插入操作时(即之前字段不存在),HSET命令会返回1,当执行的是更新操作时(即之前字段已经存在),HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它。

下面的命令:

HSET key field1 value1
HSET key field2 value2

等价于:

HMSET key field1 value1 field2 value2

相应地,HMGET命令可以同时获得多个字段的值:

redis> HMGET car price name
1) "500"
2) "BMW"

如果想获取键中所有字段和字段值却不知道键中有哪些字段时(如3.3.1节介绍的存储汽车对象的例子,每个对象拥有的属性都未必相同),应该使用HGETALL命令。

redis> HGETALL car
1) "price"
2) "500"
3) "name"
4) "BMW"

列表类型

列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(1),获取的元素越接近两端速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的(和从只有20个元素的列表中获取头部或尾部的10条记录的速度是一样的)。

与哈希类型键最多能容纳的字段数量相同,一个列表类型键最多能容纳232−1个元素。

set

set 和 list 的区别

存储空间: 232-1
有序? set 无序, list 有序
唯一? set 有唯一性, list 无。

命令

SADD key membet...

SADD命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。

因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。此命令的返回值是增加成功的元素个数(忽略的元素不计算在内)。

SREM key member...

获取集合中的所有元素

SMEMBERS key

redis> SMEMBERS letters
1) "b"
2) "a"

判断元素是否在集合中

SISMEMBER key member

判断一个元素是否在集合中是一个时间复杂度为O(1)的操作,无论集合中有多少个元素,SISMEMBER命令始终可以极快地返回结果。当值存在时SISMEMBER命令返回1,当值不存在或键不存在时返回0

集合间运算

获得集合中元素的数量

ZCARD key

获得指定分数范围内的元素个数

ZCOUNT key min max

redis> ZCOUNT scoreboard 90 100
(integer) 2

删除一个或多个元素

ZREM key member [member ...]

按照排名范围删除元素

z rem range by rank

ZREMRANGEBYRANK key start stop

流类型

流类型(stream)是Redis 5.0推出的新的数据类型。这个类型的推出是作为列表、有序列表以及4.4节会介绍的“发布/订阅”模式的补充。也正因如此,流类型或多或少地带有一些列表、有序列表和“发布/订阅”模式的特性,同时又有一些不同的地方。

(1)列表类型可以在头部和中间插入内容,而日志没有类似的需求,所以流类型也只支持在末尾追加内容[15]。不过流类型比列表类型强大的是,在插入一个新条目时可以自动为其生成一个在流中的唯一ID(类似于日志的行号)。这个ID可以用来进行查询等操作

(2)之前学习过,列表类型的每个条目只能是一个字符串。类似的还有哈希类型的字段值和有序集合类型的值,它们也都只能是字符串。而流类型的每个条目都可以是若干键值对,可以方便我们结构化地存储日志的详情。

此外,流类型的内部数据结构能够非常高效地利用内存。例如在一般的使用场景中,每一条记录的键值对结构都是相同的(上面的例子中,每个记录都包含了ua和ip这两个键值对),流类型会对相同结构的键名进行压缩,所以不需要为每条记录存储这个结构。此外,流类型的内部数据结构能够非常高效地利用内存。例如在一般的使用场景中,每一条记录的键值对结构都是相同的(上面的例子中,每个记录都包含了ua和ip这两个键值对),流类型会对相同结构的键名进行压缩,所以不需要为每条记录存储这个结构。

posted @ 2022-10-08 20:25  YanyuWu  阅读(36)  评论(0编辑  收藏  举报