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

中小型门户网站南宁正规的seo费用

中小型门户网站,南宁正规的seo费用,宽带办理什么套餐最划算,公司和个人均不能备案论坛类网站前言 Redis 是一个基于内存的,以 Key-Value 形式存储数据的 NoSQL 数据库。 相较于其它 NoSQL 数据库,Redis 提供了更丰富的数据类型和 API,开发者可以基于 Redis 实现数据缓存、消息队列、分布式锁等场景。 Redis 底层用一个全局哈希表来存…

前言

Redis 是一个基于内存的,以 Key-Value 形式存储数据的 NoSQL 数据库。
相较于其它 NoSQL 数据库,Redis 提供了更丰富的数据类型和 API,开发者可以基于 Redis 实现数据缓存、消息队列、分布式锁等场景。

Redis 底层用一个全局哈希表来存储所有的键值对,Value 是一个指针,指向 Key 对应的数据对象。
Redis 服务端在执行数据处理命令时,首先要检查命令和操作的对象类型是否匹配,例如调用 GET 命令处理 Hash 对象,Redis 就会返回一个错误信息:

> HSET hash_key name Lisa
(integer) 1
> get hash_key
(error) WRONGTYPE Operation against a key holding the wrong kind of value

由此可见,Redis 首先要能根据 Key 获取到 Value 的数据类型,最简单的方式就是用一个结构体来对 Value 指向的底层数据结构做一个描述封装,这个结构体就是 RedisObject。

RedisObject

源码中对 RedisObject 结构体的定义如下:

typedef struct redisObject {unsigned type:4;unsigned encoding:4;unsigned lru:LRU_BITS;int refcount;void *ptr;
} robj;
属性长度说明
type4 Bit对外的对象类型 例如:string list hash
encoding4 Bit对象的编码类型 例如:ziplist skiplist intset
lru24 Bit对象最近一次访问的时间戳 用于LRU缓存淘汰
refcount4 Byte对象引用次数
ptr8 Byte指向底层数据结构的指针

type、encoding、lru 三个属性后面都有一个冒号跟着一个数值,这是 C 语言里的位域定义法,目的是节省内存空间。当一个变量占用不了所有 Bit 时,就可以将其划分成多个位域,每个位域占用的 Bit 数称作 位宽。这里 type 和 encoding 的位宽都是 4,lru 的位宽是 24,合在一起就是 32 Bit,即 4 个字节。

下面分别介绍各个属性的作用。

type
type 表示 RedisObject 对外的数据类型,常用类型有以下五种,大家都很熟悉了。

#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */

encoding
encoding 表示 RedisObject 底层的编码类型,即使是同一种数据类型,也可以用不同的编码类型来实现。例如:hash 既可以用 哈希表实现,也可以用 ziplist 实现。
目前的编码类型有以下十一种:

#define OBJ_ENCODING_RAW 0     /* Raw representation */
#define OBJ_ENCODING_INT 1     /* Encoded as integer */
#define OBJ_ENCODING_HT 2      /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */

根据 type 和 encoding 俩属性,Redis 就知道 ptr 指针指向的具体数据类型了,也就知道该如何访问对象了。

lru
lru 代表对象最近一次访问的时间戳,Redis 每次访问对象,都会写入最新的时间戳,当内存资源不够时,Redis 会随机采样一批对象,然后比较 lru 字段,把最久未访问的对象清理掉。
你应该已经发现了,lru 字段才占用 24 Bit,Redis 为了节省内存,没有写入全量时间戳,而是以秒为单位,只写入时间戳的低 24 位。
获取 LRU 时钟的方法是getLRUClock()

unsigned int getLRUClock(void) {/*** 毫秒时间戳/1000 & lru时钟最大值* 当前秒级时间戳 只保留低24位 16777215/3600/24 约194天*/return (mstime()/LRU_CLOCK_RESOLUTION) & LRU_CLOCK_MAX;
}

预估对象闲置时间的方法是estimateObjectIdleTime()

unsigned long long estimateObjectIdleTime(robj *o) {// 获取LRU时钟 以秒为单位的当前时间戳,只保留低24位unsigned long long lruclock = LRU_CLOCK();if (lruclock >= o->lru) {return (lruclock - o->lru) * LRU_CLOCK_RESOLUTION;} else {// 溢出了,要加上溢出值return (lruclock + (LRU_CLOCK_MAX - o->lru)) *LRU_CLOCK_RESOLUTION;}
}

为什么是“预估”呢?因为受限于 lru 的空间限制,Redis 无法获得对象真正被闲置的时间。lru 只有 24 Bit,以秒为单位,最多能表示 16777215 秒,约 194 天。一旦超过这个范围,就会发生溢出,此时就会出现这种现象:一个对象明明已经闲置 194 天了,但是 Redis 认为它刚刚才被访问过,此时的LRU淘汰策略就会出问题,好在发生这种情况的概率并不高。

refcount
refcount 代表对象的引用次数。Redis 是内存数据库,对象的存储和释放都要进行内存管理,当 refcount=0 时代表对象可以被安全的回收。
另外,Redis 为了节约资源会尽量避免创建相同对象,会提前创建一批共享对象缓存起来以实现对象复用,例如服务端的响应信息:+OK \r\nPONG\r\n等:

void createSharedObjects(void) {shared.crlf = createObject(OBJ_STRING,sdsnew("\r\n"));shared.ok = createObject(OBJ_STRING,sdsnew("+OK\r\n"));shared.emptybulk = createObject(OBJ_STRING,sdsnew("$0\r\n\r\n"));shared.czero = createObject(OBJ_STRING,sdsnew(":0\r\n"));shared.cone = createObject(OBJ_STRING,sdsnew(":1\r\n"));shared.emptyarray = createObject(OBJ_STRING,sdsnew("*0\r\n"));shared.pong = createObject(OBJ_STRING,sdsnew("+PONG\r\n"));shared.queued = createObject(OBJ_STRING,sdsnew("+QUEUED\r\n"));shared.emptyscan = createObject(OBJ_STRING,sdsnew("*2\r\n$1\r\n0\r\n*0\r\n"));shared.space = createObject(OBJ_STRING,sdsnew(" "));shared.colon = createObject(OBJ_STRING,sdsnew(":"));shared.plus = createObject(OBJ_STRING,sdsnew("+"));......
}

如果要修改一个共享对象,首先要检查 refcount 是否为0,大于0代表对象已经被引用,此时必须拷贝一个副本修改,以保证共享数据不被破坏。

ptr
ptr 是一个指针,指向 Value 的底层数据结构。根据 type 和 encoding 的不同,ptr 指向的数据结构也不相同。

http://www.laogonggong.com/news/45205.html

相关文章:

  • 佛山百度网络推广网站关键词优化wang
  • 国外免费二级域名注册网站免费推广网站地址大全
  • 气血不足做网站浑江区关键词seo排名优化
  • 永久免费建个人网站网站开发用什么软件
  • 苹果app开发语言廊坊百度快照优化哪家服务好
  • wordpress加关键字汕头网站快速优化排名
  • 网站无障碍的建设方面空缺山东建站
  • 网站建设 辉煌电商官网设计比较好看的网站
  • 网站制作导航栏怎么做百度推广网站
  • 公司微网站怎么做的最好的免费信息发布平台
  • 做网站心得湖人最新排名最新排名
  • 西安公司注册网站爱站网关键词搜索
  • 临沂网站建设吧谷歌搜索引擎免费入口
  • mysql 怎么存储wordpress深圳网站seo地址
  • discuz修改网站关键词谷歌sem推广
  • 珠海网络营销外包收费情况吉林关键词优化的方法
  • 东莞网站建设销售公司b2b十大平台排名
  • 宁波外贸网站设计公司互动营销案例100
  • 信用卡在哪些网站上做推广如何在百度发布广告
  • 企业网站开发php湖南网站推广公司
  • 民宅挂在民宿网站上 保洁谁做搜狗推广登录平台官网
  • 如何进行医药网站建设网店代运营
  • 网站定做yandere搜索引擎入口
  • 山东德州网站建设哪家最专业恶意点击软件有哪些
  • 专业做网站哪家好东莞网络优化排名
  • 网站开发与设计多少钱一个网站最新nba排名
  • 官方网站下载打印机驱动程序惠州网站制作推广
  • 建设企业网站可信度厦门百度竞价
  • 延安网站制作seo短期课程
  • 找网站建设公司哪家好买了500元黑科技引流靠谱吗