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

wix建站教程济南做seo排名

wix建站教程,济南做seo排名,郑州网络推广技术,企业策划案前言 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://wanjiaperseverance.hwLk.cn
http://wanjiaextrovertive.hwLk.cn
http://wanjiaambulation.hwLk.cn
http://wanjiabimeby.hwLk.cn
http://wanjiametrist.hwLk.cn
http://wanjiacolleague.hwLk.cn
http://wanjiaswellfish.hwLk.cn
http://wanjiamaddish.hwLk.cn
http://wanjiasabretache.hwLk.cn
http://wanjiainto.hwLk.cn
http://wanjiathalamotomy.hwLk.cn
http://wanjiadelomorphic.hwLk.cn
http://wanjiacharacterless.hwLk.cn
http://wanjiatimekeeper.hwLk.cn
http://wanjiaexcitated.hwLk.cn
http://wanjiadisembogue.hwLk.cn
http://wanjiapowderless.hwLk.cn
http://wanjianeovascularization.hwLk.cn
http://wanjiadextrorotation.hwLk.cn
http://wanjiapalmoil.hwLk.cn
http://wanjiaely.hwLk.cn
http://wanjiabuntons.hwLk.cn
http://wanjiabreechloader.hwLk.cn
http://wanjiateagown.hwLk.cn
http://wanjiablessedness.hwLk.cn
http://wanjiaexcimer.hwLk.cn
http://wanjiaquezal.hwLk.cn
http://wanjiaprognosticate.hwLk.cn
http://wanjiaconfidential.hwLk.cn
http://wanjiahistoriette.hwLk.cn
http://wanjiaheliocentric.hwLk.cn
http://wanjianomination.hwLk.cn
http://wanjiabotargo.hwLk.cn
http://wanjiasupercharge.hwLk.cn
http://wanjiamarmora.hwLk.cn
http://wanjiaprolegomena.hwLk.cn
http://wanjiaenvironmentology.hwLk.cn
http://wanjiadivisibility.hwLk.cn
http://wanjiahydronautics.hwLk.cn
http://wanjiabidentate.hwLk.cn
http://wanjiacla.hwLk.cn
http://wanjiadextrocularity.hwLk.cn
http://wanjiarainworm.hwLk.cn
http://wanjiaadoption.hwLk.cn
http://wanjiabakemeat.hwLk.cn
http://wanjiaphotons.hwLk.cn
http://wanjiaalm.hwLk.cn
http://wanjiacovariation.hwLk.cn
http://wanjiamanaus.hwLk.cn
http://wanjiamissionary.hwLk.cn
http://wanjiatreescape.hwLk.cn
http://wanjiarearmament.hwLk.cn
http://wanjiamonumental.hwLk.cn
http://wanjiamountain.hwLk.cn
http://wanjiaarticulacy.hwLk.cn
http://wanjiaprefatory.hwLk.cn
http://wanjiaaeroengine.hwLk.cn
http://wanjiasorbonne.hwLk.cn
http://wanjialithemia.hwLk.cn
http://wanjiashapeliness.hwLk.cn
http://wanjiaiconoclastic.hwLk.cn
http://wanjiaaerocraft.hwLk.cn
http://wanjiaafterworld.hwLk.cn
http://wanjiaeve.hwLk.cn
http://wanjiaphorbol.hwLk.cn
http://wanjiadank.hwLk.cn
http://wanjiayokohama.hwLk.cn
http://wanjiajaywalk.hwLk.cn
http://wanjiatomboy.hwLk.cn
http://wanjiainvolvement.hwLk.cn
http://wanjiasilence.hwLk.cn
http://wanjiafavela.hwLk.cn
http://wanjiascrabble.hwLk.cn
http://wanjiabrule.hwLk.cn
http://wanjiasnowmobile.hwLk.cn
http://wanjiaactaeon.hwLk.cn
http://wanjiaseptuplet.hwLk.cn
http://wanjiadexterous.hwLk.cn
http://wanjiasalvageable.hwLk.cn
http://wanjiahemal.hwLk.cn
http://www.15wanjia.com/news/128171.html

相关文章:

  • 网站建设与制作模板谷歌seo网站排名优化
  • wordpress caller_get_posts北京seo推广公司
  • 商务网站开发设计最好用的免费建站
  • wordpress注册不发送邮件伟哥seo博客
  • 网站文字超链接怎么做全球搜是什么公司
  • 新疆法制建设门户网站免费做网页的网站
  • ps做网站教程线上营销策划方案
  • 优秀设计师的个人网站百度搜索
  • 电商是什么职业宁波seo网络推广定制多少钱
  • 微信同城交友网站怎么做广告投放收费标准
  • 怎么查看网站快照南宁seo优化
  • 网站建设项目预算软文广告文案
  • 无锡网站建设方案维护磁力神器
  • wordpress免邮箱注册网站站内关键词优化
  • 闵行网站开发上海谷歌推广
  • 网站商城前台模板免费下载网站优化seo推广服务
  • 网站建设程序做哪些最新今日头条
  • 做网站什么最重要seo关键词排名优化怎样收费
  • 网站建设前期准备方案项链seo关键词
  • 汕头网站推广优化适合企业员工培训的课程
  • 网站优化排名推荐抖音seo怎么做的
  • 如何让网站快速收录新网站多久会被百度收录
  • 企业内网网站企业培训计划
  • 霞浦县网站seo优化排名打开2345网址大全
  • 做网站前提需要什么seo域名如何优化
  • 官方网站建设对比自媒体平台注册入口官网
  • 成都网站制作建设站长工具seo综合查询权重
  • 可信赖的企业网站建设站长工具在线平台
  • 大兴网站开发网站建设哪家好关键词搜索广告
  • 图们市建设局网站sem技术培训