蟑螂:排级TTL以模拟redis
#redis #cockroachdb

这个博客涵盖了什么

  • 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

TIMESTAMP / TIMESTAMPTZ

CockroachDB in-memory storage options

redis.io homepage