ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 概述 ReadySet 是一个高效的数据库加速器 - 旨在通过缓存重复查询的结果来减少对数据库的直接查询次数,从而提高查询性能和响应速度 - 并且当数据库中的数据发生变化时,ReadySet 会增量更新这些缓存 - 将应用程序直接连接到 ReadySet 代理,而无需对现有的代码进行大规模的修改 - 支持 Postgres & MySQL ## 技巧 1. 因为 reayset 的 缓存需要显示显示声明`CREATE CACHE FROM`,如果每次每个都显示声明非常的麻烦,可使用`SHOW PROXIED QUERIES;` 把支持缓存的取出来,并使用 `CRAETE CACHE FROM <query_id>` 进行缓存.这样就不影响原来的业务逻辑 ## 安装 - 支持 deb,rpm [github release](https://github.com/readysettech/readyset/releases/tag/stable-240829) - 支持 docker ## 语法 ### 查看连接情况 ``` > SHOW READYSET STATUS; name | value ----------------------------+------------------------- Database Connection | Connected Connection Count | 1 Snapshot Status | Completed Maximum Replication Offset | (0/1DD8368, 0/1DD8398) Minimum Replication Offset | (0/1DD7AA0, 0/1DD7F78) Last started Controller | 2024-09-19 02:46:23 UTC Last completed snapshot | 2024-09-19 02:47:13 UTC Last started replication | 2024-09-19 02:47:13 UTC (8 行记录) ``` ### 检查可缓存的sql ``` > SHOW PROXIED QUERIES; q_d2cb8b7dcf83f0bf | SELECT +| yes | 0 | * +| | | FROM +| | | "users" +| | | WHERE +| | | ("name" = $1) | | q_8bfb3751a18f051f | SELECT +| unsupported | 0 | DISTINCT "datlastsysoid"+| | | FROM +| | | "pg_database" | | q_e82a5a669558a4a | SELECT * FROM "users" | unsupported | 0 ``` > 通过这个指令可以找出支持缓存的sql > 已经缓存过的sql 不换显示在列表中 > 列表中可以看到 `q_d2cb8b7dcf83f0bf ` 可以缓存,则可执行`create cache from SELECT * FROM users where name='Eve';` ### 缓存查询 语法 ``` CREATE CACHE [ALWAYS] [<name>] FROM <query>; <name> 是可选的。如果缓存未命名,Readyset 会自动分配一个标识符。 <query> 是查询的全文或query idReadyset 分配给查询的唯一标识符(即),如 的输出所示SHOW PROXIED QUERIES。 [ALWAYS] 是可选的。如果缓存查询在事务内部执行(例如,由于 ORM),则使用ALWAYS针对 Readyset 运行查询;否则,查询将与事务的其余部分一起代理到上游数据库。 ``` 也可使用 query_id 进行缓存 ``` CREATE CACHE FROM <query_id>; ``` ### 查看缓存的查询 ``` > SHOW CACHES; > query id | cache name | query text | fallback behavior | count --------------------+------------+----------------------------------+-------------------+------- q_d2cb8b7dcf83f0bf | name_cache | SELECT +| fallback allowed | 0 | | "public"."users"."id", +| | | | "public"."users"."name", +| | | | "public"."users"."email", +| | | | "public"."users"."created_at" +| | | | FROM +| | | | "public"."users" +| | | | WHERE +| | | | ("public"."users"."name" = $1) | | q_d2cb8b7dcf83f0bf | name_cache | SELECT +| fallback allowed | 0 ``` ### 删除缓存的查询 ``` DROP CACHE <query id>; ``` ## ORM 支持 > [支持手册](https://readyset.io/docs/get-started/connect/connect-an-application-via-an-orm) - mysql 和 postsql 支持 `js-TypeORM`,`go-gorm`,`php-Laravel` 等 ## 示例 ### pgsql 示例 ``` docker run -p5433:5432 -e POSTGRES_PASSWORD=12345678 -d postgres:15.8-alpine ``` 1. 修改 postgres 配置文件 ,并重启 pgsql ``` vi /var/lib/postgresql/data/postgresql.conf // wal_level 改成 logical wal_level = logical ``` 2. psql 连接pgsql,并创建 demo 数据库 ``` CREATE DATABASE mock_db; ``` 3. 创建 readyset docker ``` docker run -d -p 3307:3307 -p 6034:6034 --name readyset -e UPSTREAM_DB_URL=postgresql://postgres:12345678@192.168.0.50:5433/demo -e LISTEN_ADDRESS=0.0.0.0:3307 readysettech/readyset:latest ``` 4. psql 通过 3307 端口连接数据库 ``` CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(50), email VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'), ('Bob', 'bob@example.com'), ('Charlie', 'charlie@example.com'), ('David', 'david@example.com'), ('Eve', 'eve@example.com'); ``` 5. 声明缓存 ``` > CREATE CACHE FROM SELECT * FROM users where name='Eve'; > show caches; query id | cache name | query text | fallback behavior | count --------------------+--------------------+----------------------------------+-------------------+------- q_d2cb8b7dcf83f0bf | q_d2cb8b7dcf83f0bf | SELECT +| fallback allowed | 0 | | "public"."users"."id", +| | | | "public"."users"."name", +| | | | "public"."users"."email", +| | | | "public"."users"."created_at" +| | | | FROM +| | | | "public"."users" +| | | | WHERE +| | | | ("public"."users"."name" = $1) | | ``` > 注意: 要缓存的数据需要 `CREATE CACHE FROM` 进行显示声明 > 只能缓存存在 条件的缓存