跳转到主要内容

pgmemcache

为PG提供memcached兼容接口

概览

扩展包名版本分类许可证语言
pgmemcache2.3.0SIMMITC
ID扩展名BinLibLoadCreateTrustReloc模式
9410pgmemcache否是否是否是-

PGDG packages remain absent for PG14 on EL8 aarch64.

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.3.01817161514pgmemcache-
RPMPGDG2.3.01817161514pgmemcache_$v-
DEBPGDG2.3.01817161514postgresql-$v-pgmemcache-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PGDG 2.3.0
PGDG 2.3.0
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

安装

您可以直接安装 pgmemcache 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

安装
pig install pgmemcache;          # 当前活跃 PG 版本安装
pig
pig ext install -y pgmemcache -v 18  # PG 18
pig ext install -y pgmemcache -v 17  # PG 17
pig ext install -y pgmemcache -v 16  # PG 16
pig ext install -y pgmemcache -v 15  # PG 15
pig ext install -y pgmemcache -v 14  # PG 14
dnf
dnf install -y pgmemcache_18       # PG 18
dnf install -y pgmemcache_17       # PG 17
dnf install -y pgmemcache_16       # PG 16
dnf install -y pgmemcache_15       # PG 15
dnf install -y pgmemcache_14       # PG 14
apt
apt install -y postgresql-18-pgmemcache   # PG 18
apt install -y postgresql-17-pgmemcache   # PG 17
apt install -y postgresql-16-pgmemcache   # PG 16
apt install -y postgresql-15-pgmemcache   # PG 15
apt install -y postgresql-14-pgmemcache   # PG 14

创建扩展:

CREATE EXTENSION pgmemcache;

用法

来源:

pgmemcache 提供与 memcached 服务器交互的 PostgreSQL 用户自定义函数。

启用

CREATE EXTENSION pgmemcache;

在 postgresql.conf 中配置默认服务器:

shared_preload_libraries = 'pgmemcache'
pgmemcache.default_servers = 'localhost:11211'
pgmemcache.default_behavior = 'DEAD_TIMEOUT:2'

服务器管理

SELECT memcache_server_add('localhost:11211');
SELECT memcache_server_add('cache-host');  -- uses default port 11211

设置和获取值

-- Set a key (overwrites if exists)
SELECT memcache_set('user:1:name', 'John Doe');
SELECT memcache_set('session:abc', 'data', now() + interval '1 hour');

-- Add a key (fails if exists)
SELECT memcache_add('user:2:name', 'Jane Doe');
SELECT memcache_add('temp_key', 'value', interval '5 minutes');

-- Replace (fails if key doesn't exist)
SELECT memcache_replace('user:1:name', 'John Smith');

-- Get a value
SELECT memcache_get('user:1:name');  -- returns text or NULL

-- Get multiple values
SELECT key, value FROM memcache_get_multi('{key1,key2,key3}'::text[]);

原子计数器

SELECT memcache_incr('counter');        -- increment by 1
SELECT memcache_incr('counter', 5);     -- increment by 5
SELECT memcache_decr('counter');        -- decrement by 1
SELECT memcache_decr('counter', 3);     -- decrement by 3

删除和刷新

SELECT memcache_delete('user:1:name');
SELECT memcache_flush_all();  -- flush all servers

统计信息

SELECT memcache_stats();  -- returns stats from all servers

触发器示例

表更新时失效缓存:

CREATE OR REPLACE FUNCTION auth_passwd_upd()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
    IF OLD.passwd IS DISTINCT FROM NEW.passwd THEN
        PERFORM memcache_delete('user_id_' || NEW.user_id || '_password');
    END IF;
    RETURN NEW;
END;
$$;

CREATE TRIGGER auth_passwd_upd_trg AFTER UPDATE ON passwd
    FOR EACH ROW EXECUTE PROCEDURE auth_passwd_upd();

配置与失败边界

库需要可访问的 memcached 服务,以及 libmemcached 或 OMcache。上述预加载配置需要重启 PostgreSQL。通过 memcache_server_add 添加的服务器列表属于当前后端;不使用默认配置时,应为每个新连接安排初始化。

pgmemcache.flush_on_commit 可以在提交时发送缓冲请求。启用请求缓冲后,设置类调用可能返回 NULL,因为最终结果尚未确定;这不同于 memcache_get 在键不存在时返回 NULL。缓存操作是外部副作用,数据库回滚不会撤销已经发送的修改。不要把 memcached 当作持久数据的权威副本。

memcache_flush_all() 删除所有已配置缓存服务器上的数据。应限制函数授权和网络访问,尤其是在缓存键或值包含凭证时。

这个页面对您有帮助吗?