小编dev*_*dev的帖子

Redis CRUD 模式

我最近开始学习 Redis,目前正在构建一个使用它作为唯一数据存储的应用程序,我想与其他 Redis 用户核对我的一些结论是否正确并提出一些问题。如果相关,我正在使用 phpredis,但我想这些问题应该适用于任何语言,因为它更像是一种模式。

例如,考虑一个 CRUD 接口来保存具有以下要求的网站(名称和域):

  • 保存/验证新站点时检查现有名称/域(重复检查)
  • 列出所有带有排序和分页的网站

我最初选择了以下“架构”来保存此信息:

  • 一个关键的“前缀:website_ids”,我使用 INCR 来生成新的网站 ID
  • 一组“前缀:wslist”,其中我添加了上面生成的网站 ID
  • 每个网站“前缀:ws:ID”的哈希值,带有字段名称和网站

保存/验证问题

仅凭上述信息,我无法(据我所知)在添加新网站时检查重复的名称或域。为了解决这个问题,我做了以下工作:

  • 两组键为“prefix:wsnames”和“prefix:wsdomains”,其中我还添加了网站名称和域。

这样,在添加新网站时,我可以使用 SISMEMBER 检查提交的名称或域是否已经存在于这些集合中,并在需要时验证失败。现在,如果我用 50 个字段而不是 2 个字段保存数据,并且想要防止重复,我必须为我想要验证的每个字段创建一个类似的集合。

问题 1:以上是解决此问题的常见模式,还是人们使用其他/更好的方法来解决此类问题?

列表/排序问题

要列出网站并按名称或域(升序或降序)排序以及限制分页结果,我使用以下内容:

SORT prefix:wslist BY prefix:ws:*->name ALPHA ASC LIMIT 0 10
Run Code Online (Sandbox Code Playgroud)

这给了我 10 个按名称排序的网站 ID。现在为了获得这些结果,我选择了以下选项(php 中的示例):

选项1:

$wslist = the sort command here;
$websites = array();
foreach($wslist as $ws) {
    $websites[$ws] = $redis->hGetAll('prefix:ws:'.$ws);
}
Run Code Online (Sandbox Code Playgroud)

上面给了我一个可用的数组,以网站 id 为键和一个字段数组。不幸的是,这有一个问题,即我在循环内对 redis 执行多个请求,常识(至少来自 RDBM)告诉我这不是最佳的。更好的方法似乎是使用 redis pipelining/multi 并一次性发送所有请求:

选项 2:

$wslist = the sort …
Run Code Online (Sandbox Code Playgroud)

php nosql redis

5
推荐指数
1
解决办法
1131
查看次数

标签 统计

nosql ×1

php ×1

redis ×1