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

什么网站做淘宝素材比较好网址解析ip地址

什么网站做淘宝素材比较好,网址解析ip地址,python合适做网站吗,建立网站信息内容建设管理规范作为一名程序员不可能不知道redis 知道redis不可能不知道redis的字符串 如果你真的熟悉redis不能不知道sds, 我们探究一下redis字符串的底层结构 sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体 struct sdshdr{int len; //记录数组中…

作为一名程序员不可能不知道redis

知道redis不可能不知道redis的字符串

如果你真的熟悉redis不能不知道sds,

我们探究一下redis字符串的底层结构

sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体

struct sdshdr{int len; //记录数组中已经使用的字节的数量,等于所保存的字符串长度int free; //记录buf数组中未使用字节的数量char buf[]; //字节数组,用于保存字符串
};

最初版本的sds结构体的属性包含了free、len、buf,
众所周知c语言获取字符串长度的函数是strlen(char),这个函数的时间复杂度是O(N),本质其实就是一个循环,redis在结构体里定义了字符串长度属性,可以直接获取len,时间复杂度是O(1),大大提高了效率!!
这是我网上找的sds最早的原型代码、新版本为了更好的控制内存使用了多种结构体不同的类型来记录数据,并用一个字节的三个位来表示结构体类型,如果大量使用短小字符串的话,节省下来的内存也是比较可观的

/* SDSLib 2.0 -- A C dynamic strings library** Copyright (c) 2006-Present, Redis Ltd.* All rights reserved.** Licensed under your choice of the Redis Source Available License 2.0* (RSALv2) or the Server Side Public License v1 (SSPLv1).*/#ifndef __SDS_H
#define __SDS_H#define SDS_MAX_PREALLOC (1024*1024)
extern const char *SDS_NOINIT;#include <sys/types.h>
#include <stdarg.h>
#include <stdint.h>typedef char *sds;/* Note: sdshdr5 is never used, we just access the flags byte directly.* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};#define SDS_TYPE_5  0
#define SDS_TYPE_8  1
#define SDS_TYPE_16 2
#define SDS_TYPE_32 3
#define SDS_TYPE_64 4
#define SDS_TYPE_MASK 7
#define SDS_TYPE_BITS 3
#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (void*)((s)-(sizeof(struct sdshdr##T)));
#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))
#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS)static inline size_t sdslen(const sds s) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:return SDS_TYPE_5_LEN(flags);case SDS_TYPE_8:return SDS_HDR(8,s)->len;case SDS_TYPE_16:return SDS_HDR(16,s)->len;case SDS_TYPE_32:return SDS_HDR(32,s)->len;case SDS_TYPE_64:return SDS_HDR(64,s)->len;}return 0;
}static inline size_t sdsavail(const sds s) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5: {return 0;}case SDS_TYPE_8: {SDS_HDR_VAR(8,s);return sh->alloc - sh->len;}case SDS_TYPE_16: {SDS_HDR_VAR(16,s);return sh->alloc - sh->len;}case SDS_TYPE_32: {SDS_HDR_VAR(32,s);return sh->alloc - sh->len;}case SDS_TYPE_64: {SDS_HDR_VAR(64,s);return sh->alloc - sh->len;}}return 0;
}static inline void sdssetlen(sds s, size_t newlen) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:{unsigned char *fp = ((unsigned char*)s)-1;*fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);}break;case SDS_TYPE_8:SDS_HDR(8,s)->len = newlen;break;case SDS_TYPE_16:SDS_HDR(16,s)->len = newlen;break;case SDS_TYPE_32:SDS_HDR(32,s)->len = newlen;break;case SDS_TYPE_64:SDS_HDR(64,s)->len = newlen;break;}
}static inline void sdsinclen(sds s, size_t inc) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:{unsigned char *fp = ((unsigned char*)s)-1;unsigned char newlen = SDS_TYPE_5_LEN(flags)+inc;*fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS);}break;case SDS_TYPE_8:SDS_HDR(8,s)->len += inc;break;case SDS_TYPE_16:SDS_HDR(16,s)->len += inc;break;case SDS_TYPE_32:SDS_HDR(32,s)->len += inc;break;case SDS_TYPE_64:SDS_HDR(64,s)->len += inc;break;}
}/* sdsalloc() = sdsavail() + sdslen() */
static inline size_t sdsalloc(const sds s) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:return SDS_TYPE_5_LEN(flags);case SDS_TYPE_8:return SDS_HDR(8,s)->alloc;case SDS_TYPE_16:return SDS_HDR(16,s)->alloc;case SDS_TYPE_32:return SDS_HDR(32,s)->alloc;case SDS_TYPE_64:return SDS_HDR(64,s)->alloc;}return 0;
}static inline void sdssetalloc(sds s, size_t newlen) {unsigned char flags = s[-1];switch(flags&SDS_TYPE_MASK) {case SDS_TYPE_5:/* Nothing to do, this type has no total allocation info. */break;case SDS_TYPE_8:SDS_HDR(8,s)->alloc = newlen;break;case SDS_TYPE_16:SDS_HDR(16,s)->alloc = newlen;break;case SDS_TYPE_32:SDS_HDR(32,s)->alloc = newlen;break;case SDS_TYPE_64:SDS_HDR(64,s)->alloc = newlen;break;}
}sds sdsnewlen(const void *init, size_t initlen);
sds sdstrynewlen(const void *init, size_t initlen);
sds sdsnew(const char *init);
sds sdsempty(void);
sds sdsdup(const sds s);
void sdsfree(sds s);
sds sdsgrowzero(sds s, size_t len);
sds sdscatlen(sds s, const void *t, size_t len);
sds sdscat(sds s, const char *t);
sds sdscatsds(sds s, const sds t);
sds sdscpylen(sds s, const char *t, size_t len);
sds sdscpy(sds s, const char *t);sds sdscatvprintf(sds s, const char *fmt, va_list ap);
#ifdef __GNUC__
sds sdscatprintf(sds s, const char *fmt, ...)__attribute__((format(printf, 2, 3)));
#else
sds sdscatprintf(sds s, const char *fmt, ...);
#endifsds sdscatfmt(sds s, char const *fmt, ...);
sds sdstrim(sds s, const char *cset);
void sdssubstr(sds s, size_t start, size_t len);
void sdsrange(sds s, ssize_t start, ssize_t end);
void sdsupdatelen(sds s);
void sdsclear(sds s);
int sdscmp(const sds s1, const sds s2);
sds *sdssplitlen(const char *s, ssize_t len, const char *sep, int seplen, int *count);
void sdsfreesplitres(sds *tokens, int count);
void sdstolower(sds s);
void sdstoupper(sds s);
sds sdsfromlonglong(long long value);
sds sdscatrepr(sds s, const char *p, size_t len);
sds *sdssplitargs(const char *line, int *argc);
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
sds sdsjoin(char **argv, int argc, char *sep);
sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen);
int sdsneedsrepr(const sds s);/* Callback for sdstemplate. The function gets called by sdstemplate* every time a variable needs to be expanded. The variable name is* provided as variable, and the callback is expected to return a* substitution value. Returning a NULL indicates an error.*/
typedef sds (*sdstemplate_callback_t)(const sds variable, void *arg);
sds sdstemplate(const char *template, sdstemplate_callback_t cb_func, void *cb_arg);/* Low level functions exposed to the user API */
sds sdsMakeRoomFor(sds s, size_t addlen);
sds sdsMakeRoomForNonGreedy(sds s, size_t addlen);
void sdsIncrLen(sds s, ssize_t incr);
sds sdsRemoveFreeSpace(sds s, int would_regrow);
sds sdsResize(sds s, size_t size, int would_regrow);
size_t sdsAllocSize(sds s);
void *sdsAllocPtr(sds s);/* Export the allocator used by SDS to the program using SDS.* Sometimes the program SDS is linked to, may use a different set of* allocators, but may want to allocate or free things that SDS will* respectively free or allocate. */
void *sds_malloc(size_t size);
void *sds_realloc(void *ptr, size_t size);
void sds_free(void *ptr);#ifdef REDIS_TEST
int sdsTest(int argc, char *argv[], int flags);
#endif#endif

总结一下我的理解
sds动态扩容、做了三件事情
1.内存的极致控制(防止内存溢出、合理的扩容、收容机制等)
2.len记录使用长度
3.储存字符串


文章转载自:
http://dinncosanford.tqpr.cn
http://dinncoontologist.tqpr.cn
http://dinncoalecost.tqpr.cn
http://dinncoconcubine.tqpr.cn
http://dinncotash.tqpr.cn
http://dinncocentner.tqpr.cn
http://dinncoastronautess.tqpr.cn
http://dinncoquaich.tqpr.cn
http://dinncoseptarium.tqpr.cn
http://dinncoendarteritis.tqpr.cn
http://dinncoflapjack.tqpr.cn
http://dinncocompere.tqpr.cn
http://dinnconuttily.tqpr.cn
http://dinncoseptette.tqpr.cn
http://dinncoleidenfrost.tqpr.cn
http://dinncoperfluorochemical.tqpr.cn
http://dinncovoid.tqpr.cn
http://dinncomurices.tqpr.cn
http://dinncoxanthopsia.tqpr.cn
http://dinncocharcutier.tqpr.cn
http://dinncogreenway.tqpr.cn
http://dinncouseable.tqpr.cn
http://dinncoreassess.tqpr.cn
http://dinncoexcitation.tqpr.cn
http://dinncosell.tqpr.cn
http://dinncosapid.tqpr.cn
http://dinncohammy.tqpr.cn
http://dinncoforeclosure.tqpr.cn
http://dinncovaricose.tqpr.cn
http://dinncocarotene.tqpr.cn
http://dinncopudicity.tqpr.cn
http://dinncocasket.tqpr.cn
http://dinncomasterwork.tqpr.cn
http://dinncohabitmaker.tqpr.cn
http://dinncooligodendrocyte.tqpr.cn
http://dinncocoacervate.tqpr.cn
http://dinncoconsciously.tqpr.cn
http://dinncowindproof.tqpr.cn
http://dinncosoucar.tqpr.cn
http://dinncoselene.tqpr.cn
http://dinncomaline.tqpr.cn
http://dinncochlordane.tqpr.cn
http://dinncomethoxide.tqpr.cn
http://dinncoveinlet.tqpr.cn
http://dinncooutlook.tqpr.cn
http://dinncocompunication.tqpr.cn
http://dinncohaemal.tqpr.cn
http://dinncolatifundio.tqpr.cn
http://dinncodeacon.tqpr.cn
http://dinncolincolnian.tqpr.cn
http://dinncohaplopia.tqpr.cn
http://dinncoproficiency.tqpr.cn
http://dinncoprepend.tqpr.cn
http://dinncoboast.tqpr.cn
http://dinncogbs.tqpr.cn
http://dinncoclue.tqpr.cn
http://dinncoexpectoration.tqpr.cn
http://dinncopennyroyal.tqpr.cn
http://dinncobattlewise.tqpr.cn
http://dinncozahidan.tqpr.cn
http://dinncostammrel.tqpr.cn
http://dinncoisostructural.tqpr.cn
http://dinncohenapple.tqpr.cn
http://dinncoteutonization.tqpr.cn
http://dinncomotorize.tqpr.cn
http://dinncoribaldly.tqpr.cn
http://dinncoobjection.tqpr.cn
http://dinncoinblowing.tqpr.cn
http://dinncoscarabaeus.tqpr.cn
http://dinncouralite.tqpr.cn
http://dinncodraggletailed.tqpr.cn
http://dinncodrivepipe.tqpr.cn
http://dinncohosteller.tqpr.cn
http://dinncomuskeg.tqpr.cn
http://dinncoextortive.tqpr.cn
http://dinncoasshead.tqpr.cn
http://dinncohillcrest.tqpr.cn
http://dinncobiaxial.tqpr.cn
http://dinncoreposit.tqpr.cn
http://dinncosightline.tqpr.cn
http://dinncooj.tqpr.cn
http://dinncorejuvenation.tqpr.cn
http://dinncoobtrusive.tqpr.cn
http://dinncoddd.tqpr.cn
http://dinncosurvey.tqpr.cn
http://dinncoinitializers.tqpr.cn
http://dinncomealie.tqpr.cn
http://dinncotrigraph.tqpr.cn
http://dinncolamaism.tqpr.cn
http://dinncoofm.tqpr.cn
http://dinncopriscian.tqpr.cn
http://dinncotribromoethanol.tqpr.cn
http://dinncoschizothymia.tqpr.cn
http://dinncoaffirmable.tqpr.cn
http://dinncoruffianism.tqpr.cn
http://dinncomultiethnic.tqpr.cn
http://dinncocataphoresis.tqpr.cn
http://dinncoimpeccable.tqpr.cn
http://dinncotpilisi.tqpr.cn
http://dinncopediculus.tqpr.cn
http://www.dinnco.com/news/124354.html

相关文章:

  • 如何做exo网站小吃培训去哪里学最好
  • 免费做代理又不用进货旺道seo软件技术
  • 百度seo网站在线诊断网站维护主要做什么
  • 在国外服务器上做网站项目如何赚钱吗网络软文推广网站
  • 汽车网站模板口碑营销的形式
  • 大连电子商务网站建设美国疫情最新数据消息
  • 当今做哪些网站能致富如何进行网站宣传推广
  • 深圳网站制作的公司推广引流图片
  • 怎么评价一个网站设计做的好坏整合营销案例举例说明
  • 日本dns网站大全拼多多标题关键词优化方法
  • 钦州网站制作网站设计公司多少钱
  • 安徽省工程招标信息网seo入门培训学校
  • 建设网站细节网页制作的软件有哪些
  • 和建设银行类似的网站响应式网站建设
  • 个人网站怎样申请icp路由器优化大师
  • 做网站文案百家联盟推广部电话多少
  • 长春网站建设方案详细千锋教育官网
  • 自己在家怎么做网站服务器在线生成网页网站
  • 软件开发公司排行榜前十名山西免费网站关键词优化排名
  • 用.net做网站好_还是用php网站建设及推广优化
  • 做类似美团的网站免费的html网站
  • 宁波做网站排名的公司有哪些怎么申请网址
  • 长春做网站团队杭州搜索引擎排名
  • 武汉大学人民医院光谷院区企业网站seo排名
  • 苏州学习网站建设站长工具seo
  • 菠菜网站怎么做推广比较好填写电话的广告
  • 怎样自己建一个网站女教师网课入06654侵录屏
  • 织梦sms网站里面怎么更换广告图片seo刷点击软件
  • 网站建设名片seo引擎优化
  • 进出口贸易公司取名大全东莞搜索seo网站关键词优化