- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近开始学习 Redis,目前正在构建一个应用程序,将其用作唯一的数据存储,我想与其他 Redis 用户核实我的一些结论是否正确,并提出几个问题。如果相关的话,我正在使用 phpredis,但我想这些问题应该适用于任何语言,因为它更像是一种模式。
例如,考虑一个用于保存具有以下要求的网站(名称和域)的 CRUD 接口(interface):
我最初选择了以下“模式”来保存这些信息:
仅凭上述信息,我无法(据我所知)在添加新网站时检查重复的名称或域。为了解决这个问题,我做了以下事情:
这样,在添加新网站时,我可以使用 SISMEMBER 检查提交的名称或域是否已存在于这些集合中的任何一个中,并在需要时验证失败。现在,如果我要保存包含 50 个字段而不是 2 个字段的数据,并且想要防止重复,我必须为我想要验证的每个字段创建一个相似的集合。
问题 1: 以上是解决此问题的常见模式,还是人们使用其他/更好的方法来解决此类问题?
要列出网站并按名称或域(升序或降序)排序以及限制分页结果,我使用类似的东西:
SORT prefix:wslist BY prefix:ws:*->name ALPHA ASC LIMIT 0 10
这给了我 10 个按名称排序的网站 ID。现在为了获得这些结果,我选择了以下选项(php 中的示例):
选项 1:
$wslist = the sort command here;
$websites = array();
foreach($wslist as $ws) {
$websites[$ws] = $redis->hGetAll('prefix:ws:'.$ws);
}
上面给了我一个可用的数组,其中网站 ID 作为键和一个字段数组。不幸的是,这有一个问题,即我在一个循环内对 redis 执行多个请求,常识(至少来自 RDBM)告诉我这不是最优的。更好的方法似乎是使用 redis pipelining/multi 并一次性发送所有请求:
选项 2:
$wslist = the sort command here;
$redis->multi();
foreach($wslist as $ws) {
$redis->hGetAll('prefix:ws:'.$ws);
}
$websites = $redis->exec();
这种方法的问题是,现在我无法获得每个网站的相应 ID,除非我再次循环 $websites 数组以关联每个网站。另一种选择是可能还保存一个字段“id”,其中包含哈希本身内的相应网站 ID 以及名称和域。
问题 2/3: 无需多次循环即可在可用数组中获取这些结果的最佳方法是什么?将 ID 号也保存为散列中的一个字段是否正确或良好做法,以便我也可以从结果中获取它?
免责声明:我理解使用像 Redis 这样的键->值数据存储时的编码和模式构建范例与 RDBM 和文档存储不同,因此“X 的最佳方式”的概念是可能会有所不同,具体取决于手头的数据和应用程序。我也明白,Redis 甚至可能不是最适合在大多数 CRUD 类型的应用程序中使用的数据存储,但我仍然希望从更有经验的开发人员那里获得任何见解,因为 CRUD 接口(interface)在大多数应用程序中都很常见。
最佳答案
答案 1
您的提案看起来很常见。我不确定为什么你需要一个自动递增的 ID。我想域名必须是唯一的,或者网站名称必须是唯一的,或者至少两者的组合必须是唯一的。如果是这种情况,听起来您已经拥有一个非常好的 key ,那么为什么在不需要时发明一个整数 key 呢?
拥有域名 SET 和网站名称 SET 是快速检查特定域名或网站名称是否已存在的完美解决方案。但是,如果其中一个(域名或网站名称)是您的 key ,您甚至可能不需要这些 SET,因为您可以只查看 key prefix:ws:domain-or-ws-name-here
存在。
此外,为每个网站使用哈希,这样您就可以在其中存储网站的 50 个详细信息字段,这是完美的。这就是哈希的用途。
答案 2
首先,让我指出,如果您的网站和域名存储在 SORTED SET 中而不是 SET 中,它们将已经按字母顺序排列(假设它们被赋予相同的分数)。如果您尝试支持其他排序选项,这可能没有多大帮助,但想指出这一点。
你的方案一和方案二其实都比较合理。 Redis 快如闪电,因此选项 1 并不像乍看起来那样不合理。从 Redis 的角度来看,选项 2 显然更优,因为所有命令都将被缓冲并同时执行。但是,如您所述,如果您希望数组由 id 索引,则之后需要在 PHP 中进行额外处理。
还有第三种选择:lua 脚本。您可以让 Redis 执行一个 Lua 脚本,该脚本一次性返回所有 ID 和哈希值。但是,不再 super 熟悉 PHP 以及 redis 的多字节回复如何映射到 PHP 数组,我不能 100% 确定 lua 脚本会是什么样子。您需要查找示例或进行一些试验和错误。不过,它应该是一个非常简单的脚本。
结论
我认为 Redis 听起来是解决您问题的不错的解决方案。请记住,数据集需要始终小到足以保存在内存中。如果这不是一个真正的问题(除非你的领域很大,你应该能够将数千个网站放入只有几 MB 的空间)或者如果你不介意升级你的 RAM 来增加你的数据库,那么 Redis 是非常合适的.
熟悉 Redis 的各种持久化选项和配置,以及它们对可用性和可靠性的意义。另外,请确保您已准备好备份解决方案。我会建议同时拥有一个从主实例脱离的辅助 Redis 实例,以及一个至少每天备份您的 Redis 数据库文件的循环过程。
关于php - Redis 增删改查模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20923827/
数据库操纵基本流程为: 1、连接数据库服务器 2、选择数据库 3、执行SQL语句 4、处理结果集 5、打印操作信息 其中用到的相关函数有 •resource m
CRUD是Create(创建)、Read(读取)、Update(更新)和Delete(删除)的缩写,它是普通应用程序的缩影。如果您掌握了某框架的CRUD编写,那么意味可以使用该框架创建普通应用程序了
项目结构: 添加页面: &
本文实例讲述了android操作sqlite数据库(增、删、改、查、分页等)及listview显示数据的方法。分享给大家供大家参考,具体如下: 由于刚接触android开发,故此想把学到的基础知识
总括 pandas的索引函数主要有三种: loc 标签索引,行和列的名称 iloc 整型索引(绝对位置索引),绝对意义上的几行几列,起始索引为0 ix 是 iloc 和 loc的合体 at
1. [代码]Mybatis全局配置文件 ? 1
我是一名优秀的程序员,十分优秀!