包阅导读总结
1. `Postgres`、`Redis`、`缓存`、`WAL`、`逐出策略`
2. 本文探讨了能否用 Postgres 替代 Redis 作为缓存,介绍了 Postgres 中通过未记录表及相关操作实现缓存的方法,包括处理 WAL、过期和逐出策略等,同时提及了与 Redis 机制的对比及面临的一些问题。
3.
– 能否用 Postgres 替代 Redis 作为缓存
– 可通过未记录表实现,未记录表防止特定表生成 WAL
– WAL 确保数据库更改记录,在极端情况维护数据完整性,Redis 有类似机制 AOF
– 作为缓存需关闭特定表的 WAL,否则影响性能
– 缓存数据的过期处理
– 可使用存储过程实现过期,带来一定复杂性
– 需按计划调用存储过程,可使用扩展 pg_cron 及创建调度程序
– 逐出策略
– 过期可保持存储大小,也可添加列实现 LRU 逐出策略
– Redis 提供八种现成逐出策略,Postgres 可问 ChatGPT 设其他策略
思维导图:
文章地址:https://mp.weixin.qq.com/s/i1_HUkcoCcXDdZT7xvdr0w
文章来源:mp.weixin.qq.com
作者:Raphael
发布时间:2024/7/21 18:24
语言:中文
总字数:4308字
预计阅读时间:18分钟
评分:82分
标签:数据库,缓存,Postgres,Redis,性能优化
以下为原文内容
本内容来源于用户推荐转载,旨在分享知识与观点,如有侵权请联系删除 联系邮箱 media@ilingban.com
CREATE UNLOGGED TABLE cache (
id serial PRIMARY KEY,
key text UNIQUE NOT NULL,
value jsonb,
inserted_attimestamp);
CREATE INDEX idx_cache_key ON cache (key);
CREATE OR REPLACE PROCEDURE expire_rows (retention_period INTERVAL) AS
$$
BEGIN
DELETE FROM cache
WHERE inserted_at < NOW() - retention_period;
COMMIT;
END;
$$ LANGUAGE plpgsql;
CALLexpire_rows('60minutes');
SELECT cron.schedule('0 * * * *', $$CALL expire_rows('1 hour');$$);
SELECT * FROM cron.job;
CREATE OR REPLACE PROCEDURE lru_eviction(eviction_count INTEGER) AS
$$
BEGIN
DELETE FROM cache
WHERE ctid IN (
SELECT ctid
FROM cache
ORDER BY last_read_timestamp ASC
LIMIT eviction_count
);
COMMIT;
END;
$$ LANGUAGE plpgsql;
CALL lru_eviction(10);