Redis 基础数据结构

概述

Redis包括5种基础数据结构,分别是string、list、hash、set和zset。

string

内部结构

底层是用字符数组表示,类似于Java ArrayList,是可以动态修改的,采用预分配冗余空间的方式减少内存频繁分配,如当字符串长度小于1MB时,加倍扩容;当长度大于1MB时,每次扩1MB,最大长度是512MB。
如果key-value的value是整数,那么是可以进行自增操作,范围在signed long的最大值和最小值。

应用

string 常用来缓存信息,将对象信息JSON序列化成字符串,之后存储到Redis作缓存,取数据经历反序列化的过程。

list

内部结构

相当于LinkedList,是链表而不是数组,插入和删除非常快,但是查询就比较慢了。
在列表元素较少时,使用一块连续的内存存储,这个结构体叫做ziplist,即压缩列表,将所有元素紧挨着存储,分配连续的内存空间,当数据量较大时使用quicklist,即使用链表和ziplist结合来组成quicklist,使用双向指针串起来,既可以快速插入和删除,又不会浪费内存空间。

应用

list被用来做异步队列使用,将需要处理的任务序列化成字符串,存储到list,再开启新的线程从list轮询取任务进行处理。

Hash

内部结构

相当于HashMap,使用数组+链表的结构,不过Redis的Hash只能存储字符串,另外rehash的方式不同,Java的rehash是一次性全部rehash,而Redis是采用渐进式rehash策略,即在rehash时同时保留新旧两个hash,查询时会同时查询,在后续的定时任务和hash操作时会逐渐的将旧hash内容迁移到新hash中,当迁移完成了就使用新的hash了。

应用

hash结构的存储消耗是要高于string的,到底是用hash还是string视具体情况而定。

set

内部结构

相当于HashSet,内部键值对是无序、唯一的。

应用

用于去重的功能。

zset

内部结构

相当于SortedSet和HashMap的结合体,一方面是个set保证value的唯一性,另一方面为每个value创建一个score,根据score为value排序,内部使用跳表来实现。

跳跃列表

跳表类似于公司的组织结构,最下面一层所有的元素都会串起来,然后每隔几个元素都会选出一个代表,再将代表使用同样的逻辑向上选举,最后形成金字塔结构。
跳表中的元素可能同时处于L0、L1、L2层,可以在不同的层次之间跳跃。
定位插入点时,先在顶层定位,之后一直查询到最后层找到合适的节点。
跳表采用一个随机策略决定新元素可以到第几层:
位于L0层的概率是100%
位于L1层的概率是50%
位于L2层的概率是25%
以此类推

应用

如用来存储文章的关注用户列表,value是关注者的ID,score是关注时间,那么就可以按关注时间进行排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值