首页 > 数据库 >你知道Redis的字符串是怎么实现的吗?

你知道Redis的字符串是怎么实现的吗?

时间:2023-03-17 10:56:56浏览次数:55  
标签:实现 Redis len 空间 内存 字符串 长度

Redis字符串的实现

Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。

Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。

Redis的字符串也会遵守C语言的字符串的实现规则,即最后一个字符为空字符。然而这个空字符不会被计算在len里头。

SDS的最厉害之处在于它的动态变化长度。

假设s1 只有5个空闲位子,后面需要追加' world' 6个字符,很明显是不够的。那咋办?Redis会做以下三个操作:

  1. 计算出大小是否足够
  2. 开辟空间至满足所需大小
  3. 开辟与已使用大小len相同长度的空闲free空间(如果len < 1M)开辟1M长度的空闲free空间(如果len >= 1M)

这个实现跟Java的列表List实现很相似。

Redis字符串的性能优势

  • 快速获取字符串长度
  • 避免缓冲区溢出
  • 降低空间分配次数提升内存使用效率

快速获取字符串长度

由于在SDS里存了已使用字符长度len,所以当想获取字符串长度时直接返回len即可,时间复杂度为O(1)。如果使用C语言的字符串的话它的字符串长度获取函数时间复杂度为O(n),n为字符个数,因为它是从头到尾(到空字符'\0')遍历相加。

避免缓冲区溢出

对一个C语言字符串进行strcat追加字符串的时候需要提前开辟需要的空间,如果不开辟空间的话可能会造成缓冲区溢出,而影响程序其他代码。

而对于Redis而言由于每次追加字符串时都会检查空间是否够用,所以不会存在缓冲区溢出问题。

每次追加操作前都会做如下操作:

  • 计算出大小是否足够
  • 开辟空间至满足所需大小

降低空间分配次数提升内存使用效率

字符串的追加操作会涉及到内存分配问题,然而内存分配问题会牵扯内存划分算法以及系统调用所以如果频繁发生的话影响性能,所以对于性能至上的Redis来说这是万万不能忍受的。

所以采取了以下两种优化措施:

  • 空间与分配:对于追加操作来说,Redis不仅会开辟空间至够用而且还会预分配未使用的空间(free)来用于下一次操作。至于未使用的空间(free)的大小则由修改后的字符串长度决定。
  • 惰性空间回收:Redis不会立即回收减少的部分,而是会分配给下一个需要内存的程序

 

参考:

 

标签:实现,Redis,len,空间,内存,字符串,长度
From: https://www.cnblogs.com/xfeiyun/p/17225695.html

相关文章

  • tcp实现聊天
    客户端1publicclassA{2publicstaticvoidmain(String[]args)throwsIOException{3Stringguo="你好啊";4intport=8888;5......
  • DOM4J解析xml代码实现
    1、DOM4J是第三方提供的工具类,使用前需要导入DOM4J的jar包下载地址:https://dom4j.github.iopublicclassDom4jDemo{publicstaticvoidmain(String[]args)th......
  • Winform中实现程序初始化时在桌面创建快捷方式并设置图标(获取ico图片资源路径)
    场景Winform程序在双击exe启动之后需要在桌面创建快捷方式,并且设置快捷方式的名称图标等。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、首先新建创建桌......
  • Mybatis:Mybatis注解实现动态SQL注意事项
    1.使用<script>声明动态SQL@Select("<script>"+"select*fromUser"+"<where>"+"id=#{id}"+"</where>"+"</script>")Usersel......
  • 聊聊「订单」业务的设计与实现
    目录一、背景简介二、订单业务1、订单体系2、流程管理2.1流程拆分2.2正向流程2.3逆向流程2.4调度与监控3、结构设计三、技术方案1、订单ID2、并行与异步3、超时问题4、......
  • 说一下 HashSet 的实现原理?
    HashSet是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75的HashMap。封装了一个HashMap对象来存储所有的集合元素,所有放入HashSet中的集合元素......
  • 小程序实现固定首行列表格
    数据可视化,数据报表一致是我比较头疼的问题,这几年一直找不到一个合适的工具.主要是编程这块并非是数据分析师的强项.从最初用Excel,到用Python,到用各种商业BI工......
  • 基于Pierre Dellacherie的俄罗斯方块-06Pierre Dellacherie算法实现
    #pragmaonce#include"Block.h"#include"Back.h"#include<limits.h>#defineLANDINGHEIGHT -45#defineROWSELIMINATED 34#defineROWTRANSITIONS -32#defin......
  • 实现Callable接口
    packageedu.wtbu;importorg.apache.commons.io.FileUtils;importjava.io.File;importjava.io.IOException;importjava.net.URL;importjava.util.concurrent.*;/*cal......
  • 使用几何光学实现空间相对定位(python+opencv)
    我从2019年3月份开始学习python,在有一定的基础后,我看到学校有一个物理实验竞赛:北京联合大学第十二届物理实验竞赛,其中有一个题目是空间定位,即利用物理原理,自行搭建实验......