Redis基础数据类型

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis基础数据类型

Redis基础数据类型

redis有5中基础数据类型结构,分别为 string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合).

redis所有的数据结构都用一个唯一的key字符串作为名称,然后通过这唯一的key获取相应的value数据,不同类型的数据结构在于value的结构不同,也就是说不管是什么数据类型,他们的key都是字符串,代表能找到相应数据的标识。

string(字符串)

字符串结构用于存储一些固定的信息,例如用户信息,在系统中将用户信息序列化成一个json字符串,随后根据用用户id作为key,json串作为value存入redis,

后续的过程中,获取用户信息时,就可以通过id来redis中获取,避免频繁访问数据库。

内部实现

和java中的字符串不同,java中的字符串对象是不可变的,在redis中,字符串是可变的,内部结构的实现类似于Java中的ArrayList,采用预分配冗余空间的方式减少内存的频繁分配,

如下图,内部为字符串分配的实际空间(capacity)一般要高于实际字符串长度(len),当字符串长度小于1MB时,扩容是按照当前的空间翻倍,如果超过1MB,扩容每次最多只多加1MB的空间。

打个假设, value 是 hello 时,那么字符串的长度可能是10,前面五个存hello,后面5个用于应对后续的扩容。

image.png

PS:字符串的最大长度是512MB。

要点:Redis的字符串可扩容,大小不超过1MB时,翻倍拓容,超过则每次只加1MB。

list(列表)

Redis的列表和Java中的LinkedList相似,是链表结构,

既然是链表,则意味着插入和删除的速度非常快,时间复杂度为O(1),但是查找就很慢了,时间复杂度则是O(N),

链表中的每个元素都有双向指针,可以指向上一个元素和下一个元素,方便支持向前遍历和向后遍历,当列表弹出最后一个元素后(也就是链表中没数据了),该list将会被自动删除,list占用的内存被回收。

快速列表

Redis的底层不是一个简单的LinkedList,而是一个quicklist(快速列表)结构,

当列表元素较少的情况下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表,它将所有的元素紧凑的放在一起存储,使用的是一块连续的内存空间(数组),当数据量比较多的时候才会改为quicklist。

因为普通的链表需要两个指针,指针也是占用内存空间的,还会加重内存的碎片化,比如一个链表中存的是int类型数据,还需要额外为这个数据增加两个额外的指针(prev和next),

所以redis将链表和ziplist结合组成quicklist,既能满足快速的插入删除性能,又不会出现太大的空间冗余,在性能和空间之间做了平衡。

image.png

要点:Redis中的列表其实是一个链表和ziplist的组合(为了节省空间),称为quicklist,而非想象中的类似java的ArrayList,该结构的好处是新增删除比较快,查找较慢。

hash(字典)

Redis字典和java的HashMap类似,都是无序字典,内部存储着键值对,同时双方的数据结构都是 数组+链表 的二维结构,当数组位置发生碰撞时,就会将碰撞的元素使用数组位置下的链表进行串联。

image.png

不同的是,Redis字典的值只能是字符串,并且rehash的方式和java也不一样,java的HashMap在rehash时,需要一次性全部完成,在数据量比较大的时候,性能较差,会比较慢,

redis为了追求高性能,保证rehash的时候不阻塞服务,采用了渐进式rehash策略。

渐进式 rehash

渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,

然后在后续的定时任务以及hash操作指令中,循环渐进的将旧hash的内容一点点迁移到新的hash结构中,

当迁移完成,新的hash将替代老的hash,老的hash在最后一个元素被移除后,将会被自动删除,内存被回收。

image.png

set(集合)

Redis中的集合相当于Java语言中的HashSet,键值对是无序,但唯一的,内部实现是一个字典,字典中所有的value都是一个null值,当集合中的最后一个元素被移除时,数据结构将被自动删除,内存则被回收。

zset(有序集合)

zset类似Java的SortedSet和HashMap的结合体,一方面是一个set可以保证唯一性,另一方面可以给set中的每个数据设置一个score,用于给数据进行排序,

zset的内部数据结构是一个叫做跳跃列表的树结构,同set一样,当集合中的最后一个元素被移除时,数据结构将被自动删除,内存则被回收。

跳跃列表

zset需要支持随机插入和删除,使用数组自然不合适,所以存储需要使用链表数据结构,同时这个链表还需要使用score值进行排序,

有序意味着,当有新元素要插入时,要定位到特定位置的插入点,这样才可以保证链表是有序的,通常定位插入点会用二分查找来做,但是只有数组才支持二分查找,链表做不到,此时就需要跳跃列表帮忙做这件事,

举个例子,如果在一个几百号人的公司里,老板分配任务,在没有组织架构的情况下,得单独为每个人分配,这样必然会很累,

但是公司可以选部门经理,再选小组组长,再到组员,这样老板每次下达任务只需要找部门经理,部门经理再找组长,组长再找组员,这样就会轻松很多,

跳跃列表就类似于上面的层级制,所有的元素都在最下层用链表串着,每隔几个元素选出一个组长,组长之间再选部门经理,

之所以叫做跳跃列表,是因为一个元素可能会同时存在于不同的层次中,例如下图中间的元素,可以同时存在于L0、1、2 三层中,

定位插入点时,先在顶层进行定位,然后下潜到下一层,直到下潜到最底层,将新元素插入进去,用这种方式可以达到类似二分查找的效果。

image.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
13天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
155 85
|
29天前
|
存储 NoSQL Redis
redis常见数据类型
Redis 是一种基于内存的键值存储数据库,支持字符串、哈希表、列表、集合及有序集合等多种数据类型,每种类型均有特定用途与适用场景,提供丰富的命令操作,适用于高速数据访问与处理。
44 5
|
2月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
43 1
|
3月前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
47 1
|
4月前
|
存储 消息中间件 缓存
深入探析Redis常见数据类型及应用场景
深入探析Redis常见数据类型及应用场景
74 2
|
5月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
5月前
|
NoSQL Java Redis
Redis5种数据类型
这篇文章介绍了Redis的五种数据类型:字符串、列表、集合、有序集合和哈希,并通过代码示例展示了如何在Spring框架中使用RedisTemplate操作这些数据类型。
Redis5种数据类型
|
5月前
|
存储 NoSQL Java
深入理解Redis数据类型Hashes原理
本文深入分析了Redis中的hashes数据类型,这是一种用于存储行记录的数据结构,允许一个key下存储多条记录。
深入理解Redis数据类型Hashes原理
|
5月前
|
存储 NoSQL 算法
深入理解Redis数据类型Zset原理
本文深入探讨了Redis中的Zset(有序集合)数据类型,它是一种可以存储排序功能的集合,其中每个元素都具有一个浮点型的score属性,用于根据score进行排序。
深入理解Redis数据类型Zset原理
|
5月前
|
存储 NoSQL 算法
Redis6入门到实战------ 三、常用五大数据类型(列表(List)、集合(Set)、哈希(Hash)、Zset(sorted set))
这是关于Redis 6入门到实战的文章,具体内容涉及Redis的五大数据类型:列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset(sorted set))。文章详细介绍了这些数据类型的特点、常用命令以及它们背后的数据结构。如果您有任何关于Redis的具体问题或需要进一步的帮助,请随时告诉我。