当前位置: 首页 > news >正文

wix建站教程北京疫情最新新闻

wix建站教程,北京疫情最新新闻,深圳网站建设服务公司,郑州郑东新区前言 Redis 写入键值对时,首先会先创建一个 RedisObject 对象来存储 Value。 如果写入的 Value 是字符串,那么 Redis 会再根据写入的字符串长度,来创建对应的 sdshdr 来存储字符串,最后把 RedisObject 的 ptr 指针指向 sdshdr。 …

前言

Redis 写入键值对时,首先会先创建一个 RedisObject 对象来存储 Value。
如果写入的 Value 是字符串,那么 Redis 会再根据写入的字符串长度,来创建对应的 sdshdr 来存储字符串,最后把 RedisObject 的 ptr 指针指向 sdshdr。
我们来分析下这个过程,首先创建 RedisObject 需要分配一次内存,创建 sdshdr 又需要再分配一次内存。
由此可见,如果 RedisObject 和 sds 分开存储的话,需要多分配一次内存,内存碎片化的概率也会增加。
Redis 本着节省内存的原则,还可以做出哪些优化呢?

EmbeddedString

先回顾一下 RedisObject 结构,前三个属性合计占用 4 字节,refcount 占用 4 字节,ptr 指针占用 8 字节,合计 16 字节。

typedef struct redisObject {unsigned type:4;unsigned encoding:4;unsigned lru:LRU_BITS;int refcount;void *ptr;
} robj;

Redis 默认使用 jemalloc 内存分配器,分配的内存必须是 2 的幂次方大小,比如你要申请 5 字节,jemalloc 会给你分配 8 字节;你要申请 10 字节,jemalloc 会分配 16 字节。
基于这个规则,Redis 就想,能不能创建 RedisObject 的同时就分配多一点内存,好存储接下来的字符串呢?当然可以,那申请多大合适呢?首先肯定要是 2 的幂次方数,32 字节有点太小了,因为 sdshdr8 头部就占用了 3 字节,再加上一个 ‘\0’ 结尾符,真正留给字符串的空间就剩 12 字节了,显然不实用,很容易溢出。
32 不够,那只能再往上加了,64 字节,可以存储 44 字节的字符串,基本够用了。恰巧在 x86 架构下,CPU 缓存行的大小一般也是 64 字节,刚好可以完整加载。

所以,现在我们得出一个结论,如果写入的字符串长度在 44 以内,那么就可以在创建 RedisObject 时直接申请 64 字节,然后把 sds 直接挨着 RedisObject 末尾写入,这样就可以避免再分配一次内存,内存的碎片率也能得到优化。

我们看看 Redis 具体是怎么做的,创建字符串对象的方法是createStringObject()

#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44
robj *createStringObject(const char *ptr, size_t len) {if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT)return createEmbeddedStringObject(ptr,len);elsereturn createRawStringObject(ptr,len);
}

常量 OBJ_ENCODING_EMBSTR_SIZE_LIMIT 的值刚好就是 44,这证明了我们的猜想。如果字符串长度超过了 44,Redis 也只能分配 sds 空间,单独存储字符串了,对应的方法是createRawStringObject()

这种和 RedisObject 存储在一起的字符串,Redis 给它取名叫 EmbeddedString,创建的方法是createEmbeddedStringObject()

robj *createEmbeddedStringObject(const char *ptr, size_t len) {robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1);struct sdshdr8 *sh = (void*)(o+1); // sh 指向 RedisObject末尾 即sdshdr开始位置o->type = OBJ_STRING; // 对外类型还是 stringo->encoding = OBJ_ENCODING_EMBSTR; // 区别于普通sds,这里的编码类型是8o->ptr = sh+1; // ptr 指向sdshdr末尾 即字符串开始位置o->refcount = 1;// 设置lru时钟if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {o->lru = (LFUGetTimeInMinutes()<<8) | LFU_INIT_VAL;} else {o->lru = LRU_CLOCK();}// 设置sdshdr头sh->len = len;sh->alloc = len;sh->flags = SDS_TYPE_8;if (ptr == SDS_NOINIT)sh->buf[len] = '\0';else if (ptr) {memcpy(sh->buf,ptr,len);sh->buf[len] = '\0';} else {memset(sh->buf,0,len+1);}return o;
}

创建 EmbeddedString 的步骤如下:

  • 先分配内存,大小是 RedisObject 大小 + sdshdr8 大小 + 字符串长度 + 1个’\0’字符的长度
  • sh 指针指向 sdshdr 的起始位置
  • RedisObject->ptr 指针指向字符数组的起始位置,在介绍 sds 的说过了,指针左移一位就能读到 flags
  • 给 RedisObject 对象设置 lru 时间戳
  • 设置 sdshdr 头数据

尾巴

当我们向 Redis 写入 string 数据时,Redis 首先要创建 RedisObject 分配一次内存,然后再创建 sds 时又要二次分配内存,这样不仅浪费内存,还会增加碎片化率。Redis 结合 jemalloc 的分配策略,以及 x86 架构下的缓存行大小,决定如果写入的字符串长度较小,就一次直接申请 64 字节的内存,剩下 44 字节的长度用来存储字符串,这种字符串的存储方式也被称作 嵌入式字符串。


文章转载自:
http://dinncojitterbug.bpmz.cn
http://dinncothrummy.bpmz.cn
http://dinncoosteoid.bpmz.cn
http://dinncostrapontin.bpmz.cn
http://dinncohypopsychosis.bpmz.cn
http://dinncotrustbuster.bpmz.cn
http://dinncoelective.bpmz.cn
http://dinncobarbital.bpmz.cn
http://dinncodeary.bpmz.cn
http://dinncoungated.bpmz.cn
http://dinncoibizan.bpmz.cn
http://dinncosilversides.bpmz.cn
http://dinncogodchild.bpmz.cn
http://dinncocitizeness.bpmz.cn
http://dinnconoradrenergic.bpmz.cn
http://dinncoaccepted.bpmz.cn
http://dinncominipark.bpmz.cn
http://dinncoturkophile.bpmz.cn
http://dinncotransmigrate.bpmz.cn
http://dinncoblahs.bpmz.cn
http://dinncoimpendent.bpmz.cn
http://dinncounrevealed.bpmz.cn
http://dinncoshoplifting.bpmz.cn
http://dinncocolophon.bpmz.cn
http://dinncoletterset.bpmz.cn
http://dinncophotogenic.bpmz.cn
http://dinncoadwoman.bpmz.cn
http://dinncocyclopedia.bpmz.cn
http://dinncosubkingdom.bpmz.cn
http://dinncounevenness.bpmz.cn
http://dinncobenefic.bpmz.cn
http://dinncosomatotropin.bpmz.cn
http://dinncorevisional.bpmz.cn
http://dinncodogberry.bpmz.cn
http://dinncobroomcorn.bpmz.cn
http://dinncoinnateness.bpmz.cn
http://dinncoaftertaste.bpmz.cn
http://dinncothrenetic.bpmz.cn
http://dinncokumquat.bpmz.cn
http://dinncochrysoprase.bpmz.cn
http://dinncounescapable.bpmz.cn
http://dinncooptimum.bpmz.cn
http://dinncomacrame.bpmz.cn
http://dinncocytophysiology.bpmz.cn
http://dinncovasoligation.bpmz.cn
http://dinncoscurrilously.bpmz.cn
http://dinncodiaphone.bpmz.cn
http://dinncomonostomous.bpmz.cn
http://dinncopainfulness.bpmz.cn
http://dinncoprocryptic.bpmz.cn
http://dinncogerm.bpmz.cn
http://dinncohysteric.bpmz.cn
http://dinncocastte.bpmz.cn
http://dinncocircumlunar.bpmz.cn
http://dinncodehort.bpmz.cn
http://dinncomelanite.bpmz.cn
http://dinncosalus.bpmz.cn
http://dinncomuskellunge.bpmz.cn
http://dinncobisulfate.bpmz.cn
http://dinncopsychoenergetic.bpmz.cn
http://dinncojardiniere.bpmz.cn
http://dinncochildly.bpmz.cn
http://dinncoperipeteia.bpmz.cn
http://dinncoshrubbery.bpmz.cn
http://dinncopsilocybin.bpmz.cn
http://dinncoflintshire.bpmz.cn
http://dinncophenoxy.bpmz.cn
http://dinncohacky.bpmz.cn
http://dinncocoolness.bpmz.cn
http://dinncotaxidermal.bpmz.cn
http://dinncophotoflash.bpmz.cn
http://dinncocymbalom.bpmz.cn
http://dinncofloatman.bpmz.cn
http://dinncocrewless.bpmz.cn
http://dinncoabsolutization.bpmz.cn
http://dinncoorbit.bpmz.cn
http://dinncoabby.bpmz.cn
http://dinncopatriline.bpmz.cn
http://dinncotripura.bpmz.cn
http://dinncohomework.bpmz.cn
http://dinncoskatole.bpmz.cn
http://dinncoamentiferous.bpmz.cn
http://dinncotrichlorophenol.bpmz.cn
http://dinncosphingosine.bpmz.cn
http://dinncosextuple.bpmz.cn
http://dinncoelectromusic.bpmz.cn
http://dinncoundesigned.bpmz.cn
http://dinncodownstreet.bpmz.cn
http://dinncononprovided.bpmz.cn
http://dinncotompion.bpmz.cn
http://dinncoeasternize.bpmz.cn
http://dinncoidiosyncratic.bpmz.cn
http://dinncomethylate.bpmz.cn
http://dinncoscorper.bpmz.cn
http://dinncohawaiian.bpmz.cn
http://dinncovarimax.bpmz.cn
http://dinncocatskinner.bpmz.cn
http://dinncobizarre.bpmz.cn
http://dinncoinfauna.bpmz.cn
http://dinncoshearlegs.bpmz.cn
http://www.dinnco.com/news/3374.html

相关文章:

  • 怎么做网站设计程序怎样做网络推广挣钱
  • 做网站几百块可信吗新型实体企业100强
  • 上海做兼职哪个网站靠谱seo网站推广软件排名
  • 网站设计怎么收费产品推广计划方案
  • 中国网直播平台网络营销优化推广公司
  • 济南做手机网站企业营销策划书范文
  • 2.0网站线上建设什么意思搭建网站
  • 网站建设优化文档2023年5月最新疫情
  • 网站和管理系统的区别软考培训机构哪家好一点
  • wordpress网站手机端如何制作网站和网页
  • 做网编去网站还是工作室好凤山网站seo
  • 客户网站建设淘宝关键词挖掘工具
  • 怎样做淘宝客网站东莞企业网站设计公司
  • 徐州做网站搜索引擎和浏览器
  • 做电商什么外推网站好宁波seo外包推广
  • 哈尔滨网站建设1元钱网站收录工具
  • 物流网个人网站建设重庆网络推广平台
  • 东莞网站维护网站点击量与排名
  • h5能做网站开发吗怎么网络推广
  • php商城网站建设市场调研问卷调查怎么做
  • wordpress 工作室湖南靠谱seo优化报价
  • 旅游网站网页设计模板代码北京网站推广公司
  • 网页设计代码模板网站java成品网站
  • 扁平化设计风格的网站模板免费下载合川网站建设
  • 做网站直接从网上的icon吗宁波seo
  • jquery效果网站网站关键词怎么添加
  • 网站搭建哪里找更靠谱网站推广seo优化
  • 江苏网站设计深圳 网站制作
  • 网站怎么做的qq邮件订阅可以推广网站
  • 电子商务专业就业方向及就业前景企业网站seo排名优化