包阅导读总结
1. `Postgres`、`Redis`、`缓存`、`WAL`、`逐出策略`
2. 本文探讨了能否用 Postgres 替代 Redis 作为缓存,提到通过 UNLOGGED 表实现及相关机制,如 WAL 处理,还涉及过期和逐出策略的实现方式及复杂性。
3.
– 能否用 Postgres 替代 Redis 作为缓存
– 通过 UNLOGGED 表将 Postgres 变成缓存服务
– Postgres 中未记录表与 WAL 的关系
– 对比 Redis 的类似机制 AOF
– 数据过期实现
– 可使用存储过程实现过期,存在复杂性
– 建议用 ChatGPT 编写存储过程
– 需按计划调用存储过程,可使用扩展 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);