Redis 基本数据类型 :String、Hash、List、Set、ZSet


字符串类型

字符串类型(SDS)即简单动态字符串,它是以键值对key-value的形式进行存储的,根据 key 来存储和获取value值

依据不同情况,字符串在底层会使用 int 、 raw 或者 embstr 三种不同的编码格式

  • 如果数据为可以使用long类型来保存的整数,则使用int
  • 如果数据为可以使用long double类型来保存的浮点数,则使用embstr或者raw
  • 如果数据为字符串,或者长度过大没办法用long来表示的整数,以及长度过大无法用long double表示的浮点数,则使用embstr或者raw。当数据小于39字节时,使用embstr,当大于39字节时使用raw
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


基本用法

127.0.0.1:6379> set hello world	//设置key-value
OK
127.0.0.1:6379> get hello	//根据key获取value
"world"
127.0.0.1:6379> strlen hello	//计算value长度
(integer) 5

在这里插入图片描述


使用场景

  • 存放用户(登录)信息;
  • 存放文章详情和列表信息;
  • 存放和累计网页的统计信息。

哈希类型

字典类型 (Hash) 又被成为散列类型或者是哈希表类型,它是将⼀个键值 (key) 和⼀个特殊的“哈希表”关联起来。
在这里插入图片描述

哈希类型的底层数据结构可以是压缩列表(ZipList)或者字典(Dict)

  • 当哈希对象的所有键值对的键和值的字符串长度都小于64字节,并且保存的键值对数量小于512个时,使用压缩列表
  • 如果不满足上述条件中的任意一个,都会使用字典
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述


基本用法

127.0.0.1:6379> hset hash1 name lee age 20	//设置key-value的映射
(integer) 2
127.0.0.1:6379> hget hash1 name	//获取key为name的value
"lee"
127.0.0.1:6379> hget hash1 age	//获取key为age的value
"20"

在这里插入图片描述


使用场景

  • 存储用户信息或者某个物品的信息,无需序列化,直接建立映射

列表类型

列表类型 (List) 是⼀个使用线性结构存储的结构,它的元素插入会按照先后顺序存储到链表结构中。
列表类型的底层数据结构可以是压缩列表(ZipList)或者链表(LinkedList)

  • 当列表对象的所有字符串元素长度都小于64字节,并且保存的元素数量小于512个时,使用压缩列表
  • 如果不满足上述条件中的任意一个,都会使用链表
    在这里插入图片描述
    在这里插入图片描述

基本用法

127.0.0.1:6379> lpush list1 1 2 3 4 5	//依次头插1 2 3 4 5,此时数据为5 4 3 2 1
(integer) 5
127.0.0.1:6379> rpop list1	//尾删
"1"
127.0.0.1:6379> lpop list1	//头删
"5"

在这里插入图片描述


使用场景

  • 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第⼀个元素,所以列表类型可以用来实现消息队列;
  • 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样不仅可以完美的实现分页功能,而且加速了程序的响应速度。

集合类型

集合类型 (Set) 是⼀个无序并唯⼀的键值集合。

集合类型的底层数据结构可以是整数集合(IntSet)或者字典(Dict)

  • 当集合对象的所有元素都是整数值,并且保存的元素数量小于512个时,使用整数集合
  • 如果不满足上述条件中的任意一个,都会使用字典
    在这里插入图片描述
    在这里插入图片描述

基本用法

127.0.0.1:6379> sadd testSet v1 v2 v3 v4 v2 v4 v1
(integer) 4
127.0.0.1:6379> smembers testSet	//去重且无序
1) "v2"
2) "v1"
3) "v4"
4) "v3"

在这里插入图片描述


使用场景

  • 微博关注我的人和我关注的人都适合用集合存储,可以保证人员不会重复;
  • 中奖人信息也适合用集合类型存储,这样可以保证⼀个人不会重复中奖。

有序集合类型

有序集合类型 (SortedSet) 相比于集合类型多了⼀个排序属性 score(分值),所以对于有序集合ZSet 来说,每个存储元素相当于有两个值组成的,⼀个是有序结合的元素值,⼀个是分值。有序集合的存储元素值也是不能重复的,但分值是可以重复的。

有序集合类型的底层数据结构可以是压缩列表(ZipList)或者跳表(SkipList )

  • 当有序集合对象的所有元素成员的长度都小于64字节,并且保存的元素数量小于128个时,使用压缩列表
  • 如果不满足上述条件中的任意一个,都会使用跳表(这里的跳表是结合字典的)
    在这里插入图片描述
    在这里插入图片描述
    这里不是直接使用跳表,而是搭配字典一起使用
    之所以这样设置是因为考虑到如果直接使用跳跃表,如果需要查找成员的分值时只能通过遍历来进行查找,而这样的效率是O(logN)
    而字典虽然建立映射后可以O(1)的查找到分值,但是哈希只能通过key值进行查找,并不支持范围查询。
    所以将两者进行结合,使用字典建立起元素与分值的映射,使用字典来进行成员分数的查找,而使用跳跃表来进行范围型操作,这样就很好的解决了这个问题。
typedef struct zset {
    
    
    zskiplist *zsl;

    dict *dict;
} zset;

在这里插入图片描述

在这里插入图片描述


基本用法

127.0.0.1:6379> zadd zset1 3 v1 8 v2 2 v3 6 v4	#插入时以分值-值的形式插入
(integer) 4
127.0.0.1:6379> zrange zset1 0 -1	#查找结果按照升序排序
1) "v3"
2) "v1"
3) "v4"
4) "v2"

在这里插入图片描述


使用场景

  • 学生成绩排名;
  • 粉丝列表,根据关注的先后时间排序。

猜你喜欢

转载自blog.csdn.net/qq_35423154/article/details/108541706