这个博客涵盖了什么
- cockleachdb中的行级TTL实现
- 准备的语句的示例 带有执行参数
- 用法演示说明自动删除
这不是...
redis是一种功能丰富的内存密钥/值数据库,旨在针对钥匙串进行高性能缓存和基于文本的查询。该博客并不是要替换真正的Redis用例,而是为最常用的Redis功能提供了实现,即 get , set 和到期函数。
- 没有表达方式或有条件的获得能力
- 没有使用多个键,扫描或通配符查询
- 无内存商店。数据分布在节点上,但始终为I/O使用磁盘。 有内存的选项可以为该解决方案提供好处,但此处未涵盖。在此博客的底部是指内存商店的链接,以提高性能。
实现:表定义
REDIS表必须包含3个特定的列,以促进与行级TTL相关的功能,即 key , value strong> 和 Execred_at 列。可以调整这些列的名称以满足您的申请需求,前提
create table redis_tbl (
key string primary key,
value string,
expired_at timestamptz
) with (ttl_expiration_expression = 'expired_at');
alter table redis_tbl configure zone using gc.ttlseconds = 300;
- 您可以引入其他专用列,包括索引以适应您的工作量。
- 键和值数据类型也可以量身定制以满足您的需求。 实际上,我经常使用 JSONB 数据类型用于在我的Nodejs应用中简化数据处理的值。
- expired_at 列是秒的时间戳。
- 关于 gc.ttlseconds 更改的注释。默认的cock虫垃圾收集器在25小时(90000)后去除墓碑,因此推荐的做法是通过减少此窗口来保护您的存储容量,尤其是在带有许多短寿命或搅动钥匙的工作负载下。
- 此示例将GC设置为300秒(5分钟),但应根据预期的使用进行调整,并且可以在生产环境中进行重新审视和更改。
实施:准备的语句
为方便起见,我们创建了3个准备好的语句,以提供与 set , get 和到期功能相关的核心功能。这些可以量身定制以满足您的应用需求,包括数据类型的扩展或其他参数。
prepare redis_set(string, string, integer) as upsert into redis_tbl values ($1, $2, cast(cast(now() as integer) + $3 as timestamptz));
redis_set 语句保存键/值数据,包括到期持续时间(以秒为单位)。
prepare redis_get(string) as select value from redis_tbl where key = $1 and expired_at > now();
redis_get 语句检索键识别的存储值。
prepare redis_expire(string, integer) as update redis_tbl set expired_at = cast(cast(now() as integer) + $2 as timestamptz) where key = $1;
redis_expire 语句更新了此新值的现有密钥的到期持续时间(以秒为单位)。
测试和用法:设置,获取,过期
以下是这些操作的一些基本用法。请注意,运行测试时的时间至关重要,因为这打算是实时演示。
execute redis_set('mz1', 'hello1', 10); -- entry is saved with a 10 second TTL
execute redis_get('mz1'); -- returns the 'mz1/hello1' row;
execute redis_expire('mz1', 10); -- entry is updated with a fresh 10 second TTL window
execute redis_get('mz1'); -- returns the 'mz1/hello1' row;
...等待11秒钟以观察数据库更改(自动删除/过期的行)...
execute redis_get('mz1'); -- returns 0 rows;
execute redis_expire('mz1', 10); -- this is a no-op since mz1 expired due to row-level TTL.
这种测试量并不详尽,而是证明了cockleachdb的核心行为,突出了钥匙存在时输出以及它们在过期后可以期望的。
结论
如果您已经在cockrouckdb数据库上运行,则这是一个快速扩展程序,可以模拟Redis风格的功能,而无需提供专用的Redis平台。例如,在开发需要 session&cookie&cookie 跟踪的Web应用程序期间,此技术是一种快速的附加组件,可让您证明代码并演示应用程序。当您准备好生产生产环境时,您可以提供一个真正的Redis平台,并使用它来执行全面的功能。
术语和资源
Batch Delete Expired Data with Row-Level TTL