redis五种数据结构的实现及使用场景

Redis是一种key/value型数据库,其中,每个key和value都是使用对象表示的。

类型对象名
string字符串对象
list列表对象
hash哈希对象
set集合对象
zset有序集合对象

但为了提高存储效率与程序执行效率,每种对象的底层数据结构实现都可能不止一种。encoding就表示了对象底层所使用的编码。下面先介绍每种底层数据结构的实现,再介绍每种对象类型都用了什么底层结构并分析他们之间的关系。

在这里插入图片描述

Redis对象底层数据结构

底层数据结构共有八种,如下表所示:

编码类型编码所对应的底层数据结构
REDIS_ENCODING_INTlong 类型的整数
REDIS_ENCODING_EMBSTRembstr 编码的简单动态字符串
REDIS_ENCODING_RAW简单动态字符串
REDIS_ENCODING_HT字典
REDIS_ENCODING_LINKEDLIST双端链表
REDIS_ENCODING_ZIPLIST压缩列表
REDIS_ENCODING_INTSET整数集合
REDIS_ENCODING_SKIPLIST跳跃表和字典
字符串对象

字符串对象的编码可以是int、raw或者embstr。

如果一个字符串的内容可以转换为long,那么该字符串就会被转换成为long类型,对象的ptr就会指向该long,并且对象类型也用int类型表示。

普通的字符串有两种,embstr和raw。embstr应该是Redis 3.0新增的数据结构,在2.8中是没有的。如果字符串对象的长度小于39字节,就用embstr对象。

使用场景:

  1. 缓存功能:字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。

  2. 计数器:许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,
    同时数据可以一步落地到其他的数据源。
    如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。

  3. 共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。

  4. 限速:处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。


列表对象

列表对象的编码可以是ziplist或者linkedlist。

ziplist是一种压缩链表,它的好处是更能节省内存空间,因为它所存储的内容都是在连续的内存区域当中的。当列表对象元素不大,每个元素也不大的时候,就采用ziplist存储。但当数据量过大时就ziplist就不是那么好用了。因为为了保证他存储内容在内存中的连续性,插入的复杂度是O(N),即每次插入都会重新进行realloc。

使用场景:

  1. 消息队列: redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性

哈希对象

哈希对象的底层实现可以是ziplist或者hashtable。

ziplist中的哈希对象是按照key1,value1,key2,value2这样的顺序存放来存储的。当对象数目不多且内容不大时,这种方式效率是很高的。

hashtable的是由dict这个结构来实现的,dict是一个字典

使用场景:

  1. 哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询,开发困难,维护成本高。

集合对象

集合对象的编码可以是intset或者hashtable。

intset是一个整数集合,里面存的为某种同一类型的整数,支持如下三种长度的整数:

#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

使用场景:

  1. 标签(tag):集合类型比较典型的使用场景,如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。(用户和标签的关系维护应该放在一个事物内执行,防止部分命令失败造成数据不一致)

  2. sadd=tagging(标签)

  3. spop/srandmember=random item(生成随机数,比如抽奖)

  4. sadd+sinter=social Graph(社交需求)


有序集合对象

有序集合的编码可能两种,一种是ziplist,另一种是skiplist与dict的结合。

ziplist作为集合和作为哈希对象是一样的,member和score顺序存放。按照score从小到大顺序排列。它的结构不再复述。

skiplist是一种跳跃表,它实现了有序集合中的快速查找,在大多数情况下它的速度都可以和平衡树差不多。但它的实现比较简单,可以作为平衡树的替代品。它的结构比较特殊。\

使用场景:

  1. 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
### 回答1: Redis支持五种数据结构类型:字符串(string)、列表(list)、哈希(hash)、集合(sets)、有序集合(sorted sets)。它们可以用于实现缓存、消息队列、计数器、在线聊天室、投票系统、排行榜等应用场景。 ### 回答2: Redis支持多种数据结构类型,常用的有字符串、哈希、列表、集合和有序集合。 1. 字符串(strings):最基本的数据结构类型,可以存储字符串、整数或浮点数等。常用场景包括缓存、计数器和分布式锁等。 2. 哈希(hashes):类似于一个关联数组,可以存储多个字段和值的映射关系。适用于存储对象的各个属性,例如用户信息、商品详情等。 3. 列表(lists):支持在头部或尾部添加或删除元素,保持了元素的插入顺序。常用于消息队列、发布订阅系统和任务队列等场景。 4. 集合(sets):无序且唯一的元素集合。适用于需要对元素进行去重或集合操作的场景,例如标签云、社交关系等。 5. 有序集合(sorted sets):元素集合,每个元素都关联了一个分数,用于排序和获取范围内的元素。常见应用包括排行榜、热门文章等。 这些数据结构类型提供了丰富的功能和灵活性,可以根据不同的场景选择适合的数据结构Redis 的快速读写性能和丰富的数据类型使得它成为了很多应用场景的首选,包括缓存、计数器、消息队列、排行榜、实时数据分析等。 ### 回答3: Redis是一款开源的、高性能的非关系型内存数据库,支持多种数据结构类型。常用的Redis数据结构类型有字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 字符串类型是Redis最基本的数据结构类型,可以存储字符串和整数。它常用于缓存、计数器、共享会话等场景。 哈希类型可以存储多个字段和值的映射关系,类似于关联数组或字典。它适用于存储用户信息、商品信息等结构化的数据。 列表类型是有序的字符串列表,可以在列表的两端进行插入、删除和查找操作。它适合做消息队列、最新消息排行等场景。 集合类型是无序的字符串集合,可以对集合进行交集、并集和差集等操作,也支持添加、删除和查找元素。常用的场景包括社交关系、标签系统等。 有序集合类型是在集合类型的基础上,为每个元素关联一个分数,可以根据分数进行元素排序。它适用于排行榜、按照分数范围查找等场景。 除了以上几种数据结构类型,Redis还提供了位图、地理位置等特殊类型,可以应用于统计用户在线时长、地理位置检索等特定需求。 总而言之,Redis提供了多种数据结构类型,每种类型都有其独特的使用场景。根据具体的业务需求,选择适合的数据结构类型可以提升数据处理效率和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值