gpt4 book ai didi

perl - 如何使用其他数据存储实现 Redis 的功能?

转载 作者:IT王子 更新时间:2023-10-29 06:07:01 25 4
gpt4 key购买 nike

我找到了 Redis对我的项目有很好的功能(webapp 的自动完成后端)。基本上,它是我的全文搜索引擎。现在我正在寻找 Redis 的替代品,因为我无法将整个数据集保存在内存中。

我这样创建我的 Redis 存储(找不到这个想法的积分链接):

  1. 我将常规数据库中的(加权)项目分 block 为每个字符后的 3 个字符 block (“words” -> ['wor', 'ord', 'rds'] )
  2. 每个 block 都成为一个键,用于保存具有该 block 的项目 id-s 的排序列表。 ( ZADD block 权重 items_id )
  3. 每个项目 ID 也是保存一些关于项目的简单 JSON 文档的关键 (SET items_id items_hash_in_json)

搜索是这样工作的:

  1. 查询字符串以相同的方式分成 3 个字符 block
  2. 我询问所有这些 block 的交集并获取 items_id-s 的列表(ZINTERSTOREZRANGEBYSCORE 的组合)
  3. 按 items_id-s 返回 JSON 文档列表

简单明了。非常有效和快速。在这样的流程中仍然存在一些较小的缺点,但大多数情况下,我觉得我的领域拥有恰到好处的工具和正确的数据类型。

主要问题是:它需要太多的内存。我在数据库中有大约 600K 个项目,在“索引”上我在 40 个字符后将它们删除,但它仍然需要 2.5GB RAM。这对任务来说有点多。数据集会增长,不会太大也不会太快,但仍然如此。

我现在已经看过一些 NoSQL 存储,但我还没有遇到过与 Redis 类似的方法和工具。也许是因为我现在对每一项工作都看锤子,但我觉得对于其他 NoSQL 存储,我需要自己实现这样的功能(排序列表,找到它们的交集,简单的键值作为二进制字符串,插入数据非常简单,简单协议(protocol)/API 和简单客户端)。

我也想绑定(bind) Perl,但在非常简单的协议(protocol)(如 CoachDB 的 REST)的情况下,它不是强制性的。

您是否知道使用其他 NoSQL 产品来实现我的解决方案的此类工具?

另一方面,我也已经在寻找完全不同的解决方案(比如 couchdb-lucene ,但我想避免放弃上面描述的系统。

最佳答案

HTTP 缓存我有一个可能的解决方案,我目前在我的网站上使用。我使用 Nginx 缓存静态文件的自动完成查询。 Nginx 可以非常快速地提供静态文件。这是我的配置中的示例行。

http {

fastcgi_cache_path /var/cache/nginx levels=1:2
keys_zone=tt:600m
inactive=7d max_size=10g;

fastcgi_temp_path /var/cache/nginx/tmp;

}

这个 block 描述了文件将被存储的路径。 levels 是目录的深度,1:2 就足够了。我这里的区域叫tt,随便起什么名字。后跟到期时间。

location ~ /tt/(.+)\.php$ {
try_files $uri /index.php?$args;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;

#Caching parameters
fastcgi_cache tt;

fastcgi_cache_key "$scheme$request_method$host$request_uri";

fastcgi_cache_valid 200 302 304 30m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 5m;
fastcgi_cache_use_stale error timeout invalid_header updating http_500;
}

包含缓存参数的位置 block 。因此,任何具有 URI/tt/.*.php 的内容都将被缓存。 URI + 查询字符串将成为缓存键。

如果您不使用 Nginx,相同的概念可能适用于其他网络服务器。我希望这会有所帮助。

编辑

来自评论:将索引用作普通文件似乎比 SQL 查询慢得多。尽管如此,我还没有对它们进行基准测试。

Nginx 的缓存命中看起来像这样:

-> Nginx -> file

小姐:

-> Nginx -> php/python/ruby -> db(redis/mysql/whatever)

第一个路径可能看起来比较慢,因为你会想到 diskio,但事实并非如此,操作系统会自动缓存经常访问的文件。因此,当 Nginx 变热时,相比之下,只需点击您的 PHP 后端说“Hello world”就会变慢。我这样说是因为它就像提供静态文件一样。

实际命中/未命中率将取决于应用程序、数据和配置。根据我的经验,人们使用很多相同的搜索词,所以你可能不会有 60 万个文件。即使你这样做并没有真正的伤害,Nginx 会为你管理它们。如果您的数据变化很大并且您希望搜索快速反射(reflect)这些变化,则此方法不是很好。您必须设置一个较短的过期时间,这会导致更多的未命中。

Redis zip 列表/哈希 http://redis.io/topics/memory-optimization

如果您仍然需要排序集,请确保链接中的配置设置设置得足够高以满足您的数据集需求。如果您能够使用散列,则可以使用它们在该页面下方显示的算法来节省大量内存。我认为您绝对可以在存储链接到 json 字符串的 item_id 时使用它。

关于perl - 如何使用其他数据存储实现 Redis 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14613649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com