再说Postgres中的高速缓存(cache) (4)

当打开新的表时,要把它的RelationData加人到RelCache中。该操作通过宏RelationCachelnsert来实现:首先,根据关系表OID在Hash表中找到对应的位置,调用函数hasf^search,指定査询模式为HASH_ENTER,该模式下若发现OID对应的Hash桶已存在,则返回其指针;否则创建一个新的空的hash桶,返回其指针。然后将返回的指针强制转换为RelIdCacheEnt,然后把打开表的RelationData陚值给reldesc字段。

typedef struct relidcacheent { Oid reloid; Relation reldesc; } RelIdCacheEnt; 2.2 査找Hash表

査找Hash表通过定义宏RelationldCacheLookup (ID,RELATION)来实现,调用函数hash_search,指定査询模式为HASH_FIND,若找到ID对应的RelldCacheEnt,则将其iddesc字段的值賦值给 RELATION;否则,设置RELATION为NULL。

2.3 从Hash表中删除元素

从Hash表中删除元素通过定义宏RelationCacheDelete(RELATION)来实现,调用函数hash_search,指定査询模式为HASH_REVOKE,在该模式下,若找到对应的Hash桶,则将其删除;否则
返回NULL。

Hash表实际上扮演了 RelCache索引的角色,所有对于RelCache的査找都是通过Hash表辅助进行的。

3.后续

其实楼主还想谢谢Cache信息的同步,因为Cacahe中的信息可能会变化,而Cache都是进程独立的,在一个进程中对某个Cache中的信息进行了修改,当然是应当尽可能快地反映到其他进程中。因此IPC(进程间通信)将是我下一个关注的话题,当然这个比较难,可能要憋一会儿了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppsfg.html