文档章节

memcached与PostgreSQL缓存命中机制

有理想的猪
 有理想的猪
发布于 2014/11/18 11:07
字数 391
阅读 169
收藏 0

memcached缓存命中机制与PostgreSQL非常相似,都是对数据缓存进行分区,根据哈希码在对应分区内匹配键值。不同的是PG分区使用常数(早先为16、9.5开始改为128,可以支持更大缓存),分区数量较少;而memcached根据线程数确定初始分区数,数量相对较大,并且有后台维护程序动态管理。

分区数量确定,在线程初始化部分,thread.c中函数thread_init:

/* Want a wide lock table, but don't waste memory */
    if (nthreads < 3) {
        power = 10;
    } else if (nthreads < 4) {
        power = 11;
    } else if (nthreads < 5) {
        power = 12;
    } else {
        /* 8192 buckets, and central locks don't scale much past 5 threads */
        power = 13;
    }

    item_lock_count = hashsize(power);
    item_lock_hashpower = power;

默认线程数为4,hashpower为12。

thread.c中的store_item函数,以键值计算哈希码:

hv = hash(ITEM_key(item), item->nkey);


items.c中的item_get函数调用  assoc中的assoc_find函数, 根据哈希码确定键值取得分区链表后,从中查找匹配的键值
while (it) {
        if ((nkey == it->nkey) && (memcmp(key, ITEM_key(it), nkey) == 0)) {
            ret = it;
            break;
        }
        it = it->h_next;
        ++depth;
    }


分区扩展机制,:

/* We are done expanding.. just wait for next invocation */
            mutex_lock(&cache_lock);
            started_expanding = false;
            pthread_cond_wait(&maintenance_cond, &cache_lock);
            /* Before doing anything, tell threads to use a global lock */
            mutex_unlock(&cache_lock);
            slabs_rebalancer_pause();
            switch_item_lock_type(ITEM_LOCK_GLOBAL);
            mutex_lock(&cache_lock);
            assoc_expand();
            mutex_unlock(&cache_lock);

这是后台维护线程的部分代码,当条目数达到临界值(hashsize(hashpower) * 3) / 2)时触发maintenance_cond条件触发在assoc.c中的assoc_start_expand函数中。


© 著作权归作者所有

共有 人打赏支持
有理想的猪
粉丝 136
博文 87
码字总数 30090
作品 0
红挢
高级程序员
PostgreSQL 实时健康监控 大屏 - 高频指标 - 珍藏级

标签 PostgreSQL , 大屏指标 , qps , long query , locks , active , idle in transaction , long idle in transaction , 2PC 背景 最关键的一些数据库健康指标,趋势监测。 1 总连接数 主要...

德哥
09/15
0
0
Postgres XL FAQ

Q. What does XL stand for? XL is short for eXtensible Lattice. It also connotes an extra large version of PostgreSQL, in this case across multiple systems. Q. Is this a “NoSQL......

javasql
2014/07/31
0
0
PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布,从那时开始,他得到了很多扩展。根据db-enginers上的排名情况,PostgreSQL目前在数据库领域排名第四。 本篇...

闻术苑
08/02
0
0
PostgreSQL DBA快速入门(二) - 高可用流复制配置

PostgreSQL DBA快速入门(二) - 高可用流复制配置 之前的文章中我们谈论了单机PostgreSQL实例的部署,有人可能会说这不是生产级别的配置,因为没有任何高可用机制呀。那么本篇文章,我们来谈谈...

闻术苑
07/31
0
0
PostgreSQL json 索引实践 - 检索(存在、包含、等值、范围等)加速

标签 PostgreSQL , json , gin , rum 背景 用户在使用JSON类型时,常见的一些JSON搜索包括: 1、存在,JSON中是否存在某个KEY,某些KEY,某些KEY的任意一个 存在某个KEY(TOP LEVEL) 存在所有...

德哥
10/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

03-《Apache Tomcat 9 User Guide》之安装

1.Introduction There are several ways to set up Tomcat for running on different platforms. The main documentation for this is a file called RUNNING.txt. We encourage you to refe......

飞鱼说编程
33分钟前
1
0
Hbase 概述及特点

1、Hbase概述 HBase是一种构建在HDFS之上的分布式、面向列的存储系统。在需要实时读写、随机访问超大规模数据集时,可以使用HBase。 尽管已经有许多数据存储和访问的策略和实现方法,但事实上...

PeakFang-BOK
59分钟前
0
0
TortoiseGit(乌龟git)保存用户名密码的方法

windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit(乌龟git) 2. GitHub for Windows github的windows版也用过一段时间,但还是不太习惯。所以目前仍然青睐与msysgit+乌龟g...

simpower
今天
3
0
Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

engeue
今天
2
0
通过ajax访问远程天气预报服务

http://www.webxml.com.cn/zh_cn/index.aspx 更改wsdl文件 打开文件将15行,51行,101行去掉 然后把文件复制到c盘 然后在桌面上面就生成了文件 将文件打成jar包 package cn.it.ws.weather;...

江戸川
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部