文档章节

memcached与PostgreSQL缓存命中机制

有理想的猪
 有理想的猪
发布于 2014/11/18 11:07
字数 391
阅读 172
收藏 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函数中。


© 著作权归作者所有

共有 人打赏支持
上一篇: Linux启用bcache
下一篇: 递归与尾递归
有理想的猪
粉丝 136
博文 91
码字总数 32273
作品 0
红挢
高级程序员
私信 提问
一些非常有用的 PostgreSQL 扩展

我亲爱的朋友们,今天让我们来讨论下 PostgreSQL 以及该数据库最有用的一些扩展。 PostgreSQL 是一个关系型数据库管理系统,主要特点: 数据库支持几乎无限的大小; 强大而且可靠的事务复制机...

红薯
2012/04/23
6.6K
2
PostgreSQL 实时健康监控 大屏 - 高频指标 - 珍藏级

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

德哥
09/15
0
0
基于闪存数据库的CCF-LRU算法优化

2018.5.28 今天查看了关于flashdb中关于缓存算法的数据结构,发现了3dsim的数据结构是不一样的,然后又去看了一遍3Dsim的数据结构,发现flashdb的数据结构实际是可以优化的。下面对这个点简单...

祚儿疯
11/13
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

没有更多内容

加载失败,请刷新页面

加载更多

spring源码阅读笔记(一)

ClassPathXmlApplicationContext 与 FileSystemXmlApplicationContext 用了这么久的框架,是时候搞一下源码了,一般最初接触spring 从以下步骤开始 创建一个bean类 并创建 ooxx.xml之类的spr...

NotFound403
4分钟前
0
0
MySQL主从配置

12月14日任务 17.1 MySQL主从介绍 17.2 准备工作 17.3 配置主 17.4 配置从 17.5 测试主从同步 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单将就是A/B两个服务器做主从后,在A上写...

robertt15
7分钟前
0
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

问题终结者
19分钟前
6
0
Java 使用 gson 对 json 根据 key 键进行排序

引入Google的gson jar <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version>......

yh32
21分钟前
1
0
Vue.use源码解析

什么是Vue插件 关于什么是Vue插件大家可以去看官网的解释 ,总得来说就是提供一个全局注册/调用的能力。 怎么用 我们以Weex为例。 首先有一个toast.js const Toast = {}Toast.install = (Vu...

peakedness丶
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部