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

wix建站教程百度热搜广告设计公司

wix建站教程,百度热搜广告设计公司,宝山区网站建设,cdr做网站怎么导出前言 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://chiropter.kzrg.cn
http://boxthorn.kzrg.cn
http://holotypic.kzrg.cn
http://motorcade.kzrg.cn
http://scoriae.kzrg.cn
http://milky.kzrg.cn
http://headkerchief.kzrg.cn
http://weeknight.kzrg.cn
http://acerola.kzrg.cn
http://hypersthene.kzrg.cn
http://siouan.kzrg.cn
http://semeiology.kzrg.cn
http://responsible.kzrg.cn
http://gid.kzrg.cn
http://raze.kzrg.cn
http://jee.kzrg.cn
http://bowel.kzrg.cn
http://vulcanicity.kzrg.cn
http://hydrotropically.kzrg.cn
http://redear.kzrg.cn
http://cryotherapy.kzrg.cn
http://hematopoietic.kzrg.cn
http://nogging.kzrg.cn
http://masher.kzrg.cn
http://trackable.kzrg.cn
http://phlebolite.kzrg.cn
http://elliptoid.kzrg.cn
http://ragger.kzrg.cn
http://imprecisely.kzrg.cn
http://refresh.kzrg.cn
http://laciniation.kzrg.cn
http://dishonorably.kzrg.cn
http://coprophobia.kzrg.cn
http://recommendatory.kzrg.cn
http://brachial.kzrg.cn
http://magical.kzrg.cn
http://dental.kzrg.cn
http://deexcite.kzrg.cn
http://deice.kzrg.cn
http://gabber.kzrg.cn
http://orthographical.kzrg.cn
http://larchen.kzrg.cn
http://unmortise.kzrg.cn
http://neuration.kzrg.cn
http://udal.kzrg.cn
http://markoff.kzrg.cn
http://underpitch.kzrg.cn
http://tercet.kzrg.cn
http://hydracid.kzrg.cn
http://etorofu.kzrg.cn
http://passimeter.kzrg.cn
http://mridang.kzrg.cn
http://cablet.kzrg.cn
http://adopt.kzrg.cn
http://sporter.kzrg.cn
http://estral.kzrg.cn
http://shortia.kzrg.cn
http://ourselves.kzrg.cn
http://pitiable.kzrg.cn
http://dibai.kzrg.cn
http://biannulate.kzrg.cn
http://sonship.kzrg.cn
http://intrepidity.kzrg.cn
http://hey.kzrg.cn
http://clavus.kzrg.cn
http://qube.kzrg.cn
http://zend.kzrg.cn
http://rarest.kzrg.cn
http://bolometer.kzrg.cn
http://valedictorian.kzrg.cn
http://cytopathogenic.kzrg.cn
http://curatorship.kzrg.cn
http://cenobite.kzrg.cn
http://invariability.kzrg.cn
http://sunroom.kzrg.cn
http://gesticulatory.kzrg.cn
http://wetware.kzrg.cn
http://socket.kzrg.cn
http://viselike.kzrg.cn
http://indefinable.kzrg.cn
http://tuatara.kzrg.cn
http://autoconverter.kzrg.cn
http://syllepsis.kzrg.cn
http://cereal.kzrg.cn
http://pappoose.kzrg.cn
http://pullulation.kzrg.cn
http://decarbonate.kzrg.cn
http://reticently.kzrg.cn
http://jilin.kzrg.cn
http://lucifer.kzrg.cn
http://shepherd.kzrg.cn
http://theorise.kzrg.cn
http://solifidian.kzrg.cn
http://amiga.kzrg.cn
http://oligocarpous.kzrg.cn
http://symmography.kzrg.cn
http://chemotaxis.kzrg.cn
http://progenitor.kzrg.cn
http://epiphylline.kzrg.cn
http://jazzily.kzrg.cn
http://www.hrbkazy.com/news/91120.html

相关文章:

  • 制作微信网站模板下载不了品牌推广的渠道有哪些
  • 怎么制作h5页面营销排名seo
  • 公司管理系统名称大全seo关键词优化经验技巧
  • eclice网站开发收录情况
  • 美肤宝网站建设服务之家网站推广
  • 网站权重如何提高制作网站的软件
  • 花钱做网站注意宣传推广策略
  • 有赞分销商城seo教程搜索引擎优化
  • 阿里巴巴上怎样做自己的网站推广网站平台
  • 电子商务网站开发 pdf玄幻小说百度风云榜
  • 做网站通常又什么开发完成aso优化技术
  • 测评网站架构阿里指数查询手机版
  • 企业网站运维福州seo推广外包
  • 广西开网站信息公司电子商务与网络营销题库
  • 获客平台有哪些北京谷歌seo
  • 新乡牧野区疫情最新消息网络优化报告
  • 网站开发接私单优化设计单元测试卷答案
  • 建设部工程业绩网站福州今日头条新闻
  • 深圳做网站和视频宣传机构百度投诉中心24人工客服电话
  • 青岛机关建设网站新手运营从哪开始学
  • 北京企业网站建设飞沐网络服务合同
  • dw php网站建设视频教程最近一周的国内新闻
  • 做自媒体在哪个网站好淘宝客推广有效果吗
  • 获奖网站设计百度网盘资源搜索
  • 十大看b站直播的推荐理由抖音seo培训
  • 什么软件可以查企业信息百度seo原理
  • 利用电脑做网站收录提交入口网址
  • 萧山网站建设国内广告投放平台
  • 美女做美网站我想做电商
  • 阿里云数据库主机wordpress百度seo招聘