Redis基本数据类型

       Redis有五种基本数据类型:String(字符串),list(列表),set(集合),zset(有序集合),hash(哈希)。接下来一个个分析这五个数据类型。

1.String

 redis中String不同于java中的String,这里的字符串是可以更改的字符串,内部的结构类似与Java中的Arraylist,是预分配数组大小(内存中是以字节数组的形式存在的),不够的话在进行扩容的机制。(当字符串的大小小与1M时,每次扩容都是加倍,达到1M时,每次扩容都是增加1M,最大的长度限制是512M)

我们知道 C 语言里面的字符串标准形式是以 NULL 作为结束符,但是在 Redis 里面字符串不是这么表示的。因为要获取 NULL 结尾的字符串的长度使用的是 strlen 标准库函数,这个函数的算法复杂度是 O(n),它需要对字节数组进行遍历扫描,作为单线程的 Redis 表示承受不起。Redis 的字符串叫着「SDS」,也就是Simple Dynamic String。它的结构是一个带长度信息的字节数组。

常见的用途是缓存用户信息。将一个对象json序列化成字符串塞进redis中,取出的时候再进行反序列化

 

2.list

redis中的list相当与Java中LinkedList,底层是链表结构而不是数组(当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收)

 

常见的用途是用来做异步队列使用,将需要延后操作的任务结构体序列化成字符串塞进list,另外有一个线程去轮询取数据。

3.hash(字典)

Redis的hash结构相当于Java中hashMap,结构也是数组加链表的形式。

不同点:1.hash中的value的值只能是字符串

              2.与hashMap的rehash的方式不一样,因为 Java 的 HashMap 在字典很大时,rehash 是个耗时的操作,需要一次性全部 rehash。Redis 为了高性能,不能堵塞服务,所以采用了渐进式 rehash 策略。

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

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

注:

hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。

4.Set(集合)

相当于Java中的Hahset,是无序且唯一的,内部结构与hash一样,只不过value都是Null

set 结构可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次

5.zset(有序集合)

zset 可能是 Redis 提供的最为特色的数据结构,它也是在面试中面试官最爱问的数据结构。它类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。

zset 内部的排序功能是通过「跳跃列表」数据结构来实现的,它的结构非常特殊,也比较复杂。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值