Redis的基本类型

发布于 2023-06-14  110 次阅读


目标:Redis的基本类型有哪些

基本类型

基本数据结构包含:字符串(strings)、 散列(hashes)、 列表(lists)、 集合(sets)、 有序集合(sorted sets)五种。这五种数据结构在我们工作中经常使用到,面试过程中经常被问到,因此熟练掌握这5种基本数据结构的使用和应用场景是Redis知识最基础也是最重要的部分。

字符串(Strings)

字符串(Strings)是Redis最简单的储存类型,它存储的值可以是字符串整数或者浮点数,对整个字符串或者字符串的其中一部分执行操作;对整数或者浮点数执行自增(increment)或者自减(decrement)操作。

Redis的字符串是一个由字节组成的序列,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M 

应用场景

字符串类型在工作中使用广泛,主要用于缓存数据,提高查询性能。比如存储登录用户信息、电商中存储商品信息、可以做计数器(想知道什么时候封锁一个IP地址(访问超过几次))等等。

操作命令

  • set key value: 添加一条String类型数据
  • get key: 获取一条String类型数据
  • mset key1 value1 key2 value2: 添加多条String类型数据
  • mget key1 key2: 获取多条String类型数据
  • incr key: 自增(+1)
  • incrby key step: 按照步长(step)自增
  • decr key: 自减(-1)
  • decrby key step: 按照步长(step)递减

散列(Hashes)

散列(Hashes)是一种存储键值对的数据结构,散列内部是无序字典,其中键和值都是字符串类型。散列可以看作是一个具有字段和值的哈希表,一个哈希表有多个节点,每个节点保存一个键值对

Redis 为了高性能,不能堵塞服务,所以采用了渐进式 rehash 策略。

渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 操作指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。

当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收

应用场景

Hash也可以同于对象存储,比如存储用户信息,与字符串不一样的是,字符串是需要将对象进行序列化(比如json序列化)之后才能保存,而Hash则可以讲用户对象的每个字段单独存储,这样就能节省序列化和反序列的时间。

操作命令

  • HSET key field value:将指定键的字段设置为指定的值。如果键不存在,则会创建一个新的散列并设置字段和值。
  • HGET key field:获取指定键的字段对应的值。
  • HGETALL key:获取指定键的所有字段和对应的值。
  • HDEL key field1 [field2 ...]:删除指定键中的一个或多个字段及其对应的值。
  • HEXISTS key field:检查指定键中是否存在指定的字段。
  • HKEYS key:获取指定键中的所有字段。
  • HVALS key:获取指定键中的所有值。
  • HLEN key:获取指定键中字段的数量。
  • HMSET key field1 value1 [field2 value2 ...]:设置指定键的多个字段和值。
  • HMGET key field1 [field2 ...]:获取指定键的多个字段对应的值。
  • HINCRBY keyname field step:按照步长自增/自减某个属性(该属性必须是数字)

列表(List)

列表(List)是一种有序、可重复的数据结构,它可以存储多个字符串值。列表按照插入顺序排序,并且可以在列表的两端执行插入、删除和查询操作。Redis的列表是基于链表实现的,因此在列表两端执行操作的时间复杂度为O(1)。

应用场景

lists的应用场景非常多,可以利用它轻松实现热销榜;可以实现工作队列(利用lists的push操作,将任务存在lists中,然后工作线程再用pop操作将任务取出进行执行 );可以实现最新列表,比如最新评论等。

操作命令

  • LPUSH key value1 [value2 ...]:将一个或多个值插入到列表的左侧(头部)。
  • RPUSH key value1 [value2 ...]:将一个或多个值插入到列表的右侧(尾部)。
  • LPOP key:移除并返回列表的左侧(头部)元素。
  • RPOP key:移除并返回列表的右侧(尾部)元素。
  • LINDEX key index:返回列表中指定索引位置的元素。
  • LLEN key:返回列表的长度(即元素个数)。
  • LRANGE key start stop:返回列表中指定范围内的元素(包括起始和结束位置)。
  • LINSERT key BEFORE|AFTER pivot value:在列表中指定元素的前或后插入新元素。
  • LSET key index value:将列表中指定索引位置的元素设置为新的值。
  • LREM key count value:从列表中删除指定数量的匹配元素。
  • RPOPLPUSH source destination:移除并返回源列表的最后一个元素,并将其插入到目标列表的头部。

集合(Set)

集合(Set)是一种无序不重复的数据结构,它可以存储多个字符串值。与列表不同,集合中的元素没有特定的顺序,并且集合会自动去重,确保每个元素的唯一性。Redis的集合是基于哈希表实现的,因此在集合中执行添加、删除和查询操作的时间复杂度为O(1)。

应用场景

redis的sets类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。比如计算网站独立ip,用户画像中的用户标签,共同好友等功能

操作命令

  • SADD key member1 [member2 ...]:向集合中添加一个或多个成员。
  • SREM key member1 [member2 ...]:从集合中移除一个或多个成员。
  • SISMEMBER key member:判断指定成员是否存在于集合中。
  • SMEMBERS key:返回集合中的所有成员。
  • SCARD key:返回集合的基数(元素个数)。
  • SPOP key [count]:随机移除并返回集合中的一个或多个成员。
  • SRANDMEMBER key [count]:随机返回集合中的一个或多个成员,但不移除它们。
  • SINTER key1 [key2 ...]:返回给定集合之间的交集。
  • SUNION key1 [key2 ...]:返回给定集合之间的并集。
  • SDIFF key1 [key2 ...]:返回给定集合之间的差集(第一个集合相对于其他集合的补集)。
  • SINTERSTORE destination key1 [key2 ...]:将给定集合之间的交集存储到目标集合。
  • SUNIONSTORE destination key1 [key2 ...]:将给定集合之间的并集存储到目标集合。
  • SDIFFSTORE destination key1 [key2 ...]:将给定集合之间的差集存储到目标集合。

有序集合(Sorted Set)

有序集合(Sorted Set)是一种数据结构,它类似于集合(Set),但每个成员都关联一个称为分数(score)的浮点数值。有序集合中的成员是唯一的,但分数可以重复

应用场景

主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等。

操作命令

  • ZADD key score member [score member ...]:将一个或多个成员及其对应的分数添加到有序集合中。
  • ZREM key member [member ...]:从有序集合中移除一个或多个成员。
  • ZCARD key:获取有序集合中成员的数量。
  • ZSCORE key member:获取指定成员的分数。
  • ZRANGE key start stop [WITHSCORES]:按照成员的排名范围获取有序集合中的成员。可选的 WITHSCORES 参数可以同时返回成员的分数。
  • ZRANK key member:获取指定成员在有序集合中的排名(从低到高)。
  • ZREVRANK key member:获取指定成员在有序集合中的排名(从高到低)。
  • ZINCRBY key increment member:将指定成员的分数增加指定的增量值。

参考

  • InCowboy电子书 - IMOOC

间歇性凌云壮志,持续性混吃等死