博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis源码分析-1 字符串处理
阅读量:7226 次
发布时间:2019-06-29

本文共 1071 字,大约阅读时间需要 3 分钟。

hot3.png

redis是一个键值对的数据库,说道key/value,很大程度就涉及到字符串的处理,redis是用c语言开发的,c语言自带的字符串进行字符串拓容,剪断,查看字符串长度等方面的时间复杂度均为n,这对一个经常要修改长度的字符串来说是一件很恐怖的事情,一个很简单的操作需要耗费的时间有点儿多了,这儿redis做了自己的优化。redis存储字符串用的是一个这样的结构

struct sdshdr { int len;//buf已占用长度 int free;//buf剩余可用长度 char buf[]; //实际上保留字符串的地方};
sds sdsMakeRoomFor( sds s, size_t addlen // 需要增加的空间长度){struct sdshdr *sh, *newsh;size_t free = sdsavail(s);size_t len, newlen;// 剩余空间可以满足需求,无须扩展if (free >= addlen) return s;sh = (void*) (s-(sizeof(struct sdshdr)));// 目前 buf 长度len = sdslen(s);// 新 buf 长度newlen = (len+addlen);// 如果新 buf 长度小于 SDS_MAX_PREALLOC 长度// 那么将 buf 的长度设为新 buf 长度的两倍if (newlen < SDS_MAX_PREALLOC) newlen *= 2;else newlen += SDS_MAX_PREALLOC;// 扩展长度newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1);if (newsh == NULL) return NULL;newsh->free = newlen - len;return newsh->buf;}

默认初始化的时候len = 0, free = 0, buf为空,追加字符串的时候,首先判断添加的字符串的长度是否大于free,如果不大于free,就直接在buf里头填充。否则就要进行拓展,拓展的规则是,新的字符串的长度小于10241024的话,就将字符串分配2倍与所需的长度,否着分配新的长度+10241024,这就是redis在这个地方的优化

转载于:https://my.oschina.net/lirongwei/blog/196037

你可能感兴趣的文章
android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
查看>>
iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
查看>>
诡异!React stopPropagation失灵
查看>>
Python_OOP
查看>>
个人博客开发系列:评论功能之GitHub账号OAuth授权
查看>>
mongodb--安装和初步使用教程
查看>>
ES6简单总结(搭配简单的讲解和小案例)
查看>>
text-decoration与color属性
查看>>
如何使用Mybatis第三方插件--PageHelper实现分页操作
查看>>
PyCharm搭建GO开发环境(GO语言学习第1课)
查看>>
Android交互
查看>>
提醒我喝水chrome插件开发指南
查看>>
列表数据转树形数据
查看>>
Java新版本的开发已正式进入轨道,版本号18.3
查看>>
从零开始的webpack生活-0x009:FilesLoader装载文件
查看>>
在electron中实现跨域请求,无需更改服务器端设置
查看>>
gitlab-ci配置详解(一)
查看>>
听说你叫Java(二)–Servlet请求
查看>>
案例分享〡三拾众筹持续交付开发流程支撑创新业务
查看>>
FreeWheel业务系统微服务化过程经验分享
查看>>