Redis存储结构细节拆解,跟着一步步慢慢弄懂redis到底咋回事
- 问答
- 2026-01-16 20:41:22
- 1
要弄懂Redis是怎么回事,我们可以把它想象成一个超级高效、专门存放各种数据的“大柜子”,这个柜子不像我们家里那种只有一层隔板的柜子,它内部有各种不同形状、不同用途的“小抽屉”和“格子”,专门用来放不同类型的东西,这样找起来、用起来就特别快,下面我们就一步步打开这个柜子,看看里面到底是怎么安排的。
我们得知道,Redis最核心的东西是它的“键值对”模型,这就像我们给每个存放的东西贴上一个独一无二的标签(这就是“键”),然后通过这个标签就能快速找到东西本身(这就是“值”),我把我的“姓名”这个标签,对应到“张三”这个值上,这只是个最简单的例子,Redis的强大之处在于,这个“值”可以不仅仅是简单的数字或字符串,它可以是好几种更复杂的结构,这就是Redis的“数据结构”,也是它那个大柜子里各种不同抽屉的由来。
我们来一个个看这些神奇的“抽屉”:
字符串(String)抽屉:这是最基础的格子。 它就用来放一些最基本的东西,比如一个文本字符串、一个数字、甚至是一张图片的二进制数据,你可以把它想象成一个小方盒,里面就放一样东西,它的操作也很直接,存”和“取”,可以用来缓存一个网页的HTML内容,或者记录用户的登录状态令牌。
哈希(Hash)抽屉:这个抽屉像是一个带有很多小格子的收纳盒。
它特别适合存放一个对象的多个属性,要存一个用户的信息,如果用String,你可能得为用户的姓名、年龄、城市分别存三个键,很麻烦,但用Hash抽屉,你只需要一个总的键,user:1001”,然后在这个键下面,可以存放多个字段和值:name->"李四",age->"28",city->"北京",这样,要获取或修改用户的某个属性就非常方便和高效,不用把整个对象都取出来。
列表(List)抽屉:这个抽屉像一个只能从两头开口的管道。 你可以从左边推进去一个元素,也可以从右边推进去一个元素;同样,可以从左边或右边弹出一个元素,这就让它特别适合做那种有顺序的、像排队一样的操作,最典型的应用就是“消息队列”:生产者从列表左边放入消息,消费者从列表右边取出消息进行处理,它也可以用来存储用户的最新动态列表。
集合(Set)抽屉:这个抽屉像个大箩筐,里面放的东西是无序的,但最关键的是,筐里的每个东西都是唯一的,不允许重复。 你可以往筐里扔东西,也可以判断某个东西在不在筐里,还可以很方便地找出两个筐(两个集合)之间的共同部分(交集)、不同部分(差集)或者合并起来(并集),这个特性让它在“标签系统”、“共同好友”等场景下大显身手,给一篇文章打上“科技”、“编程”、“Redis”三个标签,其实就是把文章ID分别放入这三个标签对应的Set抽屉里。
有序集合(Sorted Set / ZSet)抽屉:这是最复杂但也非常强大的一个抽屉。 它结合了Set和List的特点,像Set一样,里面的每个元素都是唯一的;它为每个元素都关联了一个分数(score),然后根据这个分数的大小来给元素排序,这样,你既可以快速判断一个元素是否存在(Set的特性),又可以按照分数范围来获取元素,获取分数最高的前10名”,排行榜功能就是它的经典用法,比如游戏里的玩家积分榜。
Redis是怎么在内部管理这些“抽屉”里的数据的呢?这里就要提到一个关键点(根据参考资料《Redis设计与实现》中提到,Redis使用了自定义的数据结构来实现这些类型),那个最简单的String类型,Redis并不是傻傻地直接存储,而是采用了一个叫“简单动态字符串(SDS)”的结构,这个结构能更高效地处理字符串长度的变化,而对于哈希类型,在数据量小的时候,Redis会使用一种更节省内存的“压缩列表”方式存储,只有当数据量变大时,才会转为真正的哈希表结构,这是一种权衡性能和空间的优化策略。
所有这些“键”(也就是我们贴的标签)和它们对应的“值”(各种结构的抽屉),都被Redis放在一个巨大的“键空间字典”里,你可以把这个字典想象成整个柜子的总索引,通过这个索引,Redis能用非常快的速度(时间复杂度接近O(1))定位到任何一个键和它对应的值存储在内存的哪个位置。
Redis之所以又快又灵活,就是因为它不是一个简单的“键-字符串”柜子,而是一个精心设计了多种“数据结构抽屉”的智能存储系统,你根据你要存放的数据特点(是否需要顺序?是否允许重复?是否是多个属性?),选择最合适的那个抽屉,就能最大限度地发挥Redis的性能优势,理解这些“抽屉”的用途和特性,就是弄懂Redis怎么回事的关键第一步。

本文由邝冷亦于2026-01-16发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/81998.html
