Redis为什么那么快?

Redis为什么那么快?

基于内存实现

Redis是基于内存的数据库,这没什么好BB的。

数据结构的高效设计

以SDS为例,O(1)获得字符串长度,空间预分配和惰性空间释放使得减少分配内存消耗得性能,Redis在数据结构上的设计花了很多心思。

再比如说双端链表和压缩链表,我们知道其实双端链表这个结构其实是需要保存首节点和尾节点以及各种指针数据的,指针在反复申请和释放的过程也容易导致内存碎片化,如果数据不大的情况就没有必要了,数据才一个字节,指针都好几个字节了,所以又出现了压缩链表。

压缩链表和整数数组都是尽量少的使用内存的设计方式,虽然找元素的时间复杂度是o(n),但是元素不多且元素不大的情况还是很适用的。

其他的比如说跳表,一般情况下我们使用链表找元素也是循环遍历的,跳表的时间复杂度logn就快很多。

多路复用IO

Redis虽然是单线程的,但是可以使用I/O多路复用程序同时监听多个套接字

合理的数据编码
  • 根据字符串的长度及元素的个数适配不同的编码格式。

对于每一种数据类型来说,底层的支持可能是多种数据结构,什么时候使用哪种数据结构,这就涉及到了编码转化的问题。

String:存储数字的话,采用int类型的编码,如果是非数字的话,采用 raw 编码;

List:字符串长度及元素个数小于一定范围使用 ziplist 编码,任意条件不满足,则转化为 linkedlist 编码;

Hash:hash 对象保存的键值对内的键和值字符串长度小于一定值及键值对;

Set:保存元素为整数及元素个数小于一定范围使用 intset 编码,任意条件不满足,则使用 hashtable 编码;

Zset:zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意条件不满足,则使用 skiplist 编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值